vi 操作チートシート
目次
モード
| ノーマルモード | カーソルの移動や検索、コピー・ペーストなどを行う。 |
| コマンドラインモード | exコマンド(「:」から始まるコマンド)が利用できるモード。範囲指定一括置換・削除や、ファイル保存・終了などで使う。 |
| 挿入モード | テキスト編集するためのモード |
| ビジュアルモード | テキストを可視選択してコピー・削除などができるモード。このモードでカーソルを動かすと、辿った部分が強調表示されて選択状態になる。 |
| ターミナルモード | vi編集中にターミナルを起動できるモード。外部コマンドを実行したり、その結果を編集中テキストに取り込んだりできる。 |
移動
| h, j, k, l | 左, 下, 上, 右へ1文字移動 |
| w, W | 次の単語へ移動。Wは記号も単語の一部とみなす。 |
| b, B | 前の単語へ移動。Bは記号も単語の一部とみなす。 |
| e, E | 現在または次の単語の末尾へ移動。Eは記号も単語の一部とみなす。 |
| 0 | 行頭へ移動 |
| ^ | 行の空白以外の最初の文字へ移動 |
| $ | 行末へ移動 |
| 3G or :3 | 3行目に移動 |
| G | 最終行へ移動 |
| Ctrl + e | 1行下方へ移動 |
| Ctrl + y | 1行上方へ移動 |
| Ctrl + d | 半画面分下方へ移動 |
| Ctrl + u | 半画面分上方へ移動 |
| Ctrl + f | 1画面分下方へ移動 |
| Ctrl + b | 1画面分上方へ移動 |
| 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 | 上に行を追加 |
| r | 1文字置換(置換後はコマンドモード) |
| R | カーソル位置から入力やめるまで上書き |
コピー(ヤンク)・変更・削除
コピー・変更・削除を示す識別子はそれぞれ「y・c・d」。cは挿入モードに移行する。コマンドの基本形は、「識別子+対象」。
| コマンド | 対象 |
|---|---|
| yl, cl, dl | 1文字 |
| 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 | カーソル位置にある単語と前後の空白が対象。 |
その他のコマンド
| s | 1文字変更 |
| x | 1文字削除 |
| X | 左の1文字を削除 |
ペースト
| p | カーソル位置の右側にペースト |
| P | カーソル位置の左側にペースト |
| “a3yy | 3行コピーしてバッファ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]d | x行からy行を削除。%dで全行削除 |
検索して置換・削除
viで正規表現を使うときは、"{"を"¥{"のようにエスケープしたり、最短一致に"?"が使えないなど独特なので要注意。
Vimで使える正規表現のサイトが詳しい。
| :[n,m]s/regex/replace/フラグ | regexにマッチする文字列をreplaceに置換。 [n,m]は対象行の範囲(行番号)を指定。 n=^(先頭行)、m=$(最終行)を指定可。 [n,m]の代わりに%指定で全行対象。 フラグ省略時は行内で最初にマッチする文字列が対象。フラグ=gは全て対象。 フラグ=cは置換前に確認。フラグ=gcを指定可。 |
| :[n,m]g/regex/d | regexにマッチする行を削除。[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 | 複数ファイルを開いていた場合、編集中ファイルの一覧を確認 |
| :q | viを終了 |
| :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 | 現在編集中のファイル名を表示 |