Vimでレジスタを貼り付ける全パターン(ノーマル/挿入/コマンドライン)
ノーマルモードのpしか知らないと、インサートモードの最中にヤンクした内容を貼り付けたいとき、わざわざEscで抜けてからpを打ち、またiで戻る、という無駄な往復をしてしまいます。モードごとに専用の貼り付け方法が用意されています。ここでの「レジスタ」は無名レジスタに限らず、名前付きや読み取り専用など48種類すべてに共通する記法です。
| キー | これだけ覚える |
|---|---|
| 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を知ってからはインサートモードを維持したまま挿入できるようになり、地味に文章を書くリズムが崩れなくなりました。
まとめ
レジスタの貼り付けはノーマルモードのp/Pと、それ以外のモード共通のCtrl-r系に集約されます。モードをまたぐたびに手が止まる感覚があるなら、この2系統を意識すると整理しやすくなります。複数箇所を集めてから貼り付けたいときは名前付きレジスタの追記モードと組み合わせると効率が上がります。