1. 起動と終了

■ 起動
vi [file1 file2 ... fileN file1からfileNを編集対象としてviを起動する。まずfile1が表示される.
vi +[n] file filen行目からviを起動。nを省略:最終行。
vi +/str file file中のstrを含む行にカーソルを移動してviを起動。strが見つからない場合は最終行から。
vi -r file システムの異常終了などで破壊されたfileを復旧するためにviを起動する。
■ 中断・終了
ZZデータを変更した場合は、ファイルに保存して終了、変更がなければ上書きせずに終了。
:wq データをファイルに保存して終了。
:qvi 終了。データを変更した場合は、ファイルに保存しておかないと実行されない。保存せずに終了する場合には、!をつける。
:q! データ変更内容を保存しないで終了。

2. ファイル操作

■ ファイル切り替え
:n[!] 編集対象を次のファイルに切り替える。データを変更した場合は、データをファイルに保存しない
と実行されない。保存せずに実行する場合は ! をつける。
:rew[!] 複数ファイルを編集中、file1に戻る。
:e[!] file  編集対象をfileに変更する。
:e#[!]編集対象を直前のファイルに変更する。
■ ファイルへの書き込み
:w [file]編集中のデータをfileに保存する。fileを省略した場合は、vi起動時に指定したファイルに保存する。
:m[,n]w[!] file編集中のデータのm行目(からn行目まで)をfileに保存する。fileがvi起動時に指定した名前とは異なり、かつ、既に存在する場合には ! が必要。
:m[,n]w >> [file編集中のデータのm行目(からn行目まで)をfileの末尾に追加する。file を省略すると現在編集中のファイルに追加。
■ ファイルの読み込み
:[n]r file n行目の下にfileを読み込む。n省略時はカーソル行の下に読み込む。 読み込み範囲は指定できない。
バッファが空白の場合 :0r file で空白行が挿入されない。
:-[n]r filen行目の上にfileを読み込む。nを省略するとカーソル行の上に読み込む。
:[n]r!UNIXコマンド UNIXコマンドの実行結果をn行目の下に読み込む。nを省略するとカーソル行の下に読みこむ。
:-[n]r!UNIXコマンド UNIXコマンドの実行結果をn行目の上に読み込む。nを省略するとカーソル行の上に読み込む。

3. テキスト入力

■ 入力コマンド ESC を押すとどのモードにいても必ずコマンドモードになる。)
istrESCカーソルの左側にstrを入力する。
astrESCカーソルの右側にstrを入力する。
IstrESC現在行の先頭にstrを入力する。
AstrESC現在行の末尾にstrを入力する。
ostrESC現在行と次行の間に新しいstr行を挿入する。
OstrESC現在行と前行の間に新しい行strを挿入する。
[n]>> Ret 現在行を含むn行の先頭にtabを挿入する。tab幅はshiftwidthで指定。
■ 置換コマンド
cカーソル移動コマンドstrESC カーソル位置から カーソル移動コマンドで指定した位置までの文字をstr に置き換える。
cw カーソル位置から単語の終わりまでを置き換える
c$ カーソル位置から行末までを置き換える
SstrESCカーソル行の内容をすべてstrに置き換える。
CstrESCカーソル位置から行末までをstrに置き換える。
rcharESCカーソル位置の1文字をcharに置き換える。
RstrESCカーソル位置から行末に向かってstrで上書きする。
sstrESCカーソル位置の1文字をstrに置き換える。
~ (tilde)カーソル位置の英大・英小文字の変換を行い、次の字に進む。
:s/str1/str2/ 現在行の最初の str1str2 に置き換える.
:s/str1/str2/n 現在行のn番目の str1str2 に置き換える.
:s/str1/str2/g 現在行の全ての str1str2 に置き換える.
:g/str1/s//str2ファイルの中で str1 を探して str2 に置き換える

4. カーソル移動

■ 文字・行単位の移動
[n]Ret カーソルをn行下の先頭に移動する。nを省略すると1行移動する。
[n]k/j/h/l カーソルをn文字上/下/左/右に移動する。nを省略すると1文字移動する。
-カーソルを前の行の先頭の文字に移動する。
e現在カーソルがある単語の末尾に移動する。カーソル位置が単語の末尾にある場合は、次の単語の末尾に移動する。句読点は別の単語として見なされる。
Eeと同じ移動をするが、空白・タブ・改行を単語の区切りとし、句読点は単語の一部として見なされる。
w現在カーソルがある位置から次の単語の先頭もしくは句読点に移動する。
Wwと同じ移動をするが、句読点は単語の一部として見なされる。
b 現在カーソルがある単語か、直前の単語の先頭、または直前の句読点に移動する。
Bbと同じ移動をするが、句読点は単語の一部として見なされる。
[n]G編集中のテキストのn行目に移動する。nを省略すると最終行に移動する。
n| (bar) 現在カーソルがある行のnカラム目の文字に移動する。
^ (hat) 現在カーソルがある行の先頭に移動する。
$現在カーソルがある行の末尾に移動する。
%現在カーソルがある括弧に対応する括弧に移動する。
)現在カーソルがある直後のセンテンスの先頭へ移動する。センテンスは改行文字、または2つ以上の空白文字で区切られた文字列のこと。
(現在カーソルがあるセンテンスもしくは直前のセンテンスの先頭に移動する。
Ctrl-d 現在行の先頭に向かってカーソルをタブ1つ分移動する。テキスト入力モードで使用する。(タブはオプションshiftwidthで値を変更できる)
Ctrl-t現在行の末尾に向かってカーソルをタブ1つ分移動する。テキスト入力モードで使用する。(タブはオプションshiftwidthで値を変更できる)
■ 画面スクロール
H M L 画面内の一番上 中央 一番下の行に移動。
Ctrl-d Ctrl-u ファイルの末尾/先頭に向かって半画面ずつスクロール。
Ctrl-e Ctrl-y ファイルの末尾/先頭に向かって1行ずつスクロール。
Ctrl-b Ctrl-f 前/次画面を表示。
zt または zRet  zz または z.  zb または z-  カーソル行がページの最上 中央 最下にくるようにスクロール
■ ウインドウ制御
Ctrl-ws Ctrl-wv 画面横割り。 画面縦割り。
Ctrl-wo Ctrl-wqウインドウを一つに戻す。現在のウインドウを消す。
:new [file]Ret 新しいウインドウを開きfileの編集を始める。
Ctrl-wk  Ctrl-wj  Ctrl-wh  Ctrl-wl 上 下 左 右のウインドウにカーソルを移動。
Ctrl-wK  Ctrl-wJ  Ctrl-wH  Ctrl-wL ウインドウを上 下 左 右に移動し、目一杯に広げる。
Ctrl-w+  Ctrl-w-  Ctrl-w=各ウインドウの行数を増やす 減らす そろえる。
:spRet :vsRet画面横割り。 画面縦割り。
■ 検索
/strRet テキストの末尾に向かってstrを検索し、最初に見つかった文字列の上にカーソルを移動する。
?strRet テキストの先頭に向かってstrを検索し、最初に見つかった文字列の上にカーソルを移動する。
n または N  直前の /  ? を同方向 逆方向に繰り返す
fchar現在行にあるcharを行末方向に向かって検索し、文字上にカーソルを移動する。
Fchar現在行にあるcharを行頭方向に向かって検索し、文字上にカーソルを移動する。
tchar現在行にあるcharを行末方向に向かって検索し、その直前の文字上にカーソルを移動する。
Tchar現在行にあるcharを行頭方向に向かって検索し、その直後の文字上にカーソルを移動する。
 ;(semicolon) 直前の f/F/t/T を同方向に繰り返す。
 ,(comma) 直前の f/F/t/T を逆方向に繰り返す
■ マーク
mchar 現在カーソルのある位置にchar ([a-zA-Z] の1文字)でマークする。
`char (reverse quote) マーク位置上にカーソルを移動する。
'char (single quote) マーク文字のある行の先頭非空白文字上に移動する。
:marksRet  マーク一覧

5. 削除と複写

■ 削除(=移動データの切り取り) 間違えて消したくない行や単語を消してしまったら、u コマンドを入力する。
[n]xカーソル位置から行末に向かってn文字を削除。n省略時は1文字。
[n]Xカーソルの直前の文字から行頭に向かってn文字を削除。n省略時は1文字。
dカーソル移動コマンド カーソル位置からカーソル移動コマンドで指定した位置までの文字を削除する。例えば
dw カーソル位置から単語の終わりまで削除
[n]ddカーソル行から下にn行削除する。nを省略すると、カーソルのある行を削除する。
Dカーソル位置から行末までの文字を削除する。
"char 削除コマンド削除コマンド文字列や行を削除し、バッファchar (a~z中の1文字)に格納する。
例  "sdw カーソル位置から単語の終わりまでの文字を削除してバッファ s に格納。
[n]<< / [n]>> カーソル行から下にn行分の先頭のタブを1つを削除/追加する。タブはオプションshiftwidthで値を変更できる。
:L,MdL行目からM行目までを削除する。
■ 複写元データの指定(バッファへのコピー)
[n]yy または [n]Yカーソル行から下にn行を無名バッファにコピー。nを省略すると現在行のみコピー。
yカーソル移動コマンド カーソル位置からカーソル移動コマンドで指定した位置までの内容を無名バッファにコピーする。
例 yw  カーソル位置から単語の終わりまで格納
例 y$  カーソル位置から行末まで格納
"名前 複写コマンド名前つきバッファ([a-zA-Z]の1文字)に、複写コマンドを実行した結果を格納する。
例 "a4y  名前付きバッファaにカーソル位置から右に4文字分を格納
■ 移動・複写先へのデータの取り出し  
p無名バッファの内容をカーソル行の下、もしくはカーソル位置の右に挿入する。
P無名バッファの内容をカーソル行の上、もしくはカーソル位置の左に挿入する。
"np または、"nPn番目(nは、1から9まで)の番号つきバッファの内容をpまたはPコマンドでカーソル位置に取り出す。 nを省略した場合は、1番のバッファの内容を取り出す。
"名前p または、"名前P名前つきバッファ(a~z中の1文字)の内容を pまたはPで取り出す。
"ap 名前付きバッファaの内容をカーソルの左もしくは下の行に取り出す
:L,M mN L行目からM行目までをN行目の直後に移動する。
:L,M tN L行目からM行目までをN行目の直後に複写する。
■ まとめ 削除と複写(バッファ) viの複写や移動はバッファを経由して行う。
無名バッファ 内容が自動的に変化する。xや ddコマンドで削除された文字や行、yyなどのコマンドでデータは無名バッファにコピーされ、p, P コマンドで取り出される。
番号つきバッファ [1-9] 行単位で削除した内容は、番号付きバッファに退避される。
名前つきバッファ [a-zA-Z] 自分で名前をつけられるバッファ。単語や文字単位の退避が可能。
複数行のコピぺ
開始行で ms
終了行で me と入力
:'s,'edRet [Paste したい行で p]  開始行から終了行の間の削除[移動]
:'s,'eyRet Paste したい行で p開始行から終了行をコピペ
:'s,'es/str1/str2/gRet開始行から終了行で文字列置換:
■ 編集コマンドの取り消しと再実行 そのほか
u直前のコマンド実行の取り消し
U同一行で行われた変更の取り消し
. (dot)直前の変更コマンド(削除、置換 etc.)を繰り返す. 例: 同じ単語の置き換えを繰り返す場合、1回目は、cw→置き換えたい単語の入力→ ESC と実行し、2回目以降は変更したい単語の先頭にカーソルを移動して .と押す。
Ctrl-rredo
j現在行と次行を1行にまとめる。

6. オプション設定他

■ オプション設定 同じオプションを毎回使用する場合は、.exrcファイルに記述. vi 起動時に ./.exrc ~/.exrc の順に読み込む。 ~/.exrcを有効にするためには、オプションexrcの設定が必要なシステムもある。例
set exrc nu showmode tabstop=4
$ EXINIT='set exrc ・・・・' ; export EXINIT (環境変数EXINIT)
:set オプション [オプション・・・]  オプションの設定
:set オプション名=n ・・・オプションの値をnに設定する。
:set noオプション名 ・・・指定オプションを無効にする。
:set現在設定されているオプションを表示する。
:set allオプション一覧を表示する。
:set オプション名?オプション名の設定状況を表示する。

オプション名説明
autoindentai改行した時、次の行の先頭は自動的に前の行と同じ字下げ(インデント)になる。
autowriteaw:!UNIXコマンド、:n、:e、Ctrl-z などの実行時に、それまでの編集内容を自動的にファイルに書き込む。
ignorecaseic文字列検索時に大文字、小文字の区別をしない。
list行末を$、タブを^Iと表示する。スペースとタブを識別したい場合などに利用する。
numbernu画面の左端に行番号を表示する。
readonly指定ファイルの保護モードを読み込み専用に設定する。
redraw画面に変更が加えられた時点で再表示を行う。設定がされていないと、削除した行に@が表示される。
showmatchsm括弧を入力すると、対応する括弧上にカーソルが一瞬移動し、元の位置に戻る。
showmodeテキストモード、コマンドモードなど現在のモードを表示する。
Ctrl-g 現在行の位置、全体行の行数、現在行が全体の何%にあたるかを表示する。(vim のみ)
Ctrl-l 乱れた画面を再表示する。システムからのメッセージなどが割り込み表示された場合に使うと便利。
shiftwidth=nswCtrl-d、Ctrl-u、>>、<<などで移動する文字数を設定する。
tabstop=nts画面表示時のタブストップの値を設定(デフォルトは8)する。
wrapmargin=n  画面の右端からn文字以内に空白文字が挿入されたときに改行コードを自動的に挿入する。
■ サブコマンドや入力文字列の略記 設定したキーは無効の命令を入力するかviが終了するまで有効。毎回使用するオプションは .exrcファイルに記述。
:map キー コマンド列コマンドモードで実行したい一連のコマンドをキーに割り当てる。(コマンドに RetEscなどの特殊キーを含めるときは、直前にCtrl-vを入力する。 xや dなどの viコマンドの名前をキーにした場合は、mapによって割り当てられた機能が優先実行される。
:map! キー 文字列入力モードでキーを入力すると、指定した文字列が入力される。
:unmapCtrl-vmapで割り当てたキーを無効にする。
:unmap!Ctrl-vmap!で割り当てたキーを無効にする。
■ UNIXコマンドの実行
:!UnixCommand編集中、viを終了せずにUnixCommandを実行して戻る。
:shviを終了せずにシェルを起動。exitコマンドでviに戻る。
Ctrl-zviを一時停止し、shellに戻る。shellでfgと入力するとviに戻る。
!カーソル移動コマンドUnixCommandカーソル移動コマンドで指定された部分を対象にUnixCommandを実行する。
[n]!!UnixCommand UnixCommand を実行し、その結果で現在行を含む n 行を置き換える。
Leaflet My .exrc on research.kek.jp