Skip to content

第 9 章:レジスタとクリップボード

これまで「Vim のクリップボード」という言葉を何度も使いました。たとえば dd は 削除した内容を、yy はコピーした内容をクリップボードへ保存します。しかし yy で 1 行コピーした後、x で何文字か削除してから p で貼り付けると、コピーした行では なく直前に削除した文字が出てきた、という経験はないでしょうか。

原因は、Vim の「クリップボード」が一つではなく、**レジスタ(Registers)**という 一組の保存領域だからです。レジスタを理解すれば、コピーと貼り付けを自在に扱えます。

レジスタを確認する

  • :reg または :registers すべてのレジスタ内容を表示
  • :reg a レジスタ a の内容だけを表示

まず :reg を実行してください。" で始まるレジスタが一覧表示されます。 以下では種類ごとに説明します。

無名レジスタ

"" は無名レジスタ、つまり通常「デフォルトのクリップボード」と呼んでいるもの です。レジスタを指定しない削除(dx)、変更(c)、ヤンク(y)はすべて ここへ書き込まれ、p / P はデフォルトでここから貼り付けます。

冒頭の問題はこれで説明できます。yy の後に実行した x が無名レジスタを上書き したため、px で削除した内容を貼り付けたのです。

名前付きレジスタ

"a から "z は 26 個の名前付きレジスタです。内容の保存先と取得元を自分で 決められるため、互いに干渉しません。

  • "ayy 現在の行をレジスタ a へコピー
  • "ap レジスタ a から貼り付け
  • "add 現在の行を削除してレジスタ a へ保存

大文字を使うと、上書きせずに追記します。

  • "Ayy 現在の行をレジスタ a の既存内容へ追記

ヒント:冒頭の問題なら、最初に "ayy で行を a へ保存します。その後いくら x を実行しても、最後に "ap で安全に元の行を貼り付けられます。

ヤンクレジスタ

"0 はヤンク専用レジスタです。直近の y の内容だけを保持し、dx では 汚染されません。

  • "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 章のマクロを振り返ってください。マクロも一連の操作を レジスタへ記録したものだと分かり、すべてがつながります。

次の章ではマークとジャンプを紹介します。