Vimのカーソル移動まとめ 単語・行・画面・ファイル単位
Vimの移動キーは、覚えたそばから「どれを使えばいいのか」が分からなくなります。jを10回押すのと10jとGでは、どれも下に行けるのに手数も戻り方も違います。ここでは移動コマンドを距離の単位ごとに並べ直して、どの場面でどれを選ぶかを整理します。
| 動かしたい距離 | 使うキー |
|---|---|
| 1文字 | h j k l |
| 単語 | w b e |
| 行の中 | 0 ^ $ f t |
| 画面 | Ctrl-f Ctrl-b H M L |
| ファイル全体 | gg G {数字}G / |
1文字ずつ動かす
h " 左
j " 下
k " 上
l " 右
ホームポジションから手を離さずに済むのが利点です。矢印キーとの使い分けや、矢印キーを封じる設定をすすめない理由はhjklと矢印キー、結局どっちを使うべきかにまとめています。
数字を前に置くと回数になります。10jで10行下です。何行下かを目で数えるのが面倒なら、行番号を表示する設定で相対表示にしておくと、その数字がそのまま画面に出ます。
単語単位で動かす
w " 次の単語の先頭へ
b " 前の単語の先頭へ
e " 単語の末尾へ
大文字のW B Eは空白でしか区切らないので、user.profile.nameのような記号混じりのかたまりを一気に飛び越えます。小文字と大文字で止まる位置がどう変わるかは単語移動8種類の違いで扱っています。
行の中を動かす
0 " 行の先頭(インデントの空白も含む)
^ " 最初の文字(インデントは飛ばす)
$ " 行の末尾
0と^はインデントの扱いが違うので、コードを書いているときは^のほうが無駄がありません。詳しくは行頭・行末へ移動するを参照してください。行の中の特定の1文字を狙うならf と t による1文字検索が最短です。
画面単位で動かす
Ctrl-f " 1画面ぶん進む
Ctrl-b " 1画面ぶん戻る
H M L " 画面の最上行 / 中央 / 最下行へ
Ctrl-fとHは見た目が似ていますが、前者は画面のほうを動かし、後者はカーソルを画面内で動かします。この違いとzzのような表示位置の調整は画面スクロールとジャンプ操作にまとめてあります。
ファイル全体を動かす
gg " 先頭行へ
G " 最終行へ
42G " 42行目へ
エラーメッセージが行番号を出してきたときは42Gが最短です。行番号ではなく中身で探すなら文字列検索(/ と ?)のほうが早く、戻る場所に印を付けておきたいならマーク機能が使えます。
戻れる移動と、戻れない移動がある
ここが移動コマンドでいちばん見落とされる点です。Vimは大きく飛んだ移動だけをジャンプリストに記録していて、Ctrl-oで戻れるのは記録された移動だけです。距離が長いかどうかではなく、キーの種類で決まります。
Vim 9.1で、6行目にカーソルを置いてから各キーを押し、:jumpsの中身を見て確かめました。
| キー | ジャンプとして記録されるか |
|---|---|
| G { } H L / | される(Ctrl-oで戻れる) |
| j 3j w 3w 0 Ctrl-f | されない |
つまり3jで3行下がっても、Ctrl-fで1画面ぶんスクロールしても、記録は残りません。一方でGや/で飛んだあとはCtrl-oで元の位置に戻れます。「さっきの場所に戻りたい」が効くかどうかは、移動した距離ではなく押したキーで決まります。
長いファイルの末尾を確認してから元の場所に戻ろうとして、Ctrl-oが効かずに困ったことがあります。原因はCtrl-fを連打して降りていたことでした。Gで飛べば一発で戻れると知ってからは、確認だけしたいときは必ずGを使うようになりました。逆に、読みながら少しずつ降りていく場面ではスクロールのほうが自然なので、そこは戻れないものだと割り切っています。
移動キーは削除やコピーの範囲にもなる
ここまでのキーの多くは、そのままdやyの後ろに置けます。dwで単語を削除、d$で行末まで削除、y}で段落をコピーです。移動を覚えると編集コマンドの語彙が同時に増えるので、まず移動から手を付けるのが近道になります。組み合わせの考え方はオペレータ+モーションの練習ドリルで扱っています。
ただしCtrl-fのような画面スクロールはモーションではないため、dの後ろには置けません。上の表で「記録されない」に入っているキーのうち、j w 0はモーションですが、Ctrl-fだけは別物です。
まとめ
移動は距離の単位で選ぶと迷いません。1文字ならhjkl、単語ならw、行の中なら^と$、遠くへ飛ぶならGか/です。そのうえで、戻ってくる予定があるかどうかでGとスクロールを使い分けると、Ctrl-oが思ったとおりに効くようになります。