Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

[vim] マーク ざっくり入門

$
0
0

前提

  • vimちょっとわかる
  • マーク機能は知らない、あんまり使ってない

マークとは

  • vimでは ``で、直前に居たカーソル位置に移動(ジャンプ)することができます
  • vimではg;で、直前に編集を行った位置に移動(ジャンプ)することができます

(めっちゃ便利なので知らなかった人は↑だけでも覚えていってください)

では直前に居た位置や編集した位置をvimはどうやって覚えているんでしょうか?それがマークです。

vimは直前の場所や編集した位置を良い感じに勝手にマークしてくれますが、もちろんマークをユーザが自由に設定して、好きなようにマーク位置にジャンプすることができます。

本記事はその辺りの機能をざっくりと紹介します。以降を読んで興味を持った人は、もっと深く調べて試してみるも良いし、合わないと思った人は使わなくても別に良いと思います。

マークはファイルやバッファを超えてジャンプできる

マークの凄さを感じるために、以下のように適当に2つのファイルを作成してみよう

$ vim file1.txt
file1.txt
file1
:wq
$ vim file2.txt
file2.txt
file2
:wq

file1.txtfile2.txtがある状態で、今度はファイル名を指定せずにvimを立ち上げる。

おもむろに<C-o>を叩くとfile2.txtが読み込まれる。

file2.txt
file2

さらに<C-o>をもう一度叩くと、今度はfile1.txtが読み込まれる

file1.txt
file1

今度は<C-i>を叩いてみる。またfile2.txtが表示される

file2.txt
file2

さらに<C-i>を叩くと、先程vimを立ち上げた際の、空のバッファが表示される

おわかりいただけただろうか?vimのジャンプを自動でマークした上、それを元にファイルを跨いでジャンプすることができるのだ。

設定されているマークの一覧は、:marksコマンドで確認することができ、以下のようにfile1.txtfile2.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のマークは、バッファを閉じても残り続け、ファイルをまたぐことが出来る

それを踏まえて、適当にコードを書いてみる。コードの内容は本記事には関係ない

mark.rb
classMarkdefinitialize(name)@name=nameenddefsay_helloputs"Hallo, #{@name}"endend

上記コードのうち、say_helloメソッドにマークをつけて、後から戻ってこれるようにしたい。
その場合、マークしたい行(以下では|がカーソルとする) にカーソルを合わせて、mAコマンドを叩く。

mark.rb
classMarkdefinitialize(name)@name=nameend|defsay_helloputs"Hallo, #{@name}"endend
ma

mAmはマークを付けるという意味で、この場合の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
mark.rb
classMarkdefinitialize(name)@name=nameend|defsay_helloputs"Hallo, #{@name}"endend

もちろん、ユーザが定義したマークを使った場合もジャンプの履歴は残るので、<C-o>及び<C-i>でも行き来することができる。

覚えておきたいコマンドリスト

コマンド内容
:marksマーク一覧を表示する
m{マーク名}カーソル位置にマークを設定
`{マーク名}マークのカーソル位置にジャンプ
'{マーク名}マークの行の先頭にジャンプ
d,c,y`{マーク名}現在のカーソルから、マークのカーソル位置まで削除、編集、ヤンク
delmarks {マーク名}マークを削除
delmarks!a-zのマークを全て削除

稚拙なvim記事ですがよろしければ


Viewing all articles
Browse latest Browse all 5608

Trending Articles