第 9 章:レジスタとクリップボード
これまで「Vim のクリップボード」という言葉を何度も使いました。たとえば dd は 削除した内容を、yy はコピーした内容をクリップボードへ保存します。しかし yy で 1 行コピーした後、x で何文字か削除してから p で貼り付けると、コピーした行では なく直前に削除した文字が出てきた、という経験はないでしょうか。
原因は、Vim の「クリップボード」が一つではなく、**レジスタ(Registers)**という 一組の保存領域だからです。レジスタを理解すれば、コピーと貼り付けを自在に扱えます。
レジスタを確認する
:regまたは:registersすべてのレジスタ内容を表示:reg aレジスタaの内容だけを表示
まず
:regを実行してください。"で始まるレジスタが一覧表示されます。 以下では種類ごとに説明します。
無名レジスタ
"" は無名レジスタ、つまり通常「デフォルトのクリップボード」と呼んでいるもの です。レジスタを指定しない削除(d、x)、変更(c)、ヤンク(y)はすべて ここへ書き込まれ、p / P はデフォルトでここから貼り付けます。
冒頭の問題はこれで説明できます。yy の後に実行した x が無名レジスタを上書き したため、p は x で削除した内容を貼り付けたのです。
名前付きレジスタ
"a から "z は 26 個の名前付きレジスタです。内容の保存先と取得元を自分で 決められるため、互いに干渉しません。
"ayy現在の行をレジスタaへコピー"apレジスタaから貼り付け"add現在の行を削除してレジスタaへ保存
大文字を使うと、上書きせずに追記します。
"Ayy現在の行をレジスタaの既存内容へ追記
ヒント:冒頭の問題なら、最初に "ayy で行を a へ保存します。その後いくら x を実行しても、最後に "ap で安全に元の行を貼り付けられます。
ヤンクレジスタ
"0 はヤンク専用レジスタです。直近の y の内容だけを保持し、d や x では 汚染されません。
"0p最後にヤンクした(削除ではない)内容を貼り付け
これも冒頭の問題を解決する方法です。yy の後に好きなだけ削除し、"0p で コピーした行を貼り付けます。
特殊レジスタ
Vim には自動管理される読み取り専用または特殊なレジスタもあります。
"+システムクリップボード(macOS/Linux で他のアプリと共有)"*選択クリップボード(X11 の primary selection。macOS ではほぼ"+と同じ)"%現在のファイル名":直前のコマンドラインコマンド".最後に挿入したテキスト"/最後の検索パターン"-小削除レジスタ(1 行未満の削除)"_ブラックホールレジスタ。書き込んだ内容を破棄(後述)
注意:"+ を利用できるかは Vim が +clipboard 機能付きでビルドされているかに よります。:echo has('clipboard') で確認でき、1 なら対応しています。
ブラックホールレジスタ
"_ は非常に便利です。現在のクリップボードを上書きせずに削除したいときは、 "_d を使います。
"_ddどのレジスタにも影響を与えず現在の行を削除
挿入モードでレジスタを使う
挿入モードで Ctrl-r に続けてレジスタ名を押すと、内容を直接挿入できます。
Ctrl-r aレジスタaの内容を挿入Ctrl-r "無名レジスタを挿入Ctrl-r %現在のファイル名を挿入
次のテキストでレジスタ操作を練習してください。
1 行目:"ayy でこの行をレジスタ a へコピー
2 行目:"byy でこの行をレジスタ b へコピー
x で何文字か適当に削除し、無名レジスタを上書きする
この行の下で "ap と "bp を別々に実行すると、それぞれの内容が貼り付けられる?
さらに、この行で "_dd を実行してから p を押すと、先ほど x で削除した内容が残っている?Vim がシステムクリップボードに対応しているなら、
"+yyで行をコピーし、 ブラウザや別のエディタへ移動してCmd/Ctrl-vで貼り付けてください。
レジスタは Vim の効率的なコピーと貼り付けの基礎です。理解したら 第 7 章のマクロを振り返ってください。マクロも一連の操作を レジスタへ記録したものだと分かり、すべてがつながります。
次の章ではマークとジャンプを紹介します。