• Tips
  • Vim Pro with Vim Registers

Vim Pro with Vim Registers

What are Vim Registers?

近年の IDE 等では見ない機能として、Vim にはレジスタというものがあります。 これは主に 2 つの用途があり、ヤンクレジスタとマクロを記録するところとして使用します。

まず、現在レジスタの中身を確認するためには :registers (short :reg) というコマンドを実行します。 画面下によくわからない表が出てきたと思います。

もし一行も無ければ、yy とキーバインドを押して今カーソルのある行をヤンク(コピー)してもう一度開きましょう。 先程コピーした行の内容が表示されていると思います。

Name (名前) の行の、"_ ("のあとの文字)がレジスタ名で、その右がレジスタに格納された値です。

Yank Buffers

まずレジスタの 1 つ目の使用用途は、ヤンクレジスタとして使用することです。

先程 yy で 1 行をヤンクした場合、そのヤンクした内容は "" レジスタに書き込まれました。 そしてp (paste)というキーバインドを押すことで "" レジスタの内容をペーストすることができます。

実は、yyp などは "" をデフォルトで使用することになっていて、逆にいえば別のレジスタを指定することもできます。 試しに "a レジスタにヤンクしてみましょう。この場合 "ayy というキーバインドでレジスタを指定してヤンクできます。

:reg でレジスタ一覧を表示すると、a レジスタに値が入ったことがわかると思います。

ペーストは同様に "ap とすることでできます。

名前付きヤンクレジスタいつ使うねんというと、例えばコーディング中に頻繁に書きたい文字列をあえて上書きされないヤンクレジスタに入れておくことで、その内容が必要になったらレジスタを指定してペーストするだけで打ち込むことができます。

また、特殊な意味を持つヤンクレジスタが何個かあります。 つまり、自分でレジスタ指定してなにかする場合は基本的にはこれらじゃないレジスタを使いましょう。一般的には [a-z] を使用します。

  • [0-9] : yy でヤンクした履歴が 0 から 9 へ順番に押し出されていく。
  • +, * : System Clipboard (Vim 以外のプログラムでコピーしたものがここで見れる)
  • . : 直近に Insert Mode で書き込んだ内容
  • : : 直近に Command Mode で書き込んだ内容 ( 直前に実行したコマンド )
  • / : 直近に検索した内容
  • %, # : 今開いているファイル名、直前に開いていたファイル名
  • - : ciw, diw などのキーバインドで消去した内容 (Short delete)

ちなみに私は <leader>y, <leader>p で System Clipboard の内容をコピペできるようにしています。 (<leader>yiw や、 Visual Mode で選択したあとに<leader>y といったことも下の設定でできるようになります。)

" vimscript
" クリップボードからのペースト
xnoremap <silent> y y`]
xnoremap <silent> p p`]
nnoremap <silent> P P`]
noremap <Leader>y "+y
noremap <Leader>p "+p
noremap <Leader>P "+P

また、"ap は Normal Mode でレジスタ指定してペーストするキーバインドですが、Insert Mode 中にレジスタ内の内容を書き込むには、<C-r> (Control + r) のあとにレジスタ名を入力するとできます。

Macro

Vim マクロは Vim の中で最も強力な機能と言ってもいいと思います。 Vim がキーボードドリブンなことを最大限活かした機能で、使えるようになると編集速度がバク上がりします。

簡単に言えば、打ったキーをすべてレジスタに保存してくれる機能で、保存された内容を再生することができます。 つまり、いまさっきやった作業をもう一度自動で繰り返すといったことができます。

マクロを収録するためには、qa (a レジスタにマクロを保存する) というキーバインドを押します。(a は何でも良く、一般的には q (qq) が用いられる。) 押した直後から実行するキーバインドや文字入力がすべて記録され、止めるには再度 q を押します。

マクロを再生するには @a と押します。

Macro Example

練習として、マクロをよく使う場面を紹介します。ぜひ一緒にやってみましょう。 ネットで ↓ こんな一覧を見つけて、これを python の配列に書き換えたいとします。

  • おすすめアニメ一覧
    • SPY×FAMILY
    • パリピ孔明
    • 名探偵コナン
    • 涼宮ハルヒの憂鬱
    • ノーゲーム・ノーライフ
    • 弱虫ペダル
    • ワールドトリガー
    • さくら荘のペットな彼女

Record and Play a Macro

マクロを記録します。SPY×FAMILY の行にカーソルを置き、qa と押し、aレジスタにマクロの記録を開始します。

I""<BS><Esc>A""<BS>,<Esc>j と打って、q でマクロの収録を終わります。なお、<BS> はバックスペース、<Esc>はエスケープキーです。ちなみに、"" と 2 回打って消している理由は、環境によっては"を打つと勝手に対となるように後ろにもう一つ入れてしまうことがあるからです。

CommandExplanation
I行の空白じゃない一番前の文字の直前にカーソルを置き、Insert Mode に入る
""<BS><Esc>Insert Mode 内で "" とうち、一つ消して <Esc> で Normal Mode に戻る
A行の最後の文字の後ろで Insert Mode に入る
""<BS>,<Esc>Insert Mode 内で ", とうち <Esc> で Normal Mode に戻る
j下の行に行く(これ重要)
qマクロの記録を止める

その後、7@a とキーバインドを実行することで、このマクロを 7 回実行するという意味になります。マクロの最後に j として下の行に移ってることで、連続的に実行することが可能になっています。

また、:reg で確認すると a レジスタにさっき入力したコマンド列が記録されているのがわかると思います。

Last updated on October 17, 2022