vi(vim) はほとんどの UNIX OS で使うことの出来るエディタです。最小構成の場合でもインストールされます。X-Window も必要ありません。つまり、どんな状態であっても使うことの出来るエディタなので、非常時にも使えます。
端末インターフェースで使えるエディタとしては、emacs もありますが、こちらはサイズが大きいので、最小構成では使えない場合が多いです。私は、emacs は環境であって、エディタ機能はその一部分でしか無いと思っているので、emacs はエディタとは考えていません。
ただ、この vi は一般的なエディタとは操作方が違うので知識がないと一文字も編集できません。
基本編
ここでは、基本的な編集方法を説明します。
モード
まず、vi には2つのモードがあります。コマンドモードとインサートモードです。起動直後はコマンドモードになっています。
コマンドモード
カーソルの移動やページの移動、検索、削除、インサートモードへの切り替えなどのコマンドを受け付けるモードです。vi を終了させるのも、このコマンドモードから終了させます。
コマンドは 1 文字がほとんどですが、行数を指定したり、複数文字のコマンドもあります。コマンドを途中でキャンセルするには、ESCキーを押します。
コマンドモードのコマンドはほとんどの場合、エコーバックされません。慣れるまでは、自分が何のキーを押したのかを常に意識してください。例外として、':'(コロン) から始まるコマンドや検索は、最下端に表示されます。
インサートモード
文字を入力するモードです。注意することは、このモードでは、カーソルの移動はできないということです(できるケースもありますが一般的ではありません)。コマンドモードへ戻る時は、ESC キーを押します。
コマンドモードでは ESC キーを押しても何も起こらない(実際はコマンドのキャンセル)ので、自分がどのモードにいるのかわからなければ、ESC キーを押せば、必ずコマンドモードになります。また、ESC キーは続けて押しても問題ないので、反応が悪いときなどに、ESC キーを連打しても大丈夫です。
起動
コマンド名 vi の後にファイル名を指定します。保存する時、対象のファイルがなければ新規にファイルを作成します。
$ vi ファイル名
起動時はコマンドモードです。すぐに文字入力はできません。文字を入力するには、必ず、インサートモードにする必要があります。
複数のファイルを編集することもできますが、混乱しないようにはじめは、一つのファイルだけ編集するようにしましょう。また、ファイル名を指定せずに起動することもできますが、保存するときにファイル名が必要になるので、起動時にファイル名は指定する様に心がけましょう。
カーソル・ページ移動
カーソル・ページの移動はコマンドモードで使えます。
カーソルの移動
カーソルの移動は、キーボードの hjkl キーで行います。カーソルキー(矢印キー)でも行なえますが、キーボードの設定が正しくなかったり、古い vi(vim) では使えなかったりしますので、hjkl で覚えたほうが安心です。
コマンド | 機能 |
---|---|
h, 左矢印, BS | カーソルを 1 文字左に移動 |
j, 下矢印, ENTER, + | カーソルを 1 行下に移動 |
k, 上矢印, - | カーソルを 1 行上に移動 |
l, 右矢印, SPACE | カーソルを 1 文字右に移動 |
左右のカーソル移動はカーソルのある行内で移動します。行頭より右や、行末より左へは移動できません。また、先頭行の上や、最下行の下へのカーソル移動もできません。
hjkl は、ページャの less や lv でも行の移動に jk キーが使われます。昔は、矢印キーが使えないこともあり、なれておくと便利でした。今はおおよそ矢印キーが使えるので、はじめは hjkl を使わなくてもいいと思います。
ページの移動
1 ページ(画面)に収まらない場合は、次のコマンドでページを移動することができます。
コマンド | 機能 |
---|---|
CTRL + d | 半ページ分下に移動する。 |
CTRL + u | 半ページ分上に移動する。 |
CTRL + f | 1 ページ分下に移動する。 |
CTRL + b | 1 ページ分上に移動する。 |
当然ですが、先頭行より上や、最下行より下には移動できません。
最下行より下の部分は、'~' が表示されます。新しいファイルを編集する時、最初の画面は '~' しかありません。
終了
終了コマンドは、ZZ(大文字 Z が 2 文字)です。何も編集していなければ、そのまま終了します。もし、元の内容から編集していれば、上書き保存して終了します。
ZZ 以外にも終了する方法には以下のようなものがあります。
コマンド | 機能 |
---|---|
:qENTER | vi を終了する。編集しているとこのコマンドでは終了できません |
:wqENTER | 上書き保存して vi を終了する。編集していない場合でも、上書き保存する |
:q!ENTER | 保存せずに vi を終了する。編集内容は破棄する |
いずれの場合でも、上書き保存の確認はありません。
コマンドがわからなくなり、パニックになったら、"ESC:q!ENTER" とすることで、元のファイルを変更せずに vi を終了させることができます。
テキストの入力
テキストを入力するには、インサートモードへ切り替え -> 文字入力 -> コマンドモードへ切り替え という手順で行います
インサートモードへの切り替え
覚えるコマンドは、i コマンドと a コマンドで十分です。その他のコマンドは使えれば便利ですが、最低限 i コマンドと a コマンドで編集できます。コマンドは次のようなものがあります。
コマンド | 機能 |
---|---|
i | 現在のカーソルの前にテキストを入力するインサートモードになる |
I | 現在のカーソル行の空白文字以外の最初の文字の前にテキストを入力するインサートモードになる |
a | 現在のカーソルの後ろにテキストを入力するインサートモードになる |
A | 現在のカーソル行の最後の文字の後ろにテキストを入力するインサートモードになる |
o | 現在のカーソル行の下に 1 行追加し、追加した行にテキストを入力するインサートモードになる |
O | 現在のカーソル行の上に 1 行追加し、追加した行にテキストを入力するインサートモードになる |
r文字 | 現在のカーソルの文字を上書きする |
R | 現在のカーソルの文字以降を上書きするインサートモードになる |
r コマンドは、 インサートモードにならず、1 文字上書きするだけです。
文字入力
文字は普通にタイプすれば入力されます。入力文字の修正はBSキーで前の文字を削除し、入力し直します。また、ENTERキーで改行して行を追加できます。
コントロールキャラクタは、CTRL + v の後に入力したいキーを押します。
インサートモードを終了してコマンドモードに戻る
ESCキーを押すだけです。
削除
削除については、文字の削除と行の削除を説明します。
文字の削除
文字の削除は、カーソル位置の文字を x コマンドで削除します。
D コマンドは、カーソル位置から行の最後までの文字を削除します。
dw コマンドは、一語削除しますが、x コマンドで 1 文字ずつ消すことも出来るので、覚えなくても困りません。
行の削除
カーソル位置の行はdd コマンドで削除できます。
検索
現在のカーソルを基準にして、下への検索は / コマンド、上への検索は ? コマンドで行います。
どちらの場合も最下端にコマンド文字が表示され、続けて検索する文字列を入力できます。ENTER を押すと検索が実行され、見つかった文字列の先頭にカーソルが移動します。
同じ文字列を続けて検索する場合は、n コマンドか N コマンドを使います。
コマンド | 機能 |
---|---|
/検索文字列ENTER | 検索文字列を後方検索する |
?検索文字列ENTER | 検索文字列を前方検索する |
n | 前回の検索と同じ検索文字列を同じ方向で検索する |
N | 前回の検索と同じ検索文字列を逆方向で検索する |
検索文字列が見つからない場合は循環して検索します。後方検索では、先頭に戻ってカーソル位置まで検索します。前方検索では、最下行に戻り、カーソル位置まで検索します。
その他
その他のコマンドで覚えておくと便利なコマンドには、次のようなコマンドがあります。
コマンド | 機能 |
---|---|
u | 直前の操作を取り消す |
U | 最後に編集した行への編集を全て取り消す |
. | 直前の操作を繰り返す |
:!外部コマンドENTER | 外部コマンドを実行する |
:r ファイル名ENTER | 指定したファイルの内容を読み込む |
vi を起動したままシェルを起動するには、":!shENTER"(bash なら、":!bashENTER")とします。exit すると vi に戻ります。
外部コマンドの実行結果をエディタ内にペーストするには、":r!外部コマンドENTER"とします。
これで一通りの編集ができると思います。もっと効率的に編集するなら、応用編 も見てください。行のコピーや移動、文字列の置き換えについて説明しています。編集に慣れたら、高度な編集 も見てください。正規表現と正規表現を使った置き換え、グローバルコマンドについて説明しています。