Vimのマーク機能で好きな位置にジャンプする(m/`/'/:marks)
長いファイルを編集していて、さっきまでいた場所に戻りたいのにスクロールで探し回ることがあります。Vimには任意の位置に目印を付けてジャンプできるマーク機能があり、これを使えば探し回る必要がなくなります。
目次(11項目)
| キー | これだけ覚える |
|---|---|
| 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はブラウザの戻る進むと同じ感覚で使えることに気づいてから、さらに使用頻度が上がりました。
マークが消える条件と、取り消しで戻ること
マークは行を追いかけるので、上に行を足したり消したりしてもずれません。行番号を覚えておく方法との違いはここにあります。ただし、マークを付けた行そのものを消すとマークは失われます。
手元のVim 9.1.1752で確かめると、3行目にマークaを付けてからその行を消すと、:marks a は E283: No marks matching "a" を返しました。そのまま u で取り消すと、マークは元の行に復活します。
:marks a " a 3 0 three
:3delete " マークを付けた行を消す
:marks a " E283: No marks matching "a"
u " 取り消す
:marks a " a 3 0 three (復活する)
作業の途中で目印が効かなくなったときは、まずその行を消していないかを疑ってください。取り消せば戻るので、付け直す前に u を試すほうが早く済みます。
Vimを閉じてもマークは残る
マークはVimの終了時にファイルへ書き出され、次に同じファイルを開いたときに復元されます。保存先はVimでは viminfo、Neovimでは shada です。同じVim 9.1.1752で viminfo を書き出してから起動し直すと、小文字の q も大文字の Z も付けたままの行を指していました。
何ファイルぶんまで覚えるかは viminfo オプションの ' の後ろの数で決まります。既定の '100 なら100ファイルぶんです。昨日の続きを今日始めるとき、目印がそのまま残っているのはこの仕組みのおかげです。
裏を返すと、機密情報を含む行の位置がファイルに残るということでもあります。共有マシンで作業する場合は viminfo の保存内容を確認してください。
使う文字を決めておく
小文字26個を全部使い分けるのは現実的ではありません。いま直している場所に a、参照しに行く場所に b、というように役割で決めてしまうと、何に使ったか思い出せなくなりません。
散らかってきたら範囲でまとめて消せます。:delmarks a-c と書けば a から c までが一度に消え、d 以降は残ります。全部消す :delmarks! より安全で、実際に必要になるのはこちらのほうです。
:delmarks a-c " a b c だけを消す
:delmarks ab " 並べて書いてもよい
そもそもマークを付けずに済む場面も多くあります。行って戻るだけなら Ctrl-o や `` で足りるので、繰り返し戻ってくる位置にだけマークを使うと管理する数が減ります。
まとめ
マーク機能は自分で明示的に作るものと自動で設定されるものがあり、後者だけでも十分実用的です。長いファイルの編集で行き来が多い人ほど恩恵が大きいです。マークはファイルを閉じてもviminfo(Neovimではshada)に残りますが、セッションファイルには保存されません。レイアウトを復元してもマークは戻らないので、両者は別の仕組みだと考えておくと混乱しません。長距離の移動そのものは画面・ファイル単位の移動と組み合わせると手数が減ります。
ここで扱ったキーは、ブラウザ上で動くVim道場の位置を覚えて戻るでそのまま試せます。インストールもログインも要りません。