Vimの画面スクロールとジャンプ操作(Ctrl-f/b/u/d, gg/G/%)
長いファイルでjを連打してスクロールしていたら日が暮れます。画面単位・ファイル単位で大きく移動するコマンドを覚えれば、長距離の移動はほぼ一瞬で済むようになります。
目次(10項目)
| キー | これだけ覚える |
|---|---|
| Ctrl-f / Ctrl-b | 1画面下 / 上へスクロール |
| Ctrl-d / Ctrl-u | 半画面下 / 上へスクロール |
| gg / G | ファイル先頭 / 末尾へジャンプ |
| % | 対応する括弧へジャンプ |
画面単位のスクロール
| キー | 動作 |
|---|---|
| Ctrl-f | 1画面分下へスクロール(forward) |
| Ctrl-b | 1画面分上へスクロール(back) |
| Ctrl-d | 半画面分下へスクロール(down) |
| Ctrl-u | 半画面分上へスクロール(up) |
頭文字がそのまま方向のヒントになっている(forward=下、back=上、down=下、up=上)ので、この対応さえ覚えれば迷いません。半画面スクロールのCtrl-d/Ctrl-uは、1画面まるごと切り替わるCtrl-f/Ctrl-bより視界が急に変わらない分、読みながら移動するのに向いています。
ファイル単位のジャンプ
| キー | 動作 |
|---|---|
| gg | ファイルの先頭行へ |
| G | ファイルの末尾行へ |
| {行番号}G | 指定した行へ(例:20Gで20行目) |
:{行番号} | 同上(コマンドラインでの指定) |
特定の行番号にすぐ移動したい場面は、エラーメッセージに表示された行番号へ飛ぶときなどによくあります。{行番号}Gは覚え方に頼らず、体で覚えておくと反射的に使えるようになります。
スクロールしてもカーソル位置は動かない
Ctrl-f/Ctrl-b/Ctrl-d/Ctrl-uは画面の表示位置を動かすコマンドで、カーソルは表示されている範囲内のどこかに留まります。カーソルの正確な位置を気にせず、まず目的の範囲を画面に表示させてから、改めてhjklや検索で細かい位置に合わせる、という2段階の動きになります。
対応する括弧へジャンプ:%
カーソルが括弧(()・{}・[])の上にあるとき、%を押すと対応するもう一方の括弧へジャンプします。
if (x > 0) {
ok();
}
if (x > 0) {
ok();
}
ネストが深いコードで、今いる{がどの}と対応しているかを目で追うのが大変なときに特に役立ちます。プログラミング以外ではあまり使わないコマンドですが、コードを読む機会が多い人には欠かせません。
長い設定ファイルのエラー箇所を探すとき、以前はひたすらスクロールしていましたが、エラーメッセージの行番号を見て{行番号}Gで直接飛ぶようになってからは、探す時間がほぼゼロになりました。ネストの深いJSONを読むときの%も、慣れるとカッコの対応を目で追う手間が要らなくなって驚きました。Ctrl-d/uの半画面スクロールは、Ctrl-f/bより視界の変化が緩やかで読みながら移動するのに向いていると気づいたのも、使い込んでからのことでした。
カウントを前置きして活用の幅を広げる
3Ctrl-f " 3画面分下へスクロール
スクロール系のコマンドにも数字を前置きできます。長いログファイルを大まかに読み飛ばしたいときなど、1回の操作で大きく移動したい場面で使うと便利です。
画面のほうを動かす zt zz zb
Ctrl-f や Ctrl-d は画面を送ってカーソルもついていく操作ですが、カーソルはそのままで画面の位置だけを変えたい場面もあります。zt で今の行を画面の上端へ、zz で中央へ、zb で下端へ動かせます。
zt " 今の行を画面の一番上へ
zz " 今の行を画面の真ん中へ
zb " 今の行を画面の一番下へ
関数の先頭に飛んだ直後に zt を押すと、その関数の中身が画面いっぱいに見えます。検索で飛んだ先が画面の端に出て読みにくいときは zz です。移動とセットで押す癖を付けると、スクロールし直す手間がほぼ消えます。
1行ずつ画面を送る Ctrl-e と Ctrl-y
Ctrl-e で画面を1行ぶん下へ、Ctrl-y で1行ぶん上へ送れます。カーソルは画面の中に留まる限り動きません。あと1行だけ見たい、という細かい調整に向きます。
数字を前に付けられるので 5Ctrl-e で5行ぶんです。Ctrl-d の半画面では大きすぎる、という場面で使えます。
飛びすぎたら Ctrl-o で戻る
gg G % や検索のような大きな移動は、Vimがジャンプリストという履歴に記録しています。Ctrl-o で1つ前の位置へ戻り、Ctrl-i で進みます。ブラウザの戻る・進むと同じ感覚です。
記録されるのは大きな移動だけで、j や w のような1歩ずつの移動は入りません。履歴が細切れにならないので、何度押しても意味のある場所に戻れます。一覧は :jumps で確認できます。マークと組み合わせた移動はマーク機能の記事にまとめています。
scrolloff で端まで行かせない
カーソルが画面の最下行まで来てから初めてスクロールが始まると、次に何が書いてあるか見えないまま読み進めることになります。set scrolloff=3 を書いておくと、上下に常に3行残した状態でスクロールするようになります。
ただしこの設定を入れると、H や L で飛べる位置も内側にずれます。画面の端まで確実に行きたい場面では set scrolloff=0 に戻す必要があるので、両方の挙動を知ったうえで値を決めてください。
まとめ
画面・ファイル単位の大きな移動は数個のコマンドで完結します。単語単位の細かい移動とあわせて覚えておくと、あらゆる距離の移動を最短手数でこなせるようになります。行の中での位置決めは行頭・行末への移動が担当します。飛んだ先へまた戻ってきたいなら、マークを打っておくと往復が楽になります。