Vimの名前付きレジスタで複数箇所を集める("a〜"z / "A〜"Z)
ファイルのあちこちに散らばった行を1箇所にまとめたいとき、無名レジスタでは1つずつ移動して貼り付ける以外に方法がありませんでした。名前付きレジスタの追記モードを使えば、複数箇所のヤンクを1つのレジスタに集めてから、まとめて貼り付けられます。
目次(10項目)
| キー | これだけ覚える |
|---|---|
"a〜"z | 実行するたびに内容を上書き |
"A〜"Z | 既存の内容の後ろに追記 |
小文字は上書き、大文字は追記
"ayyを2回実行すると、2回目の内容で1回目が上書きされます。一方"Ayyを複数回実行すると、実行するたびに内容が積み重なっていきます。この大文字版の存在を知らないと、複数箇所を集める作業は無名レジスタと貼り付けの繰り返しになってしまいます。
実践例:ファイル内のTODOコメントを集める
/TODO<Enter>
"Ayy " 1件目をレジスタaに格納
n"Ayy " 次のTODOへ移動して追記
n"Ayy " さらに次のTODOへ移動して追記
G"ap " ファイル末尾に集めた内容を貼り付け
検索で次のマッチへ移動しながら"Ayyを繰り返せば、ファイル中に散らばったTODOコメントを1つのレジスタにまとめられます。
TODO: fix a
TODO: fix b
│ ← 2行を"Ayyで集めた直後
TODO: fix a TODO: fix b TODO: fix a TODO: fix b
:registers を見たところ追記した内容の区切り
追記モードで行単位のヤンク(yyなど)を繰り返すと、それぞれの内容は改行で区切られて積み重なります。文字単位のヤンク(ylなど)を追記した場合は、改行なしでそのままつながる点に注意してください。行として扱いたいか、文字列として連結したいかで、ヤンクする単位を意識すると安心です。
26個あるので用途ごとに割り当てられる
名前付きレジスタはa〜zの26個あります。1つの作業で使い切ることはまずないので、複数の作業を並行して進めるときに用途ごとにレジスタを割り当てておくと、無名レジスタの上書きに悩まされずに済みます。たとえば「aは移動先の関数名」「bは削除予定のコメント」のように、頭の中でレジスタごとに役割を決めておくと管理しやすくなります。正式な仕様は公式ヘルプ(:h registers)にまとまっています。
マクロと組み合わせるとさらに便利
「検索して次へ移動し、大文字レジスタに追記する」という一連の操作をマクロに記録しておけば、@aを連打するだけで何十箇所でも自動的に収集できます。手動で繰り返すより格段に速くなります。
レビュー前にコード中の一時的なデバッグ用printを洗い出したいとき、検索してnとAレジスタへの追記を繰り返し、最後にまとめて別バッファに貼り付けて確認する、という流れを組んでから、見落としがぐっと減りました。1つずつ個別にメモを取るより効率的だと実感しました。慣れるまでは小文字と大文字を押し間違えて上書きしてしまうこともあったので、最初のうちは:registersで確認しながら進めると安心です。
集める前に空にしておく
追記モードの落とし穴は、前の作業で入れた内容が残っていることです。"Ayy から始めると、以前 a に入れていたものの後ろに積まれます。
集め始める1件目だけは小文字("ayy)にして上書きし、2件目以降を大文字にするのが定石です。先に空にしておきたいなら、レジスタに空文字列を代入する方法もあります。
:let @a = '' " レジスタ a を空にする
:let @a = @b " b の内容を a に写す
:registers a " 中身を確認する
集めた内容を別のファイルへ移す
集め終わったら、新しいバッファを開いて貼り付けると1つのファイルにまとまります。分割で開けば、元のファイルを見ながら整理できます。
:new " 空のバッファを分割で開く
"ap " 集めた内容を貼り付ける
:w todo.md " 名前を付けて保存する
複数のファイルにまたがって集める場合も同じ手順で構いません。レジスタはファイルをまたいで保持されるので、バッファを切り替えながら "Ayy を続ければ、全部が1つに積み上がります。
条件で集めるなら :g のほうが速い
集める条件が「この文字列を含む行」のように機械的に書けるなら、1件ずつ拾うよりグローバルコマンドのほうが確実です。同じ大文字レジスタの性質をそのまま使えます。
:let @a = ''
:g/TODO/y A " TODO を含む行を全部 a に集める
1回で終わるうえ、取りこぼしもありません。手で拾うのが向くのは、目で見て選ぶ必要があるときです。グローバルコマンドの記事で条件の書き方を扱っています。
まとめ
名前付きレジスタの大文字は追記モードという特別な動作をします。複数箇所の収集はこの仕組みを使えば手作業を減らせます。レジスタ全体の一覧で扱っています。集めた内容をモードごとにどう貼り付けるかはレジスタの貼り付け方を参照してください。
ここで扱ったキーは、ブラウザ上で動くVim道場のコピー先を使い分けるでそのまま試せます。インストールもログインも要りません。