Marks

vim の help をちゃんと読んでみよう series そのに。 "Marks" ( :help mark-motions, :help 03.10 ) に関して。

  • mark
    • buffer 上のどこか。見えない。 jump ( 後述 ) することができる。
    • 任意の位置を mark することができる。
      • buffer local な "a-z" の 26 個と global な "A-Z" の 26 個。 "a-z" だとか "A-Z" だとかは a, b, ... , z と A, B, ... , Z の範囲の一文字の識別子。
        • ちなみに "a-z" のほうは該当 buffer が buffer list から消えると消滅する。
    • vim が勝手に mark する位置もある。
      • 直近 10 個の file 履歴である "0-9" 。
      • [ ( U+005b LEFT SQUARE BRACKET ), ] ( U+005d RIGHT SQUARE BRACKET ) がそれぞれ直前に change / yank した text の最初の位置と最後の位置。
      • < ( U+003c LESS-THAN SIGN ), > ( U+003e GREATER-THAN SIGN ) がそれぞれ直前の visual mode で選択した最初の位置と最後の位置。
      • ` ( U+0060 GRAVE ACCENT ) もしくは ' ( U+0027 APOSTROPHE ) は直前の jump 前の位置ということらしいけど jump する際に使う command によってどちらを使うかが変わる ( 後述だけど :help '' 見た方が速い ) 。
      • " ( U+0022 QUOTATION MARK ) 前回 buffer を閉じたときの cursor 位置。
      • ^ ( U+005e CIRCUMFLEX ACCENT ) 前回 insert mode を終了した位置。
      • . ( U+002e FULL STOP ) 前回変更した位置。
      • ( ( U+0028 LEFT PARENTHESIS ), ) ( U+0029 RIGHT PARENTHESIS ) mark ? と思ったけど help に載っているのでそういうことらしい。それぞれ現在の文の最初と最後の位置。
      • { ( U+007b LEFT CURLY BRACKET ), } ( U+007d RIGHT CURLY BRACKET ) これらも mark 扱い。それぞれ現在の段落の最初と最後。
    • ここらへん register ( :help registers ) と似てるけど全然関係ないらしい。 vim は引き出しがおおい。
  • jump with marks
    • で、 mark 位置へ jump するには以下の normal command のどれかを使う。
      • ` ( U+0060 GRAVE ACCENT ) は mark した位置に飛ぶ。
      • ' ( U+0027 APOSTROPHE ) は mark した行の最初の非 blank 文字に飛ぶ。
      • g`, g' はそれぞれ buffer を飛び越えない限り jumplist を更新しない `, '
    • 上記 4 つのうちどちらかを打ったあとに mark の識別子を打ち込むと jump する。
    • この mark への jump 操作は operator のあとに指定する motion として使えるらしい ( "A-Z" は同じ buffer 内での移動の場合のみ motion として指定が可能 ) 。あーそうか、これでやっと操作範囲を blockwise に変更したりするのが生きてくるのかな ( :help o_CTRL-V ) 。
  • :marks, :delmarks
    • mark の管理用 ex-command 。
    • mark は見えないのでわからなくなったら :marks で確認する。 mark を使い始める際はこの command を頻繁に打ってどういう操作でどう mark が変わるのかに慣れるのがいいかも。
    • 必要のなくなった mark を消すのが :delmarks 。複数形が示す通り複数の識別子を認識してくれる。 bang をつけると小文字 mark をすべて消去するらしい。
    • こまめに掃除しておくと :marks がごちゃごちゃしなくていい感じ。

他はあんまり使わなさそうというか script で使うのが前提なのかなーと思われる command だったりするので ( ]' とか :lockmarks とか ) ちょっと無視。とりあえず /TODO<CR> -> mt をしてから作業するとかにすると物理的に window をたくさん開けなくても編集が楽になるかもしれないとか .vimrc を 'A で呼び出せるようにしておくとかもアリかな。