Vimのマーク機能で好きな位置にジャンプする(m/`/'/:marks)
長いファイルを編集していて、さっきまでいた場所に戻りたいのにスクロールで探し回ることがあります。Vimには任意の位置に目印を付けてジャンプできるマーク機能があり、これを使えば探し回る必要がなくなります。
| キー | これだけ覚える |
|---|---|
| m{文字} | 現在位置にマークを作る |
| `{文字} | マーク位置へ正確にジャンプ |
| '{文字} | マークした行の先頭へジャンプ |
| ` ` | 直前のジャンプ元へ戻る |
| Ctrl-o / Ctrl-i | ジャンプ履歴を戻る / 進む |
マークを作る・移動する
m{文字} " 現在位置にマークを作る(a〜zの1文字を指定)
`{文字} " マークした正確な位置へジャンプ
'{文字} " マークした行の先頭へジャンプ
`(バッククォート)は列位置まで含めて正確に戻り、'(シングルクォート)は行頭にジャンプします。列位置まで再現したいか、行に着地できれば十分かで使い分けると便利です。
マークの一覧を確認する
:marks
:marks {マーク文字}
今まで設定したマークの一覧と、それぞれがどの行のどの内容を指しているかを確認できます。マーク文字を指定すれば、その一部だけに絞り込めます。
マークを消す
:delmarks {マーク文字}
:delmarks! " すべてのマークを削除
:delmarks!は今まで設定したマークを全部消してしまうので、実行前に本当に全消去でよいか確認したほうが安心です。大抵の場合は、同じ文字に新しいマークを上書きするだけで用は足ります。
自動的に設定される特殊マーク
| マーク | 意味 |
|---|---|
| `. | 最後に編集した箇所 |
| `^ | 最後に挿入モードを使った箇所 |
| ` `(バッククォート2回) | 直前のジャンプ元の位置 |
| Ctrl-o | ジャンプ履歴を1つ古い方向へたどる |
| Ctrl-i | ジャンプ履歴を1つ新しい方向へたどる |
自分でマークを作らなくても、直前の編集位置やジャンプ元には自動的にマークが設定されています。特に` `(直前のジャンプ元へ戻る)とCtrl-o/Ctrl-i(ジャンプ履歴をブラウザの戻る/進むのようにたどる)は、明示的にマークを作らなくても使える汎用的な移動手段として覚える価値が高いです。
ファイルをまたいだマーク
| マーク文字 | 範囲 |
|---|---|
小文字(a〜z) | そのファイル内だけで有効なローカルマーク |
大文字(A〜Z) | 別のファイルからもジャンプできるグローバルマーク |
複数のファイルを行き来しながら作業するときは、大文字マークを使うと「あのファイルのあの位置」に一発で戻れるようになります。
オペレータと組み合わせる
マークはモーションとしても機能するため、離れた2点の間をまとめて操作したいときにも使えます。d`aは現在位置からマークaの位置まで文字単位で削除、y'aは現在位置からマークaの行まで行単位でヤンクします。
one two three four five
カーソルは行頭、マークaは"three"の先頭
three four five
最初はマークの存在を知らず、目的の行を検索で探し直すことを繰り返していました。` `で直前の位置に戻れると知ってからは、遠くにジャンプして確認し、また元の場所に戻る、という往復作業が一気に楽になりました。Ctrl-o/Ctrl-iはブラウザの戻る進むと同じ感覚で使えることに気づいてから、さらに使用頻度が上がりました。
まとめ
マーク機能は自分で明示的に作るものと自動で設定されるものがあり、後者だけでも十分実用的です。長いファイルの編集で行き来が多い人ほど恩恵が大きいです。マークはファイルを閉じてもviminfo(Neovimではshada)に残りますが、セッションファイルには保存されません。レイアウトを復元してもマークは戻らないので、両者は別の仕組みだと考えておくと混乱しません。長距離の移動そのものは画面・ファイル単位の移動と組み合わせると手数が減ります。