Vimでレジスタを貼り付ける ノーマル/挿入/コマンドライン
ノーマルモードのpしか知らないと、インサートモードの最中にヤンクした内容を貼り付けたいとき、わざわざEscで抜けてからpを打ち、またiで戻る、という無駄な往復をしてしまいます。モードごとに専用の貼り付け方法が用意されています。貼り付ける側だけを扱うので、コピーの取り方(yyや矩形選択)は別の記事に置いてあります。ここでの「レジスタ」は無名レジスタに限らず、名前付きや読み取り専用など48種類すべてに共通する記法です。
目次(9項目)
| キー | これだけ覚える |
|---|---|
| p / P | ノーマル/ビジュアルで無名レジスタを貼り付け |
| "{reg}p | ノーマル/ビジュアルで指定レジスタを貼り付け |
| Ctrl-r {reg} | インサート/コマンドラインで指定レジスタを挿入 |
ノーマルモード/ビジュアルモード
| キー | 動作 |
|---|---|
| p | カーソルの後に無名レジスタを貼り付け |
| P | カーソルの前に無名レジスタを貼り付け |
| "{レジスタ}p | 指定したレジスタをカーソルの後に貼り付け |
| "{レジスタ}P | 指定したレジスタをカーソルの前に貼り付け |
{count}pのように数字を前置きすれば、その回数分繰り返して貼り付けられます。
インサートモード
| キー | 動作 |
|---|---|
| Ctrl-r {レジスタ} | 指定したレジスタを挿入 |
| Ctrl-r Ctrl-r {レジスタ} | 特殊文字を含めてそのまま挿入 |
| Ctrl-r Ctrl-o {レジスタ} | 自動インデントを無視して挿入 |
Hello │ ← インサートモード
Hello world
Escで抜けずにその場でレジスタの内容を挿入できるのが最大の利点です。Ctrl-r Ctrl-rとCtrl-r Ctrl-oの違いは、レジスタの中にバックスペースのような制御文字が含まれる場合や、自動インデントの影響を受けたくない場合に効いてきます。普段はCtrl-r単体で困ることは少ないです。Ctrl-r =で式を評価しながら挿入するexpressionレジスタも、この系統の応用のひとつです。
コマンドラインモード
| キー | 動作 |
|---|---|
| Ctrl-r {レジスタ} | 指定したレジスタを挿入 |
| Ctrl-r Ctrl-r {レジスタ} | 特殊文字を含めてそのまま挿入 |
| Ctrl-r Ctrl-o {レジスタ} | 自動インデントを無視して挿入 |
コマンドラインモードでもインサートモードと同じキー体系が使えます。:%s/を打っている途中でヤンクしておいた文字列を挿入したいときなど、検索・置換コマンドを組み立てる場面で重宝します。
マウスでの中央ボタン貼り付けとの関係
Linux環境では中ボタンクリックでの貼り付けもよく使われますが、これは内部的にはCtrl-r Ctrl-o "*相当の動作(選択レジスタからの、自動インデント無視の貼り付け)にあたります。マウス操作とキーボード操作が同じ仕組みの上に成り立っていると分かると、挙動の一貫性が理解しやすくなります。挙動の正確な定義は公式ヘルプ(:h registers)を参照してください。
文章を書いている途中で、別の場所にヤンクしておいた単語を挿入したくなるたびに、以前はEscで抜けてp、またaで戻るという無駄な動きをしていました。Ctrl-rを知ってからはインサートモードを維持したまま挿入できるようになり、地味に文章を書くリズムが崩れなくなりました。
貼り付けでインデントが崩れる
Vimの外からコピーしたテキストを挿入モードで貼り付けると、字下げが1行ごとに深くなっていくことがあります。autoindent が自動で入れた字下げに、貼り付けた側の字下げが積み重なるためです。
ターミナルが括弧付きペーストに対応していれば、Vim 8.0以降は自動で判別してくれるので何もしなくて構いません。崩れる環境では :set paste で一時的に自動整形を止め、貼り終わったら :set nopaste で戻します。
:set paste
:set nopaste
set pastetoggle=<F2> " キー1つで切り替える
Vimの中のレジスタから貼るなら、そもそも挿入モードを使わずノーマルモードの p を使えば崩れません。貼り付け先の字下げに合わせたいときは ]p です。
Ctrl-r のバリエーション
挿入モードの Ctrl-r には、そのままの形で入れるかどうかを選べる続きがあります。設定ファイルの行をそのまま貼りたいときは、こちらを使うと自動整形が効きません。
Ctrl-r a " レジスタ a を挿入(自動整形が効く)
Ctrl-r Ctrl-r a " そのままの文字として挿入
Ctrl-r Ctrl-o a " 字下げを付けずに挿入
Ctrl-r Ctrl-p a " 字下げを整えて挿入
普段は Ctrl-r だけで足り、崩れたときに Ctrl-r Ctrl-o を思い出せれば十分です。4つとも覚える必要はありません。
コマンドラインで打たずに済ませる
コマンドラインでも Ctrl-r が使えますが、加えて画面から文字列を拾うキーがあります。長い変数名を置換したいときに、打ち直さずに済みます。
Ctrl-r Ctrl-w " カーソル下の単語を挿入
Ctrl-r Ctrl-a " カーソル下のWORDを挿入
Ctrl-r Ctrl-f " カーソル下のファイル名を挿入
Ctrl-r % " 開いているファイル名を挿入
置換したい単語の上にカーソルを置いてから :%s/ と打ち、Ctrl-r Ctrl-w を押す、という流れが定番です。打ち間違いが原理的に起きないので、長い識別子ほど効きます。
まとめ
レジスタの貼り付けはノーマルモードのp/Pと、それ以外のモード共通のCtrl-r系に集約されます。モードをまたぐたびに手が止まる感覚があるなら、この2系統を意識すると整理しやすくなります。複数箇所を集めてから貼り付けたいときは名前付きレジスタの追記モードと組み合わせると効率が上がります。
ここで扱ったキーは、ブラウザ上で動くVim道場のコピー先を使い分けるでそのまま試せます。インストールもログインも要りません。