レジスタ練習クイズ6問(選択式)
レジスタはモードによって貼り付け方が変わるため、頭では分かっていても咄嗟に出てこないことがあります。6問の選択式クイズで、キー操作を自分の頭で組み立てる練習ができます。
検証環境:macOS 26.4.1 + Vim 9.1(included patches 1-1752)と Neovim 0.12.4。掲載している:registersの出力、6問の正解、そして外した選択肢を実際に打った結果は、両方で確認しています。6問とも両者で違いは出ませんでした。
解く前に
各問題を見て、まず自分なりの答えを頭の中で決めてから選択肢を確認すると効果的です。答え合わせだけを目的にすると記憶に残りにくいので、実際にVimを開いて手を動かしながら確認するとさらに定着しやすくなります。
手を動かす下準備
「レジスタの中身がどう変わるか」は、頭で追うより一度見てしまうほうが早いです。適当なファイルに4行ほど書いて、次の3操作を順に実行してみてください。
yy " 1行ヤンク
j dd " 次の行へ移って1行削除
j x " さらに次の行で1文字削除
この状態で:registersを実行すると、それぞれ別のレジスタに入っていることが一目で分かります。手元のVim 9.1の出力から、いまの3操作で変わった4行を抜き出したものです。
Type Name Content
c "" d
l "0 alpha^J
l "1 bravo^J
c "- d
最後にやったxの結果が無名レジスタ""と小削除レジスタ"-に、ヤンクした行が"0に、削除した行が"1に入っています。この画面を一度見てから解くと、以下の問題の答えが「暗記」ではなく「確認」になります。左端のlとcは行単位か文字単位かの区別で、貼り付けたときの入り方が変わります。
問題1
インサートモードで、名前付きレジスタ"aの内容を挿入するキー操作はどれですか?
- "ap
- Ctrl-r a
- Ctrl-a
"a
答えを見る
2. Ctrl-r a。インサートモードでのレジスタ挿入はCtrl-r系で統一されています。"apはノーマルモード用の記法です。モードごとの記法で一覧にしています。
外した3つは、いずれもレジスタとは別の動きをします。1番と4番はインサートモード中の文字入力なので、"apや"aがそのまま本文に残るだけです。3番のCtrl-aはインサートモード専用のキーとして実在しますが、入るのは「直前に挿入したテキスト」で、レジスタaとは関係がありません。手元で"apの3文字を入れた直後に別の行でCtrl-aを押すと、同じ"apがもう一度入りました。押しても何も起きないわけではないぶん、紛らわしい選択肢です。
この操作にはひとつ注意点があり、"ayyのような行単位のヤンクは末尾の改行まで持っています。aaaの行を"ayyでヤンクしてから、cccの行末でX、Ctrl-r a、Yの順に打ったところ、cccXaaaとYの2行に割れました。行の途中へ入れたいときはyiwのように文字単位でヤンクしておきます。
問題2
ノーマルモードで、番号付きレジスタ"3の内容をカーソルの後に貼り付けるキー操作はどれですか?
- Ctrl-r 3
- "3p
- 3p
- "-3p
答えを見る
2. "3p。ノーマルモードでレジスタを指定する記法は"{レジスタ名}を貼り付けコマンドの前に置きます。番号付きレジスタがどう更新されていくかは番号付きレジスタの仕組みで詳しく扱っています。
1番のCtrl-rは、ノーマルモードではやり直し(redo)です。起動直後に押すと「Already at newest change」と出るだけですが、直前にuで取り消していた場合はその取り消しが取り消されます。続けて打った3は次のコマンドを待つ回数指定として画面の右下に残るので、貼り付けは起きないまま編集履歴だけが動きます。4つの中でいちばん実害の出る誤答です。
3番の3pは無名レジスタを3回貼り付けます。ddを5回続けた直後に試すと、直前に消した1行が3行ぶん入り「3 more lines」と表示されました。4番の"-3pは小削除レジスタを3回貼り付けます。レジスタ名は"の直後の1文字だけなので、-がレジスタ名で3が回数という読み方になります。"3のような2文字のレジスタは無く、番号付きレジスタも1文字である点がこの選択肢の引っかけです。
問題3
直近にヤンクした内容を、その後の削除操作に関係なく貼り付けたいときに使うレジスタ指定はどれですか?
- ""p
- "0p
- "1p
- "-p
答えを見る
2. "0p。"0はヤンク専用のレジスタで、途中の削除操作の影響を受けません。無名レジスタ("")は削除のたびに上書きされてしまいます。
外した3つが何を出すかを、targetの行をyyでヤンクしてから次のjunkの行をddで消した状態で確かめました。1番の""pと3番の"1pは、どちらもjunkが出ます。この2つは結果が同じなので、片方を疑って選び直しても正解には近づきません。4番の"-pはE353: Nothing in register -で止まりました。ddは1行以上の削除なので小削除レジスタには何も入らず、レジスタが空のままだったためです。どの削除がどこへ入るかは番号付きレジスタの仕組みに条件をまとめてあります。
問題4
削除した内容をどのレジスタにも残さず、完全に破棄したいときに使うのはどれですか?
- "-dd
- "_dd
- "0dd
- ".dd
答えを見る
2. "_dd。ブラックホールレジスタ"_に書き込んだ内容はどこにも保存されません。実際に打つ前後で:registersを見比べても、無名レジスタも"0も"1も値が変わりませんでした。
外した3つは、どれも内容を破棄しません。1番の"-ddを打つと、小削除レジスタ"-だけでなく無名レジスタと"1にも消した行が入りました。名前に小削除と付いていても、明示的に指定すれば行単位の削除でも書き込まれます。3番の"0ddも同じで、消した行が"0と無名レジスタに残ります。4番の".ddは読み取り専用のレジスタを書き込み先に指定した形で、エラーが出ないかわりに1行も消えません。VimでもNeovimでもv:errmsgは空のまま、バッファの行数も変わりませんでした。
行をまとめて捨てる:gと:dの組み合わせにもレジスタを渡せます。:g/DEBUG/dと_を付けずに実行したときは無名レジスタと"1が最後に消した行で埋まりましたが、:g/DEBUG/d _と付けた場合はどちらも手つかずのままでした。ブラックホールレジスタ自体の位置づけはレジスタ全体の一覧にあります。
問題5
今開いているファイルの名前をノーマルモードで貼り付けたいときはどれですか?
- ".p
- ":p
- "%p
- "#p
答えを見る
3. "%p。"%はカレントファイル名を保持する読み取り専用レジスタです。中身は文字単位なので、行を分けずにカーソルの直後へ差し込まれます。
外した3つも実在するレジスタで、1番の".には直近に挿入したテキスト、2番の":には直近に実行したExコマンド、4番の"#には直前に開いていた別ファイル(alternate file)の名前が入ります。まぎらわしいのは4番で、これもファイル名を持つレジスタです。ただし"#が埋まるのは別のファイルへ移った瞬間だけなので、1つのファイルを開いたまま何時間編集しても空のままです。手元でテキストを書き足して:set nuまで実行したあとに"#pを押しても、VimとNeovimのどちらもE23: No alternate fileを返しました。4つがいつ書き換わるかは読み取り専用レジスタの使い道で個別に扱っています。
問題6
コマンドラインモードで:%s/と打った状態から、レジスタaの内容をパターンとして挿入したいときはどれですか?
- "ap
- Ctrl-r a
- Ctrl-v a
- @a
答えを見る
2. Ctrl-r a。コマンドラインモードもインサートモードと同じCtrl-r系の記法を使います。1番の"apと4番の@aは、コマンドラインでは打った文字がそのまま並びます。手元では:%s/"apと:%s/@aになりました。@aはノーマルモードならレジスタaをマクロとして実行するコマンドですが、コマンドラインでは記号と文字が1つずつ入るだけです。3番のCtrl-vは「次に打った文字をそのまま入れる」キーなので、続けてaを押すとaという1文字が入ります。レジスタ名と同じ文字が現れるため、画面だけを見ていると挿入できたつもりになりやすい選択肢です。
正解の記法を選べても、入った中身が置換コマンドとして成立するかは別の話です。src/lib/util.jsという行をヤンクしてから:%s/に続けてCtrl-r aを押すと、コマンドラインは:%s/src/lib/util.jsになり、そのまま実行するとE488: Trailing characters: util.jsで止まりました。/が区切りとして読まれるためです。"ayyのように行単位でヤンクしていた場合は、末尾の改行が^Mとして一緒に入ります。区切りを:%s#src/lib/util.js#PATH#gのように変えれば、同じ内容がそのまま通りました。
こうした選択式の練習を自分で作ってみると、普段なんとなく指が覚えている操作でも、いざ言葉で説明しようとすると詰まる部分が意外と多いことに気づきます。特にブラックホールレジスタは知識としては知っていても、とっさに使う場面を思いつけないことが多くありました。
まとめ
レジスタ操作はモードによって記法が変わる点が最大のつまずきポイントです。"{reg}系とCtrl-r系という2系統に整理して覚えると混乱しにくくなります。レジスタの種類そのものはレジスタ全体の一覧で扱っています。
6問の外した選択肢を実際に打ってみて分かったのは、そのほとんどが実在するキーだということです。Ctrl-aもCtrl-vもノーマルモードのCtrl-rも、押せば必ず何かが起きます。エラーで止まってくれたのは中身が空のレジスタを貼ろうとしたときだけで、書き込めないレジスタを宛先にした".ddはメッセージも出さずに何もしませんでした。記法を間違えたことに画面から気づけるとは限らないので、迷った時点で:registersを開いて確かめるほうが速く済みます。