Solaris ユーザーズガイド (上級編)

第 6 章 vi エディタの使い方

vi (発音は「ブイアイ」、visual display editor の略) は、SunOS の標準的なテキストエディタです。vi はウィンドウベースではないため、各種の端末でさまざまなファイルの編集に使えます。

vi を使ってテキストの入力と編集ができますが、vi は文書処理プログラムではありません。vi は、一般の文書処理プログラムのような手軽な方法で書式付きテキストを処理できるようには設計されていません。書式付きテキストを出力する場合は、nrofftroffditroff などの植字エミュレーションプログラムが必要になります。テキスト中にエミュレータによって解釈されるコードを挿入することで、これらの植字プログラムを使って書式化することができます。

vi には多様なコマンドが使用されますが、そのうち機能の重複するものが相当あります。この章では、もっとも重要な vi コマンドの概要を述べます。vi は非常に強力なテキストエディタで、熟練するには多少時間がかかります。


注 –

vi には、view ユーティリティという読み取り専用のバージョンがあります。view を使ってファイルを開くと、vi コマンドは使えますが、変更を保存してファイルを誤って書き換えることがありません。


vi の起動

以下の各節では、vi の起動方法、ファイルへのテキストの入力方法、ファイルの保存 (書き込み) 方法、vi の終了方法について説明します。

ファイルの作成

この例では、vi を起動して paint というファイルを編集します。


$ vi paint

ファイル paint がすでに存在する場合、vi は既存のファイルを開きます。存在しない場合は、paint ファイルが作成されます。この例では、paint を新規のファイルとします。

次のような vi の編集画面が表示されます。

図 6–1 vi の編集画面

この図の後のコンテキストでは、編集画面について説明しています。

カーソルは、画面の左上隅に表示されます。未入力の空白行は、チルド (~) によって示されます。

vi は、ファイル名を指定せず vi と入力するだけでも起動できます。その場合は、vi を終了するときにファイル名を指定できます。

状態表示行

画面の最終行は状態表示行と呼ばれ、ここにはファイル名、ファイルの行数と文字数が表示されます。この例のように新しいファイルを作成した場合は、状態表示行に新規ファイルである旨 ([new file]) が表示されます。

vi の 2 種類のモード

vi には、入力モードとコマンドモードという 2 種類の操作モードがあります。入力モードは、ファイルにテキストを入力するために使います。コマンドモードは、 vi 特有の機能を実行するコマンドを入力するために使います。vi のデフォルトモードは、コマンドモードです。

vi ではユーザが現在どちらのモードにいるのか明示されないため、vi の初心者にとっては、コマンドモードと入力モードの区別がおそらく最大の混乱要因となります。ただし、早いうちから最低限の基本概念さえ覚えておけば、そのような混乱をしないですみます。

vi を使って最初にファイルを開くと、常にコマンドモードになります。ファイルにテキストを入力するには、vi の入力コマンドを 1 つ入力します。入力コマンドには、現在のカーソル位置にテキストを挿入する i (insert) 、現在のカーソル位置の後にテキストを追加する a (append) などがあります。これらの vi 入力コマンドについては、この章の後半で詳細に説明します。

vi のコマンドモードに戻る場合は、Esc キーを押します。現在どちらのモードにいるのか明らかでない場合は、Esc キーを押してコマンドモードにした上で作業を続けます。vi がすでにコマンドモードのときに Esc キーを押すと、警告音が鳴って画面がフラッシュしますが実害はありません。

入力モード

サンプルファイルの paint にテキストを入力するには、vi の「挿入 (insert)」コマンドである i を入力します。このコマンドにより、vi はコマンドモードから入力モードに切り替わります。

ここで数行の短いテキストを入力し、各行の終わりで Return キーを押してみてください。入力した文字はカーソルの左側に表示され、既存の文字は右側に押し出されます。入力途中ならば、Return キーを押す前に Back Space キーで後退して再入力することによって誤りを修正できます。vi におけるテキストの編集については、テキストの変更を参照してください。

paint にテキストを入力し終えたら、Esc キーを押してコマンドモードに戻ります。このとき、カーソルは入力した最後の文字に移動します。これで次の vi のコマンドを入力できる状態になります。

vi が予期しない動作をする場合は、「Caps Lock」モードになっていないか確認してください。このモードになっていると、入力した文字がすべて大文字になります。システムによっては、F1 キー (通常 Esc キーの隣り) が Caps Lock として機能するものがあります。そのため、Esc キーの代わりに F1 キーを押してしまうのはよくある誤りです。


注 –

余分なシステムメッセージを削除するためなどで、画面をクリア (再描画) するよう vi に指示しなければならない場合があります。画面をクリアするには、コマンドモードで Ctrl-L を押します。


コマンドモード

vi を使ってファイルを開くと、コマンドモードになります。このモードでは、広範囲にわたって機能を実行するさまざまなコマンドを入力できます。vi の大部分のコマンドは、1 文字か 2 文字と、任意に指定できる数値からなっています。通常、大文字のコマンドと小文字コマンドは関連した処理を行いますが、異なる機能を実行します。たとえば、小文字の a を押すとカーソルの右側にテキストを追加できますが、大文字の A を押すとその行の最後にテキストを追加できます。

vi のコマンドの大部分は、Return キーを押さなくても実行されます。ただし、コロン (:) で始まるコマンドは、最後に Return キーを押す必要があります。vi に関する説明では、コロンで始まるコマンドを 3 番目の独立したモード (最終行モード) として取り扱う場合もあります。これは、コマンドモードでコロンを入力すると、コロンとそのあとに入力した文字が状態表示行に表示されるためです。ただし、この章の説明では、vi の全コマンドはコマンドモードから起動されるものとします。

コロンで始まるコマンドは、ex のコマンドです。viex は、異なるインタフェースを持つテキスト編集プログラムです。vi が画面指向のインタフェースであるのに対し、ex は行指向のインタフェースです。ex のコマンドは vi 内部から利用できます。コロンを入力した場合は、実際には行指向の ex インタフェースに切り換えたことになります。この切り換えによって、vi を終了しなくても多数のファイルを操作するコマンドを実行できます。詳細については、この章で後述されている ex コマンドの使い方を参照してください。

セッションの終了

vi でファイルを編集する場合は、ファイルそのものが直接変更されるのではなく、vi が一時メモリ内に作成するファイルのコピー (バッファと呼ばれる) が変更されます。ディスク上にある恒久的なファイルのコピーは、バッファの内容を書き込んだ (保存した) ときだけ変更されます。

これには長所と短所があります。長所は、編集セッション中の変更内容をすべて破棄し、ディスク上のファイルに影響を与えずにファイル編集を中止することができるという点です。短所は、システムがクラッシュした場合は、保存していない作業バッファの内容が失われてしまうことです。特に、電話回線で接続されたリモート端末上の vi ユーザは、予期しない障害にさらされる危険があります。

特に重要な変更を行う場合などは、ファイルを頻繁に保存することをお勧めします。


注意 – 注意 –

同一ファイルに対して複数の vi セッションを同時に実行することはできますが、あまりお勧めできる方法ではありません。ファイルに書き込まれた変更とほかの同時セッションによって上書きされた変更とを見分けることは、非常に困難です。


ファイルの保存と vi の終了

vi には、バッファ内容のファイル保存と vi の終了を制御する類似の意味を持つコマンドが多数存在します。これらのコマンドを使うと、「ファイルの保存」、「保存と終了」、「保存しないで終了」などを選択できます。

保存

バッファの内容を保存する (バッファの内容をディスク上のファイルに書き込む) には、次のように入力します。


:w

Return キーを押します。

保存と終了

次のように入力して保存し、終了します。


:wq

Return キーを押します。上記の代わりに、ZZ を続けて押すこともできます。

ZZ コマンドについては、前にコロンを入力する必要も、Return キーを押す必要もありません。

保存しないで終了

ファイルを変更していない場合は、次のように入力して終了します。


:q

Return キーを押します。ファイルを変更した場合は、:q コマンドでは vi を終了できません。このコマンドを入力すると、次のメッセージが表示されます。


No write since last change (:quit! overrides)

変更内容を保存しなくてもよい場合は、次のように入力します。


:q!

Return キーを押します。

ファイルの印刷

ファイルを編集して vi を終了したあとは、次のコマンドを使ってファイル内容を印刷できます。


$ lp filename

filename は、印刷する vi ファイルの名前です。このコマンドによってファイルはデフォルトプリンタに出力されます。ファイルは書式化されず画面上に表示されているとおり各行ごとに印刷されます。プリンタのコマンドについての詳細は、第 8 章「プリンタの使い方」を参照してください。

vi の基本的なコマンド

以降の節では、次に示す、vi コマンドのさまざまな機能について説明します。

ファイル内の移動

前節では、ファイルの作成、保存、印刷の方法と vi の終了方法を学習しました。ファイルが作成されたので、次にファイル内を移動するために必要な概念を理解しておく必要があります。練習用ファイルを開いて、この節で説明する各コマンドを実際に試してみてください。

カーソルの移動

vi の起動時には、カーソルは vi 画面の左上隅に表示されます。コマンドモードでは、複数のキーボードコマンドを使ってカーソルを移動できます。カーソルの移動には、特定の文字キー、矢印キー、Return キー、Back Space キー (または Delete キー)、Space Bar キーが使えます。


注 –

vi の大部分のコマンドでは大文字と小文字が区別されます。そのため、同じキーによるコマンドであっても、大文字と小文字とでは異なる結果となる場合があるので注意してください。


矢印キーによる移動

キーボードに矢印キーが付いている場合は、これらを使ってみてください。上下左右の矢印キーを使うと、画面内で自由自在にカーソルを移動できます。カーソルの移動ができるのは、すでに表示されているテキストまたは入力領域内に限られます。

リモート端末から vi を使う場合は、矢印キーが正しく動作しないことがあります。矢印キーの動作は、端末エミュレータによって異なります。矢印キーが正しく動作しない場合は、次のような方法でカーソルを移動します。

ワード単位の移動

ワード単位で右にカーソルを移動する場合は、w (「word」を表す) を押します。(Solaris 2.5 and ... という文の場合、w を押すごとに S 2 . 5 a の順に移動します。)

ワード単位で左にカーソルを移動するには、b (「back」を表す) を押します。

いちばん近くにある区切り文字を通り越して右または左のワード (スペースで区切られているワード) の最初の文字にカーソルを移動するには、W または B を押します。(Solaris 2.5 and ... という文の場合、W を押すごとに S 2 a の順に移動します。

現在カーソルがあるワードの最後の文字にカーソルを移動するには、e (「end」を表す) を押します。

行頭または行末への移動

現在カーソルがある行の先頭に、カーソルを移動するには、^ を押します。

現在カーソルがある行の末尾に、カーソルを移動するには、$ を押します。

1 行下への移動

1 行下の、最初の (空白ではない) 文字にカーソルを移動するには、Return キーを押します。

左への移動

1 文字分左にカーソルを移動するには、Back Space キーを押します。

右への移動

1 文字分右にカーソルを移動するには、Space Bar キーを押します。

先頭行への移動

画面の先頭行にカーソルを移動するには、H (「high」を表す) を押します。

中央行への移動

画面の中央行にカーソルを移動するには、M (「middle」を表す) を押します。

最終行への移動

画面の先頭行にカーソルを移動するには、L (「low」を表す) を押します。

ページングとスクロール

画面の最終行にカーソルがあるときに下に移動する場合、または画面の先頭行にカーソルがあるときに上に移動する場合は、テキストがスクロールアップまたはスクロールダウンされます。短いファイルの場合にはこのスクロールが効果的ですが、長いファイル内を移動する場合には少々手間がかかります。

ファイル内で 1 画面分または半画面分まとめて上方向や下方向にカーソルをページング、またはスクロールすることができます。これらのコマンドを paint というファイルで試すには、ファイルが十分長くなるようにテキストを追加します。

ページングとスクロールは基本的に異なります。テキストのスクロールでは、カーソルを一度に行単位で上下に移動しますが、ページングではカーソルを一度に画面単位で上下に移動します。高速のシステム上では、この違いに気付かないこともありますが、リモート端末から vi を使っている場合やシステムの実行速度が通常より遅い場合は、この違いがきわめて明白になります。

次の 1 画面へのページング

1 画面先 (下方向) にカーソルを移動するには、Ctrl-F を押します (Control キーを押しながら F キーを押します)。カーソルは、新しい画面の左上隅に移動します。

次の半画面へのスクロール

半画面先 (下方向) にスクロールするには、Ctrl-D を押します。

前の 1 画面へのページング

1 画面前 (上方向) にカーソルを移動するには、Ctrl-B を押します。

前の半画面へのスクロール

半画面先 (下方向) にスクロールするには、Ctrl-U を押します。

テキストの挿入

vi にはテキストを挿入するためのコマンドが多数あります。この節では、これらのコマンドのうち最も便利なものを紹介します。これらのコマンドが実行するモードは、入力モードです。これらのコマンドを使う場合、最初はコマンドモードでなければなりません。Esc キーを押してコマンドモードであることを確認してください。

追加

カーソルの右側にテキストを追加するには、a (append) コマンドを使います。追加したい位置の左にカーソルを移動して a を押し、追加するテキストを続けて入力してみてください。入力が終わったら Esc キーを押します。

行の末尾にテキストを追加するには、A コマンドを使います。このコマンドの動作を確認するために、追加したい行にカーソルを移動して (その行内ならカーソルはどこにあってもよい)、A を押します。カーソルは行の末尾に移動し、その位置からテキストを続けて入力できます。入力が終わったら Esc キーを押します。

挿入

カーソルの左側にテキストを挿入するには、コマンドモードで i (insert) コマンドを使います。

行の先頭にテキストを挿入するには、I を押します。このコマンドを使うと、その行の任意の位置からカーソルが移動します。テキストを入力したあとにコマンドモードに戻るには、Esc キーを押します。

行の挿入

カーソルがある行の上または下に新規の行を挿入するには、次のコマンドを使います。

カーソルがある行の下に新規の行を挿入するには、o コマンドを使います。o を入力したあとにテキストを入力します。複数行にわたるようなテキストも入力することができます。入力が終わったら Esc キーを押します。

カーソルがある行の上に新規の行を挿入するには、O コマンド (大文字) 使います。

テキストの変更

テキストの変更とは、テキストの一部分を別のテキストで置換することです。vi には状況に応じてテキストを変更するための方法が複数あります。(テキスト変更のコマンドを入力後、置換される部分を明らかにするために、 1 文字の場合はその文字が、テキストなどの場合はその最後の文字が、$ で表示されます。

ワードの変更

ワード全体を置換するには、置換するワードの先頭にカーソルを移動し、cw と続けて入力してから新しいワードを入力します。入力が終わったら Esc キーを押します。

ワードの後半部分だけを変更するには、保存する部分の右側にカーソルを移動し、cw と続けて入力してから新しいテキストを入力します。入力が終わったら Esc キーを押します。ワードの前半部分だけを変更するには、保存する部分の先頭にカーソルを移動し、cb と続けて入力してから新しいテキストを入力します。入力が終わったら Esc キーを押します。

行の変更

行全体を置換するには、変更したい行に移動して (その行内ならカーソルはどこにあってもよい)、cc と続けて入力します。すると、その行内の文字はすべて消えます (置換される部分を示す $ は表示されません)。新しいテキスト (長さは任意) の入力が終わったら Esc キーを押します。

1 文字以上の置換

カーソルがある文字を、1 つ以上の文字からなるテキストに置換するには、s を押してから新しいテキストを入力します。コマンドモードに戻るには、Esc キーを押します。

1 文字の置換

カーソルがある文字を、別の 1 文字に置換するには、r コマンドを使います。置換する文字の上にカーソルを移動し、r を押してから 1 文字だけ入力します。この置換が終了すると、vi は自動的にコマンドモードに戻ります (Esc キーを押す必要はありません)。

変更の取り消し

vi でテキストを編集してファイルを変更するときは、誤った入力を取り消したいと思う場合が必ずあります。viu (「undo」を表す) コマンドを使うと、直前の操作を取り消した状態から編集作業を再開できます。

前回のコマンドの取り消し

vi で入力を誤ったり、特定の操作を実行したあとで気が変わった場合は、コマンドを実行した直後に u を押すことによってそのコマンドを取り消しできます (u を押したあとで Esc キーを押す必要はありません)。もう一度 u を押すと、u コマンド自身が取り消されます。

行に対する変更の取り消し

特定の行に対する変更をすべて取り消すには、U コマンドを使います。このコマンドは、その行からカーソルを移動していない場合にだけ有効です (U を押したあとで Esc キーを押す必要はありません)。

テキストの削除

vi の削除コマンドを使って、指定した文字、ワード、行の削除ができます。削除後は、vi はコマンドモードのままなので、入力モードにするためのコマンドを入力してからテキストを挿入してください。

1 文字の削除

1 文字を削除するには、削除する文字の上にカーソルを移動して x を押します。

x コマンドは、その文字自身と、その文字が占めていたスペースも削除します。つまり、ワードの真ん中から 1 文字を削除すると、その 1 文字分のスペースも削除されて残りの文字が詰められます。x コマンドを使って行内の空白 (つまりその空白自身と、その空白が占めていたスペース) を削除することもできます。

カーソルの前方 (左側) の文字を 1 文字削除する場合は、大文字の X を押します。

ワードまたはワードの一部分の削除

ワードを 1 つ削除するには、削除するワードの先頭にカーソルを移動して dw と続けて入力します。ワードとそれが占めていたスペースが削除されます。

ワードの一部分だけを削除するには、保存する (削除せずにそのままにしておく) 部分の右にカーソルを移動して dw と続けて入力します。ワードの残りの部分とそれが占めていたスペースが削除されます。

行の削除

行を削除するには、削除したい行に移動して (その行内ならカーソルはどこにあってもよい)、dd と続けて押します。その行と、その行が占めていたスペースが削除されます。

テキストのコピーと移動 — yank、delete、put

大部分の文書処理プログラムと同様に、vi エディタでも、テキスト行の「コピー&ペースト」と「カット&ペースト」ができます。vi で「コピー&ペースト」を行う場合は、yankput コマンドを使います。また、「カット&ペースト」の場合は、deleteput を使います。

vi で比較的短いテキストブロックのコピーや移動を行う場合は、 yankdeleteput の各コマンドを組み合わせて使います。

行のコピー

行をコピーするには、「yank」を表す yy (または Y) と、「put below」を表す p (または「put above」を表す P) という 2 つのコマンドが必要です。Yyy は同じ働きをします。

1 行をバッファに取り込む (yank) には、次の手順を実行します。

  1. 取り込みたい行の任意の位置にカーソルを移動させます。

  2. yy と入力します。

  3. 取り込んだ行を挿入 (コピー) する位置の上の行に移動します。

  4. p と入力します。

    その取り込んだ行が p と押した行の下に表示されます。

    取り込んだ行をカーソルがある行の上にコピーするには、P (大文字) を押します。

yy コマンドでは行数を指定できます。たとえば、バッファに 11 行を取り込むには、11yy と続けて入力します。すると、カーソルがある行から下方向に数えて 11 行目までがバッファに取り込まれ、画面の最終行にその旨を示すメッセージ 「11 行をバッファにコピーしました」が表示されます。

先に説明した任意の削除コマンドの直後に p または P コマンドを使うと、削除したテキストをカーソルがある行の下の行または上の行に挿入できます。


注意 – 注意 –

コピーや移動 (yank、delete、put) の操作中は、カーソルの移動コマンドだけを使ってください。テキストを新しい位置に挿入する前にほかのテキストをコピーしたり移動したりすると、先にコピーや移動のためにバッファに取り込んだ内容が失われてしまいます。


行の移動

行の移動についても、dd (「delete」を表す) と、p (または P) という 2 つのコマンドが必要です。

行を移動するには、まずその移動したい行に移動して (その行内ならカーソルはどこにあってもよい)、dd と続けて入力します。たとえば、その行とその行から数えて 5 行目までの 5 行分を移動の対象行としたい場合は、その行で 5dd と続けて入力します。このコマンドによって、移動の対象行が削除されます。

次に、その削除した行を挿入する位置の上の行に、カーソルを移動して p を押します。その行がカーソルのあった行の下に挿入されます。

また、その削除した行をカーソルのある行の上に挿入するには、P を押します。

カウントを使ってコマンドを繰り返す

ほとんどの vi のコマンドの前には、カウントと呼ばれるリピートファクタ (コマンドの前に付ける数値で、その操作を何回繰り返すかを指示する) を指定できます。

これまでの節で説明した大部分のコマンドに、カウントを指定できます。たとえば、3dd は行を削除する操作を 3 回繰り返します (したがって、カーソルがあった行も含めて 3 行が削除されます)。2dw はカーソルがあった位置のワードも含めて 2 つのワードを削除し、4x はカーソルがあった位置も含めて 4 つの文字または空白を削除します。またカウントを移動コマンドの前に付ければ、3w2Ctrl-F (2 を押してから、Ctrl-F を押す) のように入力してカーソルを移動できます。

ピリオド (.) を押すと、前回実行したテキスト編集コマンドが繰り返されます。たとえば、dd を使ってある行を削除した場合は、カーソルを別の行に移動してピリオドを押せば、その別の行を削除できます。

ex コマンドの使い方

比較的長いテキストブロックを取り扱う場合は、yankdeleteput よりも ex コマンドを利用した方が正確で便利です。ex コマンドを使うと、画面上で行を数えたり挿入位置を目で探したりするのではなく、行範囲を指示してから挿入位置の上にくる行番号を指定することで移動またはコピーができます。削除コマンドの場合は、挿入位置の指定は必要ありません。

行番号の表示と非表示

行番号を表示させない場合には、:set nu と入力して Return キーを押します。

行番号は左端に表示されます。なお、ファイルを印刷しても、これらの行番号は印刷されません。行番号が見えるのは画面上だけです。


1 Oh, when I die, take my saddle from the wall,

2 Put it on my pony, lead him out of the stall.

3 Tie my bones to his back, point our faces to the west,

4 And we'll ride the prairies that we love the best.

5

6 Ride around, little doggies,

7 Ride around real slow.

8 Firey and Snuffy are rarin' to go.

~

~

~

~

~

~

:set nu

行番号を表示させない場合は、:set non u と入力して Return キーを押します。

行のコピー

ex コピーコマンドの基本形式は次のとおりです。


:line#,line# co line#

コンマで区切られた最初の 2 つの数値は、コピーされる行の範囲を指定します。3 番目の数値は、それを挿入する位置の上の行番号です。

たとえば、1 行目から 5 行目までをコピーしてそのブロックを 12 行目の下に挿入する場合は、次のように入力します。


:1,5 co 12

続いて Return キーを押します。

行の範囲を指定するときに、次の省略形を使用できます。

たとえば、「現在カーソルがある行から 5 行目まで」の範囲をコピーしてそのブロックを 12 行目の下に挿入する場合は、次のように入力します。


:.,5 co 12

また、「6 行目からファイルの最終行まで」の範囲をコピーしてそのブロックを 2 行目の下に挿入する場合は、次のように入力します。


:6,$ co 2

行の移動

ex 移動コマンドの基本形式は、上記のコピーコマンドの形式と似ています。


:line#,line# m line#

行範囲と挿入位置 (行) の指定方法はコピーコマンドの場合と同様です。省略形のピリオド (.) とドル記号 ($) も使用できます。コピーと移動の機能の違いは、移動の場合はブロックがある位置から削除されてほかの位置に挿入されることです。

たとえば、1 行目から 5 行目までを 12 行目の下に移動する場合は、次のように入力します。


:1,5 m 12

続いて Return キーを押します。

行の削除

ある範囲の行を削除するには、次の形式のコマンドを使います。


:line#,line# d

たとえば、1 行目から 5 行目までを削除する場合は、次のように入力します。


:1,5 d

vi による検索と置換

vi には指定された文字列をファイル内で検索するための方法がいくつかあります。また、広範囲にわたった置換機能も利用できます。

文字列の検索

文字列とは、1 つ以上の文字の配列です。文字列には、英字、数字、句読点、特殊文字、空白、タブ、改行を入れることができます。文字列は、文法的に正しいワード、ワードの一部だけのどちらでもかまいません。

文字列を検索するには、/ の後に検索する文字列を入力して Return キーを押します。カーソルがある位置から検索を始め、その文字列の先頭位置にカーソルが移動します。たとえば meta という文字列を検索する場合は、/meta と入力して Return キーを押します。

それと同じ文字列をさらに検索するには、n を押します。カーソル位置よりも前 (逆) 方向に検索するには、N を押します。

ファイル内で逆方向 (画面の上の方向) に文字列を検索する場合は、/ の代わりに ? を使います。その場合、nN では / の時と方向が逆になります。

通常の検索では大文字と小文字が区別されます。したがって、china の検索では China は見つかりません。検索時に大文字と小文字の区別を無視させる場合は、:set ic と入力します。デフォルトの検索モードに戻すには、:set noic と入力します。

検索する文字列が見つかると、最初の出現位置にカーソルが移動します。文字列が見つからない場合は、状態表示行に「パターンが見つかりません」というメッセージが表示されます。

特殊文字 ( / & ! . ^ * $ \ ? ) は検索機能にとって特別な意味を持っているため、検索対象の文字列中で使う場合は「エスケープ」する必要があります。特殊文字をエスケープするには、その文字の前にバックスラッシュ (\) を付けます。たとえば anything? という文字列を検索する場合は、 /anything\? と入力して Return キーを押します。

これらの特殊文字は、検索機能に対するコマンドとして使えます。したがって、これらの文字を 1 つ以上含む文字列を検索する場合は、その文字の前にバックスラッシュを付ける必要があります。バックスラッシュ自身をエスケープするには、\\ と入力します。

高度な検索

次の特性を表すタグを文字列に付けることによって、さらに高度な検索ができます。

行の先頭を表すには、検索文字列の最初にキャレット (^) を付けます。たとえば、Search で始まる行を検索する場合は、次のように入力します。


/^Search

行の終わりを表すには、検索文字列の最後にドル記号 ($) を付けます。たとえば、search で終わる次の行を検索するには、次のように入力します。


/search\.$

ピリオドは、バックスラッシュでエスケープしていることに注意してください。

ワードの先頭を表すには文字列の最初に \< を付け、ワードの終わりを表すには文字列の最後に \> を付けます。したがって、文字列ではなくワードを検索する場合は、ワードの先頭を表すタグとワードの終わりを表すタグを検索パターン中で組み合わせて使います。たとえば、search というワード (文字列中にあるものは除く) の出現位置を検索するには、次のように入力します。


/\<search\>

任意の 1 文字を表すには、文字列中のその文字の位置にピリオド (.) を入力します。たとえば、disinformation または misinformation の出現位置を検索するには、次のように入力します。


/.isinformation

この検索はワードではなく文字列を対象としているため、上記の検索パターンは misinformationalist や disinformationism という構文とも一致します。

指定した文字のどれかと一致する文字を検索するには、それらの文字を括弧 [] で囲みます。たとえば、/[md]string という検索パターンは、m または d で始まる文字列を検索します。また、/[d-m]string という検索パターンは、d から m のうちの 1 文字で始まる文字列を検索します。

文字列中にアスタリスク (*) を使うと、* の直前の文字のゼロ個以上の繰り返しを表すことができます。括弧 []* を効果的に組み合わせると、検索する文字列を細かく指定できます。たとえば、次の例のように入力すると、文字列 isinformation が出現する位置、および a から z のうちの 1 文字で始まり文字列 isinformation で終わる文字列が出現する位置をすべて検索します。


/[a-z]*isinformation

文字列の置換

文字列を置換する手順は、上記で説明した検索の手順に基づいています。検索パターンを表す特殊文字はすべて、検索および置換の手順でも使えます。

置換コマンドの基本形式は次のとおりです。


:g/search-string/s//replace-string/g

続いて Return キーを押します。

たとえば、disinformation という文字列をすべて newspeak で置換するには、次のように入力します。


:g/disinformation/s//newspeak/g

続いて Return キーを押します。

このコマンドで、文字列が見つかるたびに検索を中断して置換を行うかどうかを確認するメッセージを表示させることもできます。次のコマンド例では、gc (「consult」を表す cg に追加したもの) を使って、disinformation が見つかるたびに検索を中断して置換を行うかどうかを確認するメッセージを出すよう設定しています。置換する場合は y、置換しない場合は n を入力してから Return キーを押します。


:g/disinformation/s//newspeak/gc

注 –

この応答形式の検索と置換を中断するには、Ctrl-C を押します。Ctrl-C の入力以前に y と入力されたものに関しては、置換されたままとなります。


指定行へジャンプする

編集ファイルの最終行にジャンプするには、G を押します。ファイルの先頭行に戻るには、1G と続けて押します。

行番号の数字を押した後で G と押せば、指定した行にジャンプできます。

たとえば、あるファイルの 51 行目を編集してから vi を終了したとします。その後、 51 行目からまた編集したい場合は、vi でそのファイルを開いてから 51G と続けて押してください。その 51 行目にカーソルが移動し、その行から編集を始めることができます。

編集中のファイルに別ファイルを読み込む

vi では、編集中のファイルに別のファイルを簡単に「読み込む」(挿入する) ことができます。コマンドの一般的な形式は次のとおりです。


: line# r filename

行番号 line# を指定しない場合 (:r filename) は、カーソルがある行の下にファイル filename が読み込まれます。

たとえば、orwell というファイルをあるファイルの 84 行目の下に挿入したい場合は、次のように入力します。


:84 r orwell

または、84 行目にカーソルを移動 (84G と続けて入力) してから、次のように入力することもできます。


:r orwell

複数のファイルの編集

vi では複数のファイルを編集できます。たとえば、paintorwell というファイルを交互に編集する場合は、次のようにします。

  1. 最初に paint の変更内容を保存するために、:w と入力して Return キーを押します。

  2. orwell を編集するために、:n orwell と入力して Return キーを押します。

  3. orwell を編集して変更内容を保存します。

  4. orwell の編集を完了して変更内容を保存したあとは、次の 3 つのどれかを選択できます。

    • vi を終了する - :q と入力して Return キーを押します。

    • paint に戻る - :n # と入力して Return キーを押します。

    • 2 つのファイルを交互に移動する - :n # を繰り返し実行します。


      注意 – 注意 –

      :w filename (別の名前のファイルに保存) または :r filename (ほかのファイルを読み込む) などを編集中に使うと、:n # としても paintorwell ではなくそのファイル filename になってしまうので注意してください。


vi の基本コマンドの一覧

次の表は、vi コマンドの基本コマンドの一覧です。

表 6–1 vi の起動

コマンド名 

説明 

vi filename

ファイルを開くまたは新規作成する 

vi Return キー

新規ファイルを開く (ファイル名は後で指定) 

vi -r filename

システムクラッシュ時のファイルを復元して開く 

view filename

読み取り専用でファイルを開く

表 6–2 カーソル移動コマンド

コマンド名 

説明 

h

左に移動 

j

下の行の先頭文字 (空白ではない) に移動 

k

上に移動 

l

右に移動 

w

ワード単位で右に移動 

W

(スペースで区切られた) ワード単位で右に移動 

b

ワード単位で左に移動 

B

(スペースで区切られた) ワード単位で左に移動 

e

現ワードの最後の文字に移動 

Return キー 

下の行の先頭文字 (空白ではない) に移動 

Back Space キー 

左に移動 

Space Bar キー 

右に移動 

H

画面の先頭行に移動 

M

画面の中央行に移動 

L

画面の最後行に移動 

Ctrl-F 

1 画面先のページを表示 

Ctrl-D 

半画面先にスクロール 

Ctrl-B 

1 画面前のページを表示 

Ctrl-U 

半画面前にスクロール 

表 6–3 文字と行の挿入

コマンド名 

説明 

a

カーソルの右にテキストを追加 

A

行の末尾にテキストを追加 

i

カーソルの左にテキストを追加 

I

行の先頭にテキストを挿入 

o

カーソルがある下の行にテキストを挿入 

O

カーソルがある上の行にテキストを挿入 

表 6–4 テキストの変更

コマンド名 

説明 

cw

カーソルのワード (またはワードの右側の部分) を変更 

cc

行全体を変更 

C

カーソル位置から行の末尾までを変更 

s

カーソルの 1 文字をテキストに変換 

r

カーソルの文字を別の 1 文字に置換 

J

カーソルがある行とその下の行を連結 

xp

カーソルの文字とその右の文字を入れ替える 

~

大文字または小文字に変える

u

前回の変更などのコマンドを取り消す 

U

カーソルがある行に対する全変更を取り消す 

前回の変更などのコマンドを取り消す 

表 6–5 テキストの削除

コマンド名 

説明 

x

カーソルの文字を削除 

X

カーソルの左の文字を削除 

dw

ワード (またはワードの右側の部分) を削除 

dd

行を削除 

D

ある行のうちカーソルから右側の部分を削除 

dG

カーソルがある行からファイルの最終行までを削除 

d1G

ファイルの先頭行からカーソルがある行までを削除 

:5,10 d

5 行目から 10 行目までを削除 

表 6–6 テキストのコピーと移動

コマンド名 

説明 

yy

行をコピー 

Y

行をコピー 

p (小文字)

コピーまたは移動の対象行をカーソルがある行の下に挿入 

P (大文字)

コピーまたは移動の対象行をカーソルがある行の上に挿入 

:1,2 co 3 Return キー

1 行目から 2 行目までを 3 行目の下にコピー 

:4,5 m 6 Return キー

4 行目から 5 行目までを 6 行目の下に移動 

表 6–7 行番号の設定

コマンド名 

説明 

:set nu Return キー

行番号を表示する 

:set nonu Return キー

行番号を表示しない 

表 6–8 大文字と小文字の区別

コマンド名 

説明 

:set ic Return キー

検索時に大文字と小文字の区別をしない 

:set noic Return キー

検索時に大文字と小文字を区別する 

表 6–9 カーソルのジャンプ

コマンド名 

説明 

G

ファイルの最終行にジャンプ 

1G

ファイルの先頭行にジャンプ 

21G

21 行目にジャンプ 

表 6–10 検索と置換

コマンド名 

説明 

/string

文字列を検索 

?string

文字列を逆方向に検索 

n

検索方向の前方にある文字列を検索 

N

検索方向の後方にある文字列を検索 

:g/search/s//replace/g Return キー

文字列の検索と置換 

表 6–11 画面のクリア

コマンド名 

説明 

Ctrl-L 

乱れた画面をクリア (再表示) 

表 6–12 編集中のファイルに対するファイルの読み込み

コマンド名 

説明 

:r filename Return キー

カーソルがある行の下にファイルを挿入 (読み込み) 

:34 r filename Return キー

34 行目の下にファイルを挿入 (読み込み) 

表 6–13 保存と終了

コマンド名 

説明 

:w Return キー

変更を保存 (バッファをファイルに書き込む) 

:w filename Return キー

指定されたファイルにバッファーを書き込む 

:wq Return キー

変更を保存して vi を終了

ZZ

変更を保存して vi を終了

:q! Return キー

変更を保存しないで vi を終了