viには入力モードとコマンドモードの二つがあり、それぞれのモードを行き来してテキストを編集します。
viを使い始めの当初は、このモード概念が理解しにくく、viはとっつきにくいと言われています。
viの各種編集コマンドを実行するモードです。
カーソルの移動や画面のスクロール、カット&ペーストなどお編集コマンドの実行、編集内容の保存、
入力モードに移行するコマンドなどは、コマンドモードから実行します。
viを起動した直後は、このコマンドモードになっています。
文字の入力を行うモードです。
コマンドモードではキー入力はテキストとして入力されず、編集コマンドとして解釈されますが、
入力モードではキー入力した内容はそのままテキストとして画面上に入力されます。
コマンドモードから入力モードへは、入力モードに移るいくつかのコマンド(i,aなど)を入力して、移行します。
入力モードからコマンドモードに移行するには、「ESC」キーを押します。
すでにコマンドモードになっているときに「ESC」キーを押すと、ビープ音が鳴って
コマンドモードのままモードは替わりません。
どちらのモードになっているかわからず混乱してしまった場合、とにかく「ESC」キーを押せばコマンドモードに戻れます
vi [オプション] [ファイル名]
+ コマンド ファイルを開くと共に、指定したviコマンドを実行する。 -c コマンド +コマンドと同じ -R ファイルを読み込み専用モードで開く -r 編集途中で保存されずに破棄された内容を復旧する
a 入力移行し、タイプした内容をカーソル位置の直後に入力 i 入力移行し、タイプした内容をカーソル位置の直前に入力 A 入力移行し、タイプした内容をカーソル行の行末に入力 I 入力移行し、タイプした内容をカーソル行の行頭に入力 o 入力移行し、タイプした内容をカーソル行の次の行に入力 O 入力移行し、タイプした内容をカーソル行の前の行に入力
ESC 入力モードを終了し、コマンドモードに戻る
:q ファイルへの書き込みを行わずにviを終了 :q! 編集中の内容を破棄してviを終了 :wq 編集中の内容をファイルに書き込んでviを終了 ZZ 編集中の内容をファイルに書き込んでviを終了
:w 編集中の内容をファイルに書き込む :e! 編集中の内容を破棄し、直前に保存した内容に戻す。 :n 複数のファイルを開いている場合、現在編集中のファイルを閉じ、次のファイルを編集する。 :n ファイル名 現在編集中のファイルを閉じ、ファイル名で指定さえれたファイルの内容を編集する。 :r ファイル名 ファイル名で指定されたファイルの内容を、カーソルの行の次の行以降に読み込む :r! コマンド 指定されたコマンドを実行し、その実行結果をカーソルの次の行以降に読み込む。
▼文字単位の移動 l 1文字右に移動する h 1文字左に移動する k 1文字上に移動する j 1文字下に移動する ▼単語単位の移動 w 次の単語の先頭に移動する b 前の単語の先頭に移動する e 現在カーソルがある単語の終わりに移動する W 空白で区切られた次の単語の先頭に移動する B 空白で区切られた前の単語の先頭に移動する ▼その他カーソル移動 O 行頭に移動する $ 行末に移動する H 画面に表示されているページの1行目に移動する L 画面に表示されているページの最下行に移動する M 画面に表示されているページの中央の行に移動する [Ctrl]+y 1行前にスクロールする [Ctrl]+e 1行後にスクロールする [Ctrl]+u 半ページ前にスクロールする [Ctrl]+d 半ページ後にスクロールする [Ctrl]+b 1ページ前にスクロールする [Ctrl]+f 1ページ後にスクロールする 1G ファイルの行目に移動する G ファイルの最後の行に移動する
▼文字・行削除 x カーソル位置の1文字を削除する X カーソル位置の前の1文字を削除する dw カーソル位置から次の単語までを削除する d$ カーソル位置からその行の最後までを削除する d0 カーソル位置からその行の先頭までを削除する dd カーソルのある行を削除する ▼コピー yy カーソルのある行をコピーする yw カーソル位置から次の単語までをコピーする y$ カーソル位置からその行の最後までをコピーする y0 カーソル位置からその行の先頭までをコピーする ▼ペースト p カーソル位置の後ろにコピーバッファの内容をペーストする P カーソル位置の前にコピーバッファの内容をペーストする
u 直前の操作を取り消すことができる . 直前の操作を繰り返し
コロン(:)を押して上を押すと、前回までのコマンド履歴が出る。
同じコマンドを実行したい、前回のコマンドをちょっと変更して実行したいなどの時に便利です。
viでは多くのコマンドで数の指定ができ、コマンドを実行するのにタイプ量を大幅に減らすことができます。
▼例 10L 10文字分カーソルを右に移動 3d 3単語前に移動 9dd 9行削除する 8yy 8行コピーする 5H 画面上から5行目に移動 2G ファイルの先頭から2行目に移動
検索(同一行) | 操作 | 結果 |
f 文字 | 文字 を検索(右方向へ) | |
F 文字 | 文字 を検索(左方向へ) | |
; | 次の検索 | |
検索(ファイル全体) | /キーワード | キーワードを検索(下方向へ) |
?キーワード | キーワードを検索(上方向へ) | |
n | 次の検索 | |
N | 前の検索 | |
置換 | :s/文字列A/文字列B/ | 文字列Aを文字列Bに置換 |
(カーソルのある行で、最初に合致するパターンのみ置換) | ||
:s/文字列A/文字列B/g | 文字列Aを文字列Bに置換 | |
(カーソルのある行で、合致するパターン全てを置換) | ||
:s/文字列A/文字列B/c | 文字列Aを文字列Bに置換 | |
(カーソルのある行で、最初に合致するパターンのみ置換 | ||
(置換前に確認:yで置換、nで置換なし) | ||
:%s/文字列A/文字列B/g | 文字列Aを文字列Bに置換 | |
(全ての行で、合致するパターン全てを置換) | ||
:10,50s/文字列A/文字列B/g | 文字列Aを文字列Bに置換 | |
(10行目から50行目までの間で、合致するパターン全てを置換) | ||
:10,$s/文字列A/文字列B/g | 文字列Aを文字列Bに置換 | |
(10行目から最終行までの間で、合致するパターン全てを置換) |
:sh[ENTER]で一時的にシェルに戻れます。再度viに戻るときはexitコマンドを使います。
.(ピリオド)を押す。同じ文字列を何回も挿入するような場合に便利です。