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 | 現在編集中のファイル名を表示 |