vi (発音は「ブイアイ」、visual display editor の略) は、SunOS の標準的なテキストエディタです。多目的型エディタである vi はウィンドウベースではないため、各種の端末上でさまざまなファイルの編集に使えます。
vi を使ってテキストの入力と編集ができますが、vi は文書処理プログラムではありません。vi は、一般の文書処理プログラムのような手軽な方法で書式付きテキストを処理できるようには設計されていません。書式付きテキストを出力する場合は、nroff、troff、ditroff などの植字エミュレーションプログラムが必要になります。テキスト中にエミュレータによって解釈されるコードを挿入することで、これらの植字プログラムを使って書式化することができます。
vi には膨大な数のコマンドがあり、そのうち機能の重複するものが相当数あります。初心者なら、最初のうちはその複雑さに圧倒されてしまうかもしれません。この章は vi の最も基本的なコマンドの概要について説明することを目的としています。vi は非常に強力なテキストエディタで、熟練するには多少の時間がかかります。
vi には、view と呼ばれる読み取り専用のバージョンがあります。view を使ってファイルを開くと、vi のコマンドは使えますが、変更内容の書き込みまたは保存はできません。view を使うと、ファイルを参照するときに誤って変更してしまう心配がありません。
次の各節では、vi の起動方法、ファイルへのテキストの入力方法、ファイルの保存 (書き込み) 方法、vi の終了方法について説明します。また、この章の練習用ファイルも作成します。
この例では、vi を起動して paint というファイルを編集します。
$ vi paint |
ファイル paint がすでに存在する場合、vi は既存のファイルを開きます。存在しない場合は、paint ファイルが作成されます。この例では、paint を新規のファイルとします。次のような vi の編集画面が表示されます。
カーソルは、画面の左上隅に表示されます。未入力の空白行は、チルド (‾) によって示されます。
vi は、ファイル名を指定せず vi と入力するだけでも起動できます。その場合は、vi を終了するときにファイル名を指定できます。
画面の最終行は状態表示行と呼ばれ、ここにはファイル名、ファイルの行数と文字数が表示されます。この例のように新しいファイルを作成した場合は、状態表示行に新規ファイルである旨 ([new file]) が表示されます。
vi には、入力モードとコマンドモードという 2 種類の操作モードがあります。入力モードは、ファイルにテキストを入力するために使います。コマンドモードは、 vi 特有の機能を実行するコマンドを入力するために使います。vi のデフォルトモードは、コマンドモードです。
vi ではユーザが現在どちらのモードにいるのか明示されないため、vi の初心者にとっては、コマンドモードと入力モードの区別がおそらく最大の混乱要因となります。ただし、早いうちから最低限の基本概念さえ覚えておけば、そのような混乱をしないですみます。
vi を使って最初にファイルを開くと、常にコマンドモードになります。ファイルにテキストを入力するには、vi の入力コマンドを 1 つ入力します。入力コマンドには、現在のカーソル位置にテキストを挿入する i (insert) 、現在のカーソル位置の後にテキストを追加する a (append) などがあります。(これらの vi 入力コマンドについては、この章の後半で詳細に説明します。)
vi のコマンドモードに戻る場合は、Esc キーを押します。現在どちらのモードにいるのか明らかでない場合は、Esc キーを押してコマンドモードにした上で作業を続けます。vi がすでにコマンドモードのときに Esc キーを押すと、警告音が鳴って画面がフラッシュしますが実害はありません。
サンプルファイルの paint にテキストを入力するには、vi の「挿入 (insert)」コマンドである i を入力します。この i コマンドにより、vi はコマンドモードから入力モードに切り替わります。(この i のように vi のコマンドのほとんどは、表示されません。)
ここで数行の短いテキストを入力し、各行の終わりで Return キーを押してみてください。入力した文字はカーソルの左側に表示され、既存の文字は右側に押し出されます。入力途中ならば、Return キーを押す前に Back Space キーで後退して再入力することによって誤りを修正できます。入力したテキストの編集については後で説明します。
paint にテキストを入力し終えたら、Esc キーを押してコマンドモードに戻ります。このとき、カーソルは入力した最後の文字に移動します。これで次の vi のコマンドを入力できる状態になります。
vi が予期しない動作をする場合は、「Caps Lock」モードになっていないか確認してください。このモードになっていると、入力した文字がすべて大文字になります。システムによっては、F1 キー (通常は Esc キーの隣にある) が Caps Lock として機能することがあります。そのため、Esc キーの代わりに F1 キーを押してしまうのはよくある誤りです。
余分なシステムメッセージを削除するためなどで、画面をクリア (再描画) するよう vi に指示しなければならない場合があります。画面をクリアするには、コマンドモードで Ctrl-L を押します。これは、OpenWindows の再表示コマンドと似ています。
vi を使ってファイルを開くと、コマンドモードになります。このモードでは、広範囲にわたって機能を実行するさまざまなコマンドを入力できます。vi の大部分のコマンドは、1 文字か 2 文字と、任意に指定できる数値からなっています。通常、コマンドには大文字と小文字のバージョンがあり、相互に関連していますが異なる機能を実行します。たとえば、小文字の a を押すとカーソルの右側にテキストを追加できますが、大文字の A を押すとその行の最後にテキストを追加できます。
vi のコマンドの大部分は、Return キーを押さなくても実行されます。ただし、コロン (:) で始まるコマンドは、最後に Return キーを押す必要があります。vi に関する説明では、コロンで始まるコマンドを 3 番目の独立したモード (最終行モード) として取り扱う場合もあります。これは、コマンドモードでコロンを入力すると、コロンとその後に入力した文字が状態表示行に表示されるためです。ただし、この章の説明では、vi の全コマンドはコマンドモードから起動されるものとします。
コロンで始まるコマンドは、ex のコマンドです。vi と ex は、異なるインタフェースを持つテキスト編集プログラムです。vi が画面指向のインタフェースであるのに対し、ex は行指向のインタフェースです。ex のコマンドは vi 内部から利用できます。コロンを入力した場合は、実際には行指向の ex インタフェースに切り換えたことになります。この機能によって、vi を終了しなくても多数のファイルを操作するコマンドを実行できます。詳細については、この章で後述の 「ex コマンドの使い方」を参照してください。
vi でファイルを編集する場合は、ファイルそのものが直接変更されるのではなく、vi が一時メモリ内に作成するファイルのコピー (バッファと呼ばれる) が変更されます。ディスク上にある恒久的なファイルのコピーは、バッファの内容を書き込んだ (保存した) ときだけ変更されます。
この方法には長所と短所があります。編集セッション中の変更内容をすべて破棄し、ディスク上のファイルに影響を与えずにファイル編集を中止することができる反面、システムがクラッシュした場合は、保存していないバッファの内容が失われてしまうことになります。特に、電話回線で接続されたリモート端末上の vi ユーザは、予期しない障害にさらされる危険があります。
特に重要な変更を行う場合などは、ファイルを頻繁に保存することをお勧めします。
同一ファイルに対して複数の vi セッションを同時に実行することはできますが、あまりお勧めできる方法ではありません。ファイルに書き込まれた変更と他の同時セッションによって上書きされた変更とを見分けることは、非常に困難です。
vi には、バッファの内容の保存と vi の終了を制御する類似の意味を持つコマンドがいくつかあります。これらのコマンドを使うと、「ファイルの保存」、「保存と終了」、「保存しないで終了」などを選択できます。
バッファの内容を保存する (バッファの内容をディスク上のファイルに書き込む) には、次のように入力して Return キーを押します。
:w |
ファイルを保存して vi を終了するには、次のように入力して Return キーを押します。
:wq |
上記の代わりに、ZZ を続けて押してもかまいません。
ZZ コマンドについては、前にコロンを入力する必要も、Return キーを押す必要もありません。
ファイルを変更していない場合は、次のように入力して Return キーを押せば vi を終了できます。
:q |
ファイルを変更した場合は、:q コマンドでは vi を終了できません。:q と入力すると、「変更後保存していません (:quit! で強制実行します)。」というメッセージが表示されます。
変更内容を保存しなくてもよい場合は、次のように入力して Return キーを押します。
:q! |
ファイルを編集して vi を終了した後は、次のコマンドを使ってファイル内容を印刷できます。
$ lp filename |
filename は、印刷する vi ファイル名です。このコマンドによってファイルはデフォルトプリンタに出力されます。ファイルは書式化されず画面上に表示されているとおり各行ごとに印刷されます。プリンタのコマンドについての詳細は、第 8 章「プリンタの使い方」を参照してください。
以降の節では、次に示すさまざまな vi のコマンドについて説明します。
ファイル内の移動
テキストの挿入
テキストの変更と置換
テキストの変更の取り消し
テキストの削除
テキストのコピーと移動
コマンドの繰り返し
前節では、ファイルの作成、保存、印刷の方法と vi の終了方法を学習しました。ファイルが作成されたので、次にファイル内を移動するために必要な概念を理解しておく必要があります。練習用ファイルを開いて、この節で説明する各コマンドを実際に試してみてください。
vi の起動時には、カーソルは vi 画面の左上隅に表示されます。コマンドモードでは、複数のキーボードコマンドを使ってカーソルを移動できます。カーソルの移動には、特定の文字キー、矢印キー、Return キー、Back Space キー (または Delete キー)、Space Bar キーが使えます。
vi の大部分のコマンドでは大文字と小文字が区別されます。そのため、「同じ」キーによるコマンドであっても、大文字と小文字とではまったく異なる結果となる場合があるので注意してください。
キーボードに矢印キーが付いている場合は、これらを使ってみてください。上下左右の矢印キーを使うと、画面内で自由自在にカーソルを移動できます。カーソルの移動ができるのは、すでに表示されているテキストまたは入力領域内に限られます。
リモート端末から vi を使う場合は、矢印キーが正しく動作しないことがあります。これは端末エミュレータの機能によって決まります。矢印キーが正しく動作しない場合は、次のような方法でカーソルを移動します。
左に移動するには、h を押します。
右に移動するには、l を押します。
下に移動するには、j を押します。
上に移動するには、k を押します。
ワード単位で右にカーソルを移動する場合は、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 行下の、最初の (空白ではない) 文字にカーソルを移動するには、Return キーを押します。
1 文字分左にカーソルを移動するには、Back Space キーを押します。
1 文字分右にカーソルを移動するには、Space Bar キーを押します。
画面の先頭行にカーソルを移動するには、H (「high」を表す) を押します。
画面の中央行にカーソルを移動するには、M (「middle」を表す) を押します。
画面の最終行にカーソルを移動するには、L (「low」を表す) を押します。
画面の最終行にカーソルがあるときに下に移動する場合、または画面の先頭行にカーソルがあるときに上に移動する場合は、テキストがスクロールアップまたはスクロールダウンされます。非常に短いファイルの場合はこのテキスト表示方法は効果的ですが、長いファイル内を移動する場合には少々手間がかかります。
ファイル内で 1 画面分または半画面分まとめて上方向や下方向にカーソルをページング、またはスクロールすることができます。(これらのコマンドを paint というファイルで試すには、ファイルが十分長くなるようにテキストを追加します。)
スクロールとページングとでは基本的に異なります。テキストのスクロールでは、カーソルを一度に行単位で上下に移動しますが、ページングではカーソルを一度に画面単位で上下に移動します。高速のシステム上では、この違いに気付かないこともありますが、リモート端末から vi を使っている場合やシステムの実行速度が通常より遅い場合は、この違いがきわめて明白になります。
1 画面先 (下方向) にカーソルを移動するには、Ctrl-F を押します (Control キーを押しながら F キーを押します)。カーソルは、新しい画面の左上隅に移動します。
半画面先 (下方向) にスクロールするには、Ctrl-D を押します。
1 画面前 (上方向) にカーソルを移動するには、Ctrl-B を押します。
半画面前 (上方向) にスクロールするには、Ctrl-U を押します。
vi にはテキストを挿入するためのコマンドが多数あります。この節では、これらのコマンドのうち最も便利なものを紹介します。これらのコマンドが実行するモードは、入力モードです。これらのコマンドを使う場合、最初はコマンドモードでなければなりません。Esc キーを押してコマンドモードであることを確認してください。
カーソルの右側にテキストを追加するには、a (append) コマンドを使います。追加したい位置の左にカーソルを移動して a を押し、追加するテキストを続けて入力してみてください。入力が終わったら Esc キーを押します。
行の末尾にテキストを追加するには、A コマンドを使います。このコマンドの動作を確認するために、追加したい行にカーソルを移動して (その行内ならカーソルはどこにあってもよい)、A を押します。カーソルは行の末尾に移動し、その位置からテキストを続けて入力できます。入力が終わったら Esc キーを押します。
カーソルの左側にテキストを挿入するには、コマンドモードで i (insert) コマンドを使います。
行の先頭にテキストを挿入するには、I を押します。このコマンドを使うと、カーソルの位置がその行の先頭 (空白ではない) 文字に移動し、そこからテキストを入力できます。テキスト入力後にコマンドモードに戻るには、この節で説明する他のコマンドと同様に Esc キーを押します。
カーソルがある行の上または下に新規の行を挿入するには、次のコマンドを使います。
カーソルがある行の下に新規の行を挿入するには、o コマンドを使います。o を入力した後にテキストを入力します。複数行にわたるようなテキストも入力することができます。入力が終わったら Esc キーを押します。
カーソルがある行の上に新規の行を挿入するには、O (o の大文字) コマンドを使います。
テキストの変更とは、テキストの一部分を別のテキストで置換することです。vi には状況に応じてテキストを変更するための方法が複数あります。(テキスト変更のコマンドを入力後、置換される部分を明らかにするために、 1 文字の場合はその文字が、テキストなどの場合はその最後の文字が、$ で表示されます。)
ワード全体を置換するには、置換するワードの先頭にカーソルを移動し、cw と続けて入力してから新しいワードを入力します。入力が終わったら Esc キーを押します。
ワードの後半部分だけを変更するには、保存する部分の右側にカーソルを移動し、cw と続けて入力してから新しいテキストを入力します。入力が終わったら Esc キーを押します。
ワードの前半部分だけを変更するには、保存する部分の先頭にカーソルを移動し、cb と続けて入力してから新しいテキストを入力します。入力が終わったら Esc キーを押します。
行全体を置換するには、変更したい行に移動して (その行内ならカーソルはどこにあってもよい)、cc と続けて入力します。すると、その行内の文字はすべて消えます (置換される部分を示す $ は表示されません)。新しいテキスト (長さは任意) の入力が終わったら Esc キーを押します。
行の一部分だけを変更するには、保存する (変更せずにそのままにしておく) 部分の右側にカーソルを移動し、C を押してから新しいテキストを入力します。入力が終わったら Esc キーを押します。これによって、C と押した時のカーソル位置からその行の末尾までの部分が新しいテキストに変更されます。
カーソルがある文字を、1 つ以上の文字からなるテキストに置換するには、s を押してから新しいテキストを入力します。コマンドモードに戻るには、Esc キーを押します。
カーソルがある文字を、別の 1 文字に置換するには、r コマンドを使います。置換する文字の上にカーソルを移動し、r を押してから 1 文字だけ入力します。この置換が終了すると、vi は自動的にコマンドモードに戻ります (Esc キーを押す必要はありません)。
vi では 2 つのキー操作だけで、前後を逆に入力してしまった文字を修正できます。たとえば the と入力するつもりで誤って teh と入力してしまったと想定します。これを修正するには、入れ替える最初の文字の上 (この場合は e) にカーソルを移動し、xp と続けて入力します。e と h の位置が入れ替わり、vi は自動的にコマンドモードに戻ります (Esc キーを押す必要はありません)。
テキストを変更しないで行を分割するには、別の行に分割する空白の位置にカーソルを移動し、r (「replace」を表す) を押した後で Return キーを押します。文字の上にカーソルを置いた状態で r を押して Return キーを押すと、その文字が改行文字で置換されてしまうので注意してください。
2 つの行を連結するには、上側の行にカーソルを移動して大文字の J を押します (J を押した後で Esc キーを押す必要はありません)。
vi でテキストを編集してファイルを変更するときは、誤った入力を取り消したいと思う場合が必ずあります。vi の u (「undo」を表す) コマンドを使うと、直前の操作を取り消した状態から編集作業を再開できます。
vi で入力を誤ったり、特定の操作を実行した後で気が変わった場合は、コマンドを実行した直後に u を押すことによってそのコマンドを取り消しできます (u を押した後で Esc キーを押す必要はありません)。もう一度 u を押すと、u コマンド自身が取り消されます。
特定の行に対する変更をすべて取り消すには、U コマンドを使います。このコマンドは、その行からカーソルを移動していない場合にだけ有効です (U を押した後で Esc キーを押す必要はありません)。
vi の削除コマンドを使って、指定した文字、ワード、行の削除ができます。削除後は、vi はコマンドモードのままなので、入力モードにするためのコマンドを入力してからテキストを挿入してください。
1 文字を削除するには、削除する文字の上にカーソルを移動して x を押します。
x コマンドは、その文字自身と、その文字が占めていたスペースも削除します。つまり、ワードの真ん中から 1 文字を削除すると、その 1 文字分のスペースも削除されて残りの文字が詰められます。x コマンドを使って行内の空白 (つまりその空白自身と、その空白が占めていたスペース) を削除することもできます。
カーソルの前方 (左側) の文字を 1 文字削除する場合は、大文字の X を押します。
ワードを 1 つ削除するには、削除するワードの先頭にカーソルを移動して dw と続けて入力します。ワードとそれが占めていたスペースが削除されます。
ワードの一部分だけを削除するには、保存する (削除せずにそのままにしておく) 部分の右にカーソルを移動して dw と続けて入力します。ワードの残りの部分とそれが占めていたスペースが削除されます。
行を削除するには、削除したい行に移動して (その行内ならカーソルはどこにあってもよい)、dd と続けて押します。その行と、その行が占めていたスペースが削除されます。
行の一部分だけを削除することもできます。
カーソルより右側の全テキストを削除するには、保存する (削除せずにそのままにしておく) 部分の右にカーソルを移動して D を押します。
カーソルより左側の全テキストを削除するには、保存する部分の先頭にカーソルを移動して d0 (d のあとにゼロ) と入力します。
カーソルがある行からファイルの最終行までの全テキストを削除するには、カーソルがある行で dG と続けて入力します。このコマンドによってカーソルがあった行も削除されます。
ファイルの先頭行から現在カーソルがある行までの全テキストを削除するには、カーソルがある行で d1G と続けて入力します。このコマンドによってカーソルがあった行も削除されます。
大部分の文書処理プログラムと同様に vi エディタでも、テキスト行の「コピー&ペースト」と「カット&ペースト」ができます。vi で「コピー&ペースト」を行う場合は、yank と put コマンドを使います。また、「カット&ペースト」の場合は、delete と put を使います。
vi で比較的短いテキストブロックのコピーや移動を行う場合は、 yank、delete、put の各コマンドを組み合わせて使います。
行をコピーするには、「yank」を表す yy (または Y) と、「put below」を表す p (または「put above」を表す P) という 2 つのコマンドが必要です。Y と yy は同じ働きをします。
1 行をバッファに取り込む (yank) には、その行の任意の位置にカーソルを移動して yy と続けて入力します。次に、取り込んだ行を挿入 (コピー) する位置の上の行にカーソルを移動して p を押します。その取り込んだ行が p と押した行の下に表示されます。
取り込んだ行をカーソルがある行の上にコピーするには、P を押します。
yy コマンドでは行数を指定できます。たとえば、バッファに 11 行を取り込むには、11yy と続けて入力します。すると、カーソルがある行から下方向に数えて 11 行目までがバッファに取り込まれ、画面の最終行にその旨を示すメッセージ「11 行をバッファにコピーしました」が表示されます。
先に説明した任意の削除コマンドの直後に p または P コマンドを使うと、削除したテキストをカーソルがある行の下の行または上の行に挿入できます。
コピーや移動 (yank、delete、put) の操作中は、カーソルの移動コマンドだけを使ってください。テキストを新しい位置に挿入する前に他のテキストをコピーしたり移動したりすると、先にコピーや移動のためにバッファに取り込んだ内容が失われてしまいます。
行の移動についても、dd (「delete」を表す) と、p (または P) という 2 つのコマンドが必要です。
行を移動するには、まずその移動したい行に移動して (その行内ならカーソルはどこにあってもよい)、dd と続けて入力します。たとえば、その行とその行から数えて 5 行目までの 5 行分を移動の対象行としたい場合は、その行で 5dd と続けて入力します。このコマンドによって、移動の対象行が削除されます。
次に、その削除した行を挿入する位置の上の行に、カーソルを移動して p を押します。その行がカーソルのあった行の下に挿入されます。
また、その削除した行をカーソルのある行の上に挿入するには、P を押します。
別個の行グループを文書内のさまざまな位置に繰り返し挿入 (コピーまたは移動) するために、それらの行を名前付きバッファに取り込むことができます。名前付きバッファを指定するには、コマンドの前に二重引用符 (") とバッファ名 (a から z までのうちの 1 文字) を付けます。たとえば、a という名前付きバッファに 4 行を取り込むには (コピーの場合)、その最初の行で "a4yy と続けて入力します。他のバッファを同時にいくつも使えるため、このコピー操作の他に、ある位置から削除したテキストを他の複数の位置に移動することもできます。たとえば、12 行を削除して b という名前付きバッファに取り込むには、"b12dd と続けて入力します。
取り込んだテキストを挿入するには、p または P コマンドの前に "n を付けます (n は名前付きバッファ)。たとえば、b というバッファに保存した行を挿入する場合は、"bp または "bP と続けて入力します。
同じ名前付きバッファに新しい行を取り込むと、元のバッファは上書きされます。名前付きバッファは、vi を終了するまで保存されたままです。
名前付きバッファを使うと、名前付きバッファに保存したテキストに影響を与えることなく、他のテキストを確実にコピーしたり移動したりできます。ただし、同じ名前付きバッファを意図的に上書きしないことが前提条件です。
ほとんどの vi のコマンドの前には、カウントと呼ばれるリピートファクタ (コマンドの前に付ける数値で、その操作を何回繰り返すかを指示する) を指定できます。
これまでの節で説明した大部分のコマンドに、カウントを指定できます。たとえば、3dd は行を削除する操作を 3 回繰り返します (したがって、カーソルがあった行も含めて 3 行が削除されます)。2dw はカーソルがあった位置のワードも含めて 2 つのワードを削除し、4x はカーソルがあった位置も含めて 4 つの文字または空白を削除します。またカウントを移動コマンドの前に付ければ、3w や 2Ctrl-F (2 を押してから、Ctrl-F を押す) のように入力してカーソルを移動できます。これらの機能については、vi コマンドを習得するにしたがって理解できるようになります。
ピリオド (.) を押すと、前回実行したテキスト編集コマンドが繰り返されます。たとえば、dd を使ってある行を削除した場合は、カーソルを別の行に移動してピリオドを押せば、その別の行を削除できます。
比較的長いテキストブロックを取り扱う場合は、yank、delete、put よりも ex コマンドを利用した方が正確で便利です。ex コマンドを使うと、画面上で行を数えたり挿入位置を目で探したりするのではなく、行範囲を指示してから挿入位置の上にくる行番号を指定することで移動またはコピーができます。(削除コマンドの場合、挿入位置の指定は必要ありません。)
行番号を表示するには、:set nu と入力して Return キーを押します。
行番号は左端に表示されます。なお、ファイルを印刷しても、これらの行番号は印刷されません。行番号が見えるのは画面上だけです。
行番号を表示させない場合は、:set nonu と入力して Return キーを押します。
:line#,line# co line# |
コンマで区切られた最初の 2 つの数値は、コピーされる行の範囲を指定します。3 番目の数値は、それを挿入する位置の上の行番号です。
たとえば、1 行目から 5 行目までをコピーしてそのブロックを 12 行目の下に挿入する場合は、次のように入力して Return キーを押します。
:1,5 co 12 |
行の範囲を指定するときに、次の省略形を使用できます。
ピリオド (.) は、「現在カーソルがある行」を意味します。
ドル記号 ($) は、「ファイルの最終行」を意味します。
たとえば、「現在カーソルがある行から 5 行目まで」の範囲をコピーしてそのブロックを 12 行目の下に挿入する場合は、次のように入力します。
:.,5 co 12 |
また、「6 行目からファイルの最終行まで」の範囲をコピーしてそのブロックを 2 行目の下に挿入する場合は、次のように入力します。
:6,$ co 2 |
ex 移動コマンドの基本形式は、上で説明したコピーコマンドの形式と似ています。
:line#,line# m line# |
行範囲と挿入位置 (行) の指定方法はコピーコマンドの場合と同様です。省略形のピリオドとドル記号も使用できます。コピーと移動の機能の違いは、移動の場合はブロックがある位置から削除されて他の位置に挿入されることです。
たとえば、1 行目から 5 行目までを 12 行目の下に移動する場合は、次のように入力して Return キーを押します。
:1,5 m 12 |
:line#,line# d |
たとえば、1 行目から 5 行目までを削除する場合は、次のように入力します。
:1,5 d |
vi には指定された文字列をファイル内で検索するための方法がいくつかあります。また、広範囲にわたった置換機能も利用できます。
文字列とは、1 つ以上の文字の配列です。文字列には、英字、数字、句読点、特殊文字、空白、タブ、改行を入れることができます。文字列は、文法的に正しいワード、ワードの一部だけのどちらでもかまいません。
文字列を検索するには、/ の後に検索する文字列を入力して Return キーを押します。カーソルがある位置から検索を始め、その文字列の先頭位置にカーソルが移動します。たとえば meta という文字列を検索する場合は、/meta と入力して Return キーを押します。
それと同じ文字列をさらに検索するには、n を押します。カーソル位置よりも前 (逆) 方向に検索するには、N を押します。
ファイル内で逆方向 (画面の上の方向) に文字列を検索する場合は、/ の代わりに ? を使います。その場合、n と N では / の時と方向が逆になります。
通常の検索では大文字と小文字が区別されます。したがって、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 で置換するには、次のように入力して Return キーを押します。
:g/disinformation/s//newspeak/g |
このコマンドで、文字列が見つかるたびに検索を中断して置換を行うかどうかを確認するメッセージを出させることもできます。次のコマンド例では、gc (「consult」を表す c を g に追加したもの) を使って、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 では複数のファイルを編集できます。たとえば、paint と orwell というファイルを交互に編集する場合は、次のようにします。
最初に paint の変更内容を保存するために、:w と入力して Return キーを押します。
orwell を編集するために、:n orwell と入力して Return キーを押します。
orwell を編集して変更内容を保存します。
orwell の編集を完了して変更内容を保存した後は、次の 3 つのどれかを選択できます。
vi を終了する − :q と入力して Return キーを押します。
paint に戻る − :n # と入力して Return キーを押します。
2 つのファイルを交互に移動する − :n # を繰り返し実行します。
:w filename (別の名前のファイルに保存) または :r filename (他のファイルを読み込む) などを編集中に使うと、:n # としても paint や orwell ではなくそのファイル filename になってしまうので注意してください。
複数のファイルを編集するには、コマンドプロンプトで vi を起動するときに、vi コマンドの後にファイル名をそれぞれスペースで区切って指定します。
$ vi paint orwell |
各ファイルは、指定された順番で表示されます。上記の例では、paint が最初に表示されます。paint の編集が終わって :n と入力すると、次のファイルの orwell の編集に移ります。現在のファイルの変更内容は保存しないで次のファイルの編集に移るには、:n の代わりに :n! と入力します。
関連したファイル名を持つ複数のファイル (例: test1、test2、test3) を編集する場合は、ワイルドカード文字を使ってそれらのファイルを指定できます。
$ vi test* |
編集の対象となるファイルが、ファイル名の数字またはアルファベットの順に表示されます。
あるファイルから別のファイルに行をコピーするには、次の手順に従います。
コピーしたい行を含むファイルを開きます。
yank コマンドを使って、コピーしたい行を名前付きバッファに保存します。
たとえば、そのファイルの 10 行分をバッファ a に保存するには、コピーしたい行のうち先頭の行にカーソルを移動して "a10Y と続けて入力します。
vi を終了せずに、別のファイル (この例では orwell) を編集します。
:n orwell |
put コマンドを使って、手順 2 で保存した行を挿入します。
たとえば、バッファ a の内容を現在カーソルがある行の下に挿入するには、そこで "ap と続けて入力します。
vi を終了すると、名前付きバッファの内容はすべて失われることに注意してください。名前付きバッファに関連する操作が完了するまで、終了 (:q) コマンドを使ってはいけません。
vi には、その動作と表示に影響を与えるパラメータが多数あります。vi の実行中に次のコマンドを入力して Return キーを押すことにより、これらのパラメータと現在の設定内容のリストを参照できます。
:set all |
システムがクラッシュしたときは、バッファの内容が危険にさらされますが、多くの場合は、以下の形式で vi を再起動することによって大部分の編集内容を回復できます。
vi -r filename |
filename は、クラッシュ時に編集していたファイル名です。通常はシステムを再起動したときに、回復可能なファイルが存在する旨のメールが送信されます。
次の表は、vi の基本コマンドの一覧です。
表 6-1 vi の基本的なコマンド
コマンド |
意味 |
---|---|
vi の起動 |
|
vi filename Return キー |
ファイルを開くまたは新規作成する |
vi Return キー |
新規ファイルを開く (ファイル名は後で指定) |
vi -r filename Return キー |
クラッシュしたファイルを回復する |
view filename Return キー |
読み取り専用でファイルを開く |
カーソル移動コマンド |
|
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 |
半画面前にスクロール |
文字と行の挿入 |
|
a string ESC キー |
カーソルの右にテキストを追加 |
A string ESC キー |
行の末尾にテキストを追加 |
i string ESC キー |
カーソルの左にテキストを追加 |
I string ESC キー |
行の先頭にテキストを挿入 |
o string ESC キー |
カーソルがある下の行にテキストを挿入 |
O string ESC キー |
カーソルがある上の行にテキストを挿入 |
テキストの変更 |
|
cw string ESC キー |
カーソルのワード (またはワードの右側の部分) を変更 |
cc string ESC キー |
行全体を変更 |
C string ESC キー |
カーソル位置から行の末尾までを変更 |
s string ESC キー |
カーソルの 1 文字をテキストに変換 |
r character |
カーソルの文字を別の 1 文字に置換 |
r Return キー |
行を分割 (空白にカーソルがある場合) |
J |
カーソルがある行とその下の行を連結 |
xp |
カーソルの文字とその右の文字を入れ替える |
‾ |
大文字を小文字に、小文字を大文字に変換 |
u |
前回の変更などのコマンドを取り消す |
U |
カーソルがある行に対する全変更を取り消す |
:u Return キー |
前回の変更などのコマンドを取り消す |
テキストの削除 |
|
x |
カーソルの文字を削除 |
X |
カーソルの左の文字を削除 |
dw |
ワード (またはワードの右側の部分) を削除 |
dd |
行を削除 |
D |
ある行のうちカーソルから右側の部分を削除 |
dG |
カーソルがある行からファイルの最終行までを削除 |
d1G |
ファイルの先頭行からカーソルがある行までを削除 |
:5,10 d Return キー |
5 行目から 10 行目までを削除 |
テキストのコピーと移動 |
|
yy |
行をコピー |
Y |
行をコピー |
p |
コピーまたは移動の対象行をカーソルがある行の下に挿入 |
P |
コピーまたは移動の対象行をカーソルがある行の上に挿入 |
:1,2 co 3 Return キー |
1 行目から 2 行目までを 3 行目の下にコピー |
:4,5 m 6 Return キー |
4 行目から 5 行目までを 6 行目の下に移動 |
行番号の設定 |
|
:set nu Return キー |
行番号を表示する |
:set nonu Return キー |
行番号を表示しない |
大文字と小文字の区別 |
|
:set ic Return キー |
検索時に大文字と小文字の区別をしない |
:set noic Return キー |
検索時に大文字と小文字を区別する |
カーソルのジャンプ |
|
G |
ファイルの最終行にジャンプ |
1G |
ファイルの先頭行にジャンプ |
21G |
21 行目にジャンプ |
検索と置換 |
|
/string Return キー |
文字列を検索 |
?string Return キー |
文字列を逆方向に検索 |
n |
検索方向の前方にある文字列を検索 |
N |
検索方向の後方にある文字列を検索 |
:g/search/s//replace/g Return キー |
文字列の検索と置換 |
画面のクリア |
|
Ctrl-L |
乱れた画面をクリア (再表示) |
編集中のファイルに対するファイルの読み込み |
|
:r filename Return キー |
カーソルがある行の下にファイルを挿入 (読み込み) |
:34 r filename Return キー |
34 行目の下にファイルを挿入 (読み込み) |
保存と終了 |
|
:w Return キー |
変更を保存 (バッファをファイルに書き込む) |
:w filename Return キー |
指定されたファイルにバッファを書き込む |
:wq Return キー |
変更を保存して vi を終了 |
ZZ |
変更を保存して vi を終了 |
:q! Return キー |
変更を保存しないで vi を終了 |