Vim 基本操作まとめ

/web/tool

Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。

カーソル移動
h, j, k, l [左下上右]へ移動
gj 表示行単位で移動(↓)
gk 表示行単位で移動(↑)
^ 行頭へ移動
$ 行末へ移動
% 対応する括弧へ移動

Vimにおける、基本操作のチートシート。だいぶ使えるようになってきたのでメモっておきます。

2009.05.29: 「単語移動」を追加しました。横スクロールめんどいよね。
2009.05.29: 「もちょっと発展的な+α」を追加。そこそこ貯まってきた。
2012.07.19: 「ヘルプ」を追加。gm、f[word]などを追加。

モード切替 i 挿入モード(カーソル位置から)
a 挿入モード(カーソルの後から)
: コマンドラインモード
v ビジュアルモード
C-[ ノーマルモード
<ESC> ノーマルモード

Vimは複数のモードを持ち、これらを切り替えることで全ての編集機能を扱えるようになっている。以後はノーマルモードを基本として紹介します。ちなみに「C-a」で「Ctrl+a」みたいな感じです。よろしく!

ヘルプ :h :helpと同じ。ヘルプ画面(索引)を展開
:h [word] [word]にマッチした項目を表示(タイプ後、<C-d>で項目の一覧を表示)
:h [command] ノーマルモードのコマンドを表示(:h CTRL-oなど)
:h i_[command] 挿入モードのコマンドを表示(:h i_tなど)
:h v_[command] ビジュアルモードのコマンドを表示(:h v_oなど)
保存&終了 :e ファイルを開く。新規作成もコレ(:editと同じ)
:w 保存(:w!で強制的に保存)
:q 終了(:q!で編集結果を破棄して終了)
:f ファイル名を変更して編集を続ける(:fileと同じ)
ZZ 保存して終了(:wq微妙に同じ)
ZQ 保存せずに終了
C-z 中断(fgで復帰。:suspendと同じ)
コピー&ペースト [数値]dd 行をカット
[数値]yy 行をコピー
P ペースト(カレント行)
p ペースト(カーソルの下)
取り消し&やり直し u 取り消し(Undo)
U 行に対して行った変更の全てを取り消す
C-r やり直し(:redoと同じ)
マクロ(キーのレコード) qa[操作]q aレジスタにコマンドを記録
qA[操作]q aレジスタにコマンドを追記
[数値]@a aレジスタのコマンドを再生
@@ 直前に実行したレジスタを再生
選択 v 選択開始
V 行選択
C-v 矩形選択
gv 直前の選択範囲を再選択
検索 /[文字列] 前方検索
?[文字列] 後方検索
# カーソル位置の単語を前方検索
* カーソル位置の単語を後方検索
n 次の候補
N 前の候補
gd カーソル位置のローカル宣言を検索
gD カーソル位置のグローバル宣言を検索
置換 :% s/from/to/g %でページ全体
:32,40 s/from/to/g 32行目から40行目までの間で実行
:/search/s//replace/g 検索候補から置換する

memo1: 置換の構文 → :[範囲]s/[検索語句]/[置換語句]/[オプション]

memo2: gオプション → 繰り返し。cオプション → 1回ごとに確認(yで置換。Enterで次へ)

memo3: 選択中に「:」でコマンドモードに入ると、選択領域の範囲指定が自動で挿入される(:'<,'>)。これを置換に利用すれば直感的に作業できる。

テキスト操作 x 1文字を削除(Deleteキーと同じ方向)
X 1文字を削除(BSキーと同じ方向)
D カーソル位置から行末まで削除
s 1文字を削除して挿入モードへ
S 現在の行を削除して挿入モードへ
r カーソル位置の1文字だけ置換
R 置換モードへ
J 行を連結(スペースあり)
gJ 行を連結(スペースなし)
~ 大文字/小文字に変換
C-a カーソル位置の数字をインクリメント
C-x カーソル位置の数字をデクリメント
C-p (挿入モード時)単語を後方向に検索し、補完する
C-n (挿入モード時)単語を前方向に検索し、補完する
インデント == カレント行のインデント
=[範囲] 指定範囲のインデント
='m カレント行からマークの位置(この場合はm)までインデントする。
=G カレント行から最終行までインデントする
> カレント行をインデント
< カレント行を逆インデント
画面分割 :sp 画面を上下に分割(:splitと同じ)
:vsp 画面を左右に分割(:vsplitと同じ)
:q ウィンドウを閉じる
:qall 全てのウィンドウを閉じる
:only カレントウィンドウ以外を閉じる
C-wo カレントウィンドウ以外を閉じる
C-ww ウィンドウを順番に移動
C-w[hjkl] ウインドウを{上,下,左,右}に移動
C-w[HJKL] カレントウィンドウを一番{上,下,左,右}に移動
[数値]C-w+ ウィンドウサイズを数字分増やす
[数値]C-w- ウィンドウサイズを数字分減らす
バッファ管理 :e ファイルを開く。新規作成もコレ(:editと同じ)
:ls バッファのリストを表示
:bp 前のバッファ
:bn 次のバッファ
:b[バッファ番号] 指定したバッファを表示
:b# 直前に開いていたバッファを表示
:bd バッファ削除
高度な移動 gg 最初の行へ
G 最後の行へ
[行番号]G 指定した行へ
0 行の最初へ(インデントを無視)
^ 行の最初へ(テキストの最初へ)
$ 行の末尾へ
- 前の行の最初へ
+ 次の行の最初へ
% 対応する括弧へ
H スクリーンの上端の行へ移動(2Hで2行目)
M スクリーンの中央行へ移動
L スクリーンの下端の行へ移動(2Lで下から2行目)
gm スクリーン幅の中央へ移動(行中の横移動)
C-o 前回のジャンプ位置に戻る
C-i 次回のジャンプ位置に進む
z<Enter> カレント行が画面のトップになる
zz カレント行が画面の中央になる
m[マーク] マークを付加。a-zのレジスタを指定可能。
`[マーク] マークへ移動
単語移動(横移動) w 次の単語に移動
b 前の単語に移動
e 単語の末尾に移動
W 次の単語に移動(記号などは無視)
B 前の単語に移動(記号などは無視)
E 単語の末尾に移動(記号などは無視)
f{char} カーソルを{char}の位置まで移動(3f/で3つめの"/"まで移動)
t{char} カーソルを{char}の左側の位置まで移動(3t/で3つめの"/"の前まで移動)
スクロール(↑) C-b 1画面ずつ
C-u 半画面ずつ
C-y 1行ずつ
スクロール(↓) C-f 1画面ずつ下へ
C-d 半画面ずつ下へ
C-e 1行ずつ下へ
スクロール(→) zl n文字ずつ右へ
zL 半画面ずつ右へへ
スクロール(←) zh n文字ずつ左へ
zH 半画面ずつ左へ

文字コード/改行コード

:set fenc=[文字コード] 文字コードを変更(:set fenc=shift_jis など。:set fileencoding と同じ)
:set ff=[ファイルフォーマット] 改行コードを変更(:set ff=unix など。:set fileformat と同じ)
:e ++enc=[文字コード] 編集中のバッファを、文字コードを指定して再読込
ga カーソル位置の文字コードの値を調べる
:asci カーソル位置の文字コードの値を調べる

おまけ

ディレクトリ移動 :cd [パス] カレントディレクトリをpathに変更
:cd $HOME カレントディレクトリをホームディレクトリに変更
:cd %:h カレントディレクトリをカレントファイルのパスへ変更
システムコマンド :![コマンド] コマンドを実行し、結果を表示する
 ex1. :!mkdir -m 775 ./test/
 ex2. :!perl -cw test.cgi
:[範囲]![コマンド] 選択範囲を標準入力でコマンドに渡し、出力結果で置換する
:r![コマンド] コマンドを実行し、標準出力を挿入する(カーソル位置)
レジスタ :display 格納されているレジスタを表示
"ap aレジスタを貼付け
"*p クリップボードの中身を貼付け
C-ra aレジスタを貼付け(ノーマルモード、コマンド入力時、検索時)
レジスタの詳細
0 最後にカット/ヤンクした文字列
[1–9] カット/削除した文字列が1から順に格納されている
[a–z] ユーザ定義。マクロ、マークなど
% 編集中のバッファのファイル名
# 直前に開いたバッファのファイル名
* システムのクリップボード
/ 直前の検索語句
? 直前の検索語句
: 直前に入力したコマンド
- 削除した文字列(1行以下)
. 挿入モードにて入力した文字列
= 計算式(数式、文字列、Vim変数、Vim関数)を入力 → pなどで貼付け

もちょっと発展的な+α

Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。

8 Comments

e-luck wrote:
どもです。
「高度な移動」で「最初の行へ」がダブってるみたいです。
G 最後の行へ
ですよね。 2008–02–16 01:21
Sig. wrote:
あ、ほんとだ。
いつもありがとうございます!
修正しときました~^^b 2008–02–16 12:50
road wrote:
下にスクロールしようとしてついjを押してしまったのは内緒。
Vimを使ってプログラミングするときはタグジャンプ機能がお勧め。
あとはC-nやC-pで保管機能とか。
僕もVimはほんの少ししかわからないのですが、
今後もVim使いとしてやっていくつもりなので色々教えてくださいねm(_ _)m 2008–02–19 02:28
Sig. wrote:
> あとはC-nやC-pで保管機能とか。
あぁ、それがあった! 関数の長いPHPでは特に便利みたいですね。
俺は手入力派なのであんまり使わないですが、スクリプトで<Tab>にしてまっす。
挿入モード専用のキーバインドって盲点だったなぁ。

タグジャンプ使えます?
なんかC専用って匂いがするのでスルーしてたんですが...

> 今後もVim使いとしてやっていくつもりなので色々教えてくださいねm(_ _)m
こちらこそ、よしなに^^b 2008–02–19 21:43
ぐるり wrote:
どうして誰も突っ込まないんだ。
:zz
じゃなく
ZZ
じゃね?>保存して終了
#思わず確認してしまったではないですか。 2008–02–20 18:52
Sig. wrote:
おぉっとぅ! 修正しときました。
指摘thx!

関係ないけど
---------------------------------------
z<Enter> → カレント行が画面のトップになる
zz → カレント行が画面の中央になる
ZZ → 保存して終了
C-z → 中断
---------------------------------------
この辺は如何にも奇妙な関係に見えますな! 2008–02–20 22:10
road wrote:
タグジャンプはフレームワークのソースを追うときなんかは頻繁に使いますね。
補完機能ですが、タイピングが割りと早い方なんでgetRequestParameter()とか
長い上に打ちにくいメソッド以外は大体手打ちしちゃうんですけどね!!

ちなみに
:wqとZZだと、前者は保存、後者は更新されていれば保存という微妙な違いが。 2008–02–21 14:26
Sig. wrote:
タグジャンプやってみました。
確かにこれは便利 ...てか面白い!

Vim単体でできる機能ではないので、エントリを別にして纏めてみようかと思います。
いちおサクっとまとめておくと↓

-------------------------------------------
:!ctags -f [タグファイル] -R [対象ディレクトリ]
:set tags=[タグファイル]
-------------------------------------------

...で<C-]>ですね。そして<C-t>で戻るっと。 2008–02–26 15:59