vi 操作チートシート

モード

ノーマルモードカーソルの移動や検索、コピー・ペーストなどを行う。
コマンドラインモードexコマンド(「:」から始まるコマンド)が利用できるモード。範囲指定一括置換・削除や、ファイル保存・終了などで使う。
挿入モードテキスト編集するためのモード
ビジュアルモードテキストを可視選択してコピー・削除などができるモード。このモードでカーソルを動かすと、辿った部分が強調表示されて選択状態になる。
ターミナルモードvi編集中にターミナルを起動できるモード。外部コマンドを実行したり、その結果を編集中テキストに取り込んだりできる。

移動

h, j, k, l左, 下, 上, 右へ1文字移動
w, W次の単語へ移動。Wは記号も単語の一部とみなす。
b, B前の単語へ移動。Bは記号も単語の一部とみなす。
e, E現在または次の単語の末尾へ移動。Eは記号も単語の一部とみなす。
0行頭へ移動
^行の空白以外の最初の文字へ移動
$行末へ移動
3G or :33行目に移動
G最終行へ移動
Ctrl + e1行下方へ移動
Ctrl + y1行上方へ移動
Ctrl + d半画面分下方へ移動
Ctrl + u半画面分上方へ移動
Ctrl + f1画面分下方へ移動
Ctrl + b1画面分上方へ移動
H画面先頭へ移動
M画面真中へ移動
L画面最終行へ移動
カーソル位置の括弧と対をなす括弧に移動

特定の位置にマークをつけて、必要なときにマーク位置にジャンプすることができる。

:marksマーク一覧を表示
m[a-zA-Z]カーソル位置をマークする
`[a-zA-Z]指定のマークに移動
:delmarks[a-zA-Z]指定のマークを削除
:delmarks!マークを一括削除

検索

viで正規表現を使うときは、"{"を"¥{"のようにエスケープしたり、最短一致に"?"が使えないなど独特なので要注意。
Vimで使える正規表現のサイトが詳しい。

f文字同一行内で指定文字を前方検索(ex.fdでdを前方検索)
F文字同一行内で指定文字を後方検索(ex.Fdでdを後方検索)
;同一行内で次を検索
/正規表現ファイル全体で前方検索
?正規表現ファイル全体で後方検索
nファイル全体で次を検索
Nファイル全体で前を検索

挿入モード移行

a右に文字を入力
A行末に文字を入力
i文字を入力
I行頭に文字を入力
o下に行を追加
O上に行を追加
r1文字置換(置換後はコマンドモード)
Rカーソル位置から入力やめるまで上書き

コピー(ヤンク)・変更・削除

コピー・変更・削除を示す識別子はそれぞれ「y・c・d」。cは挿入モードに移行する。コマンドの基本形は、「識別子+対象」。

コマンド対象
yl, cl, dl1文字
yy(またはY), cc, dd現在行。3yyなどで3行対象。
y0, c0, d0行頭からカーソル位置の直前まで
y$, c$(またはC), d$(またはD)カーソル位置から行末まで
yG, cG, dG現在行から最終行まで
yf, cf, dfカーソル位置から前方の指定文字まで
yF, cF, dFカーソル位置の直前から後方の指定文字まで

単語の操作 ※Wは記号も単語の一部とみなす。

yw, cw, dw
yW, cW, dW
カーソル位置から単語末尾までが対象。
yiw, ciw, diw
yiW, ciW, diW
カーソル位置にある単語が対象。
yaw, caw, daw
yaW, caW, daW
カーソル位置にある単語と前後の空白が対象。

その他のコマンド

s1文字変更
x1文字削除
X左の1文字を削除

ペースト

pカーソル位置の右側にペースト
Pカーソル位置の左側にペースト
“a3yy3行コピーしてバッファaに保存(aの部分はa〜zの26個使える。3yyの部分は上記のコピー・削除系コマンドのいずれも使用可)
“apバッファaの内容をカーソル位置の右側にペースト

可視選択

ビジュアルモードに移行する。範囲選択の開始後、カーソルを移動することで辿った部分が強調表示され選択状態となる。範囲選択後、d(削除)・y(ヤンク)・c(変更)で終了するとその動作が選択範囲に対して行われる。削除・コピーした場合はpなどで貼り付け可能。

v文字単位の範囲選択を開始。
Shift + v行単位の範囲選択を開始。
Ctrl + v矩形の範囲選択を開始。
viw, viW
vaw, vaW
カーソル位置の単語を選択。Wは記号も単語の一部とみなす。aは単語の前後の空白を含めて選択。

exコマンド

行指定では、.(現在行)、$(最終行)を使用可能。
exコマンドはこちらが詳しい。

:[x,y]co[z](coの代わりにtでも可)x行からy行をコピーして、z行の下に出力
:[x,y]m[z]x行からy行をz行の下に移動
:[x,y]dx行からy行を削除。%dで全行削除

検索して置換・削除

viで正規表現を使うときは、"{"を"¥{"のようにエスケープしたり、最短一致に"?"が使えないなど独特なので要注意。
Vimで使える正規表現のサイトが詳しい。

:[n,m]s/regex/replace/フラグregexにマッチする文字列をreplaceに置換。
[n,m]は対象行の範囲(行番号)を指定。
n=^(先頭行)、m=$(最終行)を指定可。
[n,m]の代わりに%指定で全行対象。
フラグ省略時は行内で最初にマッチする文字列が対象。フラグ=gは全て対象。
フラグ=cは置換前に確認。フラグ=gcを指定可。
:[n,m]g/regex/dregexにマッチする行を削除。[n,m]の意味は上に同じ。

操作のやり直し・繰り返し

uアンドゥ
U行内の変更を全てアンドゥする。
その行からカーソルを移動していない場合にだけ有効。
Ctrl + rリドゥ
.直前の変更操作の再実行

マクロ

q[a-z]マクロの記録開始
qマクロの記録終了
[n]@[a-z]マクロをn回実行。n省略時はn=1。[a-z]は記録時に指定した文字。
@@直前に実行したマクロを再実行
:reg直前に実行したマクロを再実行

マップ(キー割り当て)

:map {lhs} {rhs}キー入力{lhs}を{rhs}に割り当てる。
例えば :map <F1> $p の設定により、F1キー押下で行末にペーストする。
:unmap {lhs}キー{lhs}のマッピングを削除する
:mapマッピングを一覧表示

ファイルの編集・保存と終了

後ろに ! をつけることで強制の意味になる。例えば :q! でファイルに変更があっても強制終了する。

:e ファイル名ファイルを開く。「:e!」で自分自身のファイルを(変更があっても)強制的に開き直す。
:n(ext)複数ファイルを開いていた場合、次のファイルへ移動
:prev(ious)複数ファイルを開いていた場合、前のファイルへ移動
:e#複数ファイルを開いていた場合、直前の編集ファイルに戻る
:rew複数ファイルを開いていた場合、最終ファイルから先頭ファイルへ移動(rewind)
:arg複数ファイルを開いていた場合、現在何番目のファイルを編集中かを確認
:args複数ファイルを開いていた場合、編集中ファイルの一覧を確認
:qviを終了
:wファイルに保存
:w ファイル名名前をつけて保存
:wqファイルに保存して終了
:wq ファイル名名前をつけて保存して終了

文字コード

charsetにはsjis, cp932, utf-8などを指定可能。

set fileencoding=charset
set fileencodings=charset
set encoding=charset
ホームディレクトリの.vimrcに設定する(viで開いた後でコマンドライン上で設定しても効かない)。 fileencoding は保存時の文字コード。fileencodings は開くときの文字コード。複数指定時は先頭から優先。encoding は fileencoding, fileencodings ともに未設定時の文字コード。
:e[dit] ++enc[oding]=charset指定の文字コードcharsetで開き直す。
:se[t] f[ile]enc[odings]=charsetファイル保存時の文字コード形式をcharsetとする。
:se[t] enc[oding]?現在のVimのデフォルト文字コードを表示する。
:se[t] f[ile]enc[odings]?現在のファイルの文字コードを表示する。
vi -c ":e ++enc=charset" file名文字コードを指定してファイルを開く

大文字 ⇄ 小文字の変換

ビジュアルモードの場合

U選択範囲を大文字に変換
u選択範囲を小文字に変換
~選択範囲の大文字・小文字を入れ替え

ノーマルモードの場合

gUU / guuカーソル行の文字を大文字 / 小文字に変換
gUiw / guiwカーソル位置の単語を大文字 / 小文字に変換
~カーソル位置の文字の大文字 / 小文字を反転
g~~カーソル行の文字の大文字 / 小文字を反転
gU{モーション} / gu{モーション}モーションで指定した範囲を大文字 / 小文字に変換する。モーションは l(1文字)、$(行末まで)、0(行頭まで)、w(次の単語まで)、fa(次の"a"まで)など、移動系で登場したものが使える。

その他

:h(elp)
マニュアルを表示(:qで脱出)
:hの後にコマンドなどの指定でそのマニュアルを表示(ex. :h :set, :h :s)
:his(tory)コマンド履歴を表示
:reg(ister)レジスタ一覧を表示
:se(t) nu(mber)
:se(t) nonu(mber)
行番号の表示・非表示を切り替え
:se(t) t(ab)s(top)=4タブ長を4バイトとする
:se(t) i(gnore)c(ase)
:se(t) noi(gnore)c(ase)
検索時に大文字小文字を区別するかしないかの切り替え。ignorecaseで区別を無視する。
:se(t) a(uto)i(ndent)
:se(t) noa(uto)i(ndent)
自動インデントの有効・無効を切り替え
:se(t) cu(rsor)l(ine)カーソル行を表示
:se(t) hls(earch)
:se(t) nohls(earch)
検索ハイライトの切り替え。 有効にすると/などで検索時にマッチした文字列がハイライト表示される。
:se(t) allすべてのオプションを表示
:syntax on/offシンタックスハイライトの切り替え
:!コマンド指定の外部コマンドの実行結果を一時的に表示
:!!直前のコマンドを再度実行
:rファイル名指定ファイルの内容を次の行に挿入
:r!コマンド指定の外部コマンドの実行結果を次の行に挿入
J行の連結
>>行頭にタブを挿入
<<行頭のタブを削除
Ctrl + G現在編集中のファイル名を表示