前提
- vimちょっとわかる
- マーク機能は知らない、あんまり使ってない
マークとは
- vimでは ``で、直前に居たカーソル位置に移動(ジャンプ)することができます
- vimでは
g;
で、直前に編集を行った位置に移動(ジャンプ)することができます
(めっちゃ便利なので知らなかった人は↑だけでも覚えていってください)
では直前に居た位置や編集した位置をvimはどうやって覚えているんでしょうか?それがマークです。
vimは直前の場所や編集した位置を良い感じに勝手にマークしてくれますが、もちろんマークをユーザが自由に設定して、好きなようにマーク位置にジャンプすることができます。
本記事はその辺りの機能をざっくりと紹介します。以降を読んで興味を持った人は、もっと深く調べて試してみるも良いし、合わないと思った人は使わなくても別に良いと思います。
マークはファイルやバッファを超えてジャンプできる
マークの凄さを感じるために、以下のように適当に2つのファイルを作成してみよう
$ vim file1.txt
file1
:wq
$ vim file2.txt
file2
:wq
file1.txt
file2.txt
がある状態で、今度はファイル名を指定せずにvimを立ち上げる。
おもむろに<C-o>
を叩くとfile2.txt
が読み込まれる。
file2
さらに<C-o>
をもう一度叩くと、今度はfile1.txt
が読み込まれる
file1
今度は<C-i>
を叩いてみる。またfile2.txt
が表示される
file2
さらに<C-i>
を叩くと、先程vimを立ち上げた際の、空のバッファが表示される
おわかりいただけただろうか?vimのジャンプを自動でマークした上、それを元にファイルを跨いでジャンプすることができるのだ。
設定されているマークの一覧は、:marks
コマンドで確認することができ、以下のようにfile1.txt
file2.txt
が設定されていることがわかる。
:marks
mark 行 列 ファイル/テキスト
' 1 0
0 1 0 file2.txt
1 1 0 file1.txt
そして、<C-o>
は一つ前のマークへ、<C-i>
は一つ次のマークへジャンプすることができるコマンドだったのだ。
自分でマークをつけてみよう
まず覚えておこう
- 自分でつけられるマークには、1文字の名前をつける
- 各マークの名前は、a~z, A-Zいずれかの文字を割り当てる
- ただしa~zのマークはそのバッファ内でしか使うことができず、ファイルをまたぐことが出来ない
- A-Zのマークは、バッファを閉じても残り続け、ファイルをまたぐことが出来る
それを踏まえて、適当にコードを書いてみる。コードの内容は本記事には関係ない
classMarkdefinitialize(name)@name=nameenddefsay_helloputs"Hallo, #{@name}"endend
上記コードのうち、say_hello
メソッドにマークをつけて、後から戻ってこれるようにしたい。
その場合、マークしたい行(以下では|
がカーソルとする) にカーソルを合わせて、mA
コマンドを叩く。
classMarkdefinitialize(name)@name=nameend|defsay_helloputs"Hallo, #{@name}"endend
ma
mA
のm
はマークを付けるという意味で、この場合のA
がマークの名前になる。そのため、BというマークならmB
だし、zというマークにするならmz
と叩く
画面上には何も表示されないので少々不安だが、これでsay_hallo
が定義された行に対して、a
という名前でマークされた。
:marks
コマンドでマークの一覧を確認できるので、見てみよう。
mark 行 列 ファイル/テキスト
' 1 0 class Mark
A 7 2 def say_hello
0 12 24 Mark.new('Joh').say_hello
(以下略)
A
に、対象の行がマークされていることがわかる。
では作成したファイルは閉じて、再度vimで空のバッファを開いてみよう。
$ vim
この状態で、以下のように`{マーク名}のようなコマンドを叩くと、先程マークしたファイルが読み込まれ、マークした行にカーソルが移動してくれる
`A
classMarkdefinitialize(name)@name=nameend|defsay_helloputs"Hallo, #{@name}"endend
もちろん、ユーザが定義したマークを使った場合もジャンプの履歴は残るので、<C-o>
及び<C-i>
でも行き来することができる。
覚えておきたいコマンドリスト
コマンド | 内容 |
---|---|
:marks | マーク一覧を表示する |
m{マーク名} | カーソル位置にマークを設定 |
`{マーク名} | マークのカーソル位置にジャンプ |
'{マーク名} | マークの行の先頭にジャンプ |
d,c,y`{マーク名} | 現在のカーソルから、マークのカーソル位置まで削除、編集、ヤンク |
delmarks {マーク名} | マークを削除 |
delmarks! | a-zのマークを全て削除 |