Vimの名前付きレジスタで複数箇所を集める("a〜"z / "A〜"Z)
ファイルのあちこちに散らばった行を1箇所にまとめたいとき、無名レジスタでは1つずつ移動して貼り付ける以外に方法がありませんでした。名前付きレジスタの追記モードを使えば、複数箇所のヤンクを1つのレジスタに集めてから、まとめて貼り付けられます。
目次(7項目)
| キー | これだけ覚える |
|---|---|
| "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
追記した内容の区切り
追記モードで行単位のヤンク(yyなど)を繰り返すと、それぞれの内容は改行で区切られて積み重なります。文字単位のヤンク(ylなど)を追記した場合は、改行なしでそのままつながる点に注意してください。行として扱いたいか、文字列として連結したいかで、ヤンクする単位を意識すると安心です。
26個あるので用途ごとに割り当てられる
名前付きレジスタはa〜zの26個あります。1つの作業で使い切ることはまずないので、複数の作業を並行して進めるときに用途ごとにレジスタを割り当てておくと、無名レジスタの上書きに悩まされずに済みます。たとえば「aは移動先の関数名」「bは削除予定のコメント」のように、頭の中でレジスタごとに役割を決めておくと管理しやすくなります。正式な仕様は公式ヘルプ(:h registers)にまとまっています。
マクロと組み合わせるとさらに便利
「検索して次へ移動し、大文字レジスタに追記する」という一連の操作をマクロに記録しておけば、@aを連打するだけで何十箇所でも自動的に収集できます。手動で繰り返すより格段に速くなります。
レビュー前にコード中の一時的なデバッグ用printを洗い出したいとき、検索してnとAレジスタへの追記を繰り返し、最後にまとめて別バッファに貼り付けて確認する、という流れを組んでから、見落としがぐっと減りました。1つずつ個別にメモを取るより効率的だと実感しました。慣れるまでは小文字と大文字を押し間違えて上書きしてしまうこともあったので、最初のうちは:registersで確認しながら進めると安心です。
まとめ
名前付きレジスタの大文字は追記モードという特別な動作をします。複数箇所の収集はこの仕組みを使えば手作業を減らせます。レジスタ全体の一覧はこちらで扱っています。集めた内容をモードごとにどう貼り付けるかはこちらを参照してください。