この記事では、Vimの「レジスタの種類」についてご紹介します。
[解答] 74種類
Vimのレジスタは、非常に種類が沢山あります。
便利ですが、とても覚えるのが大変ですね。。。
レジスタの種類
レジスタの全種類と役割は下記になります。
No | レジスタ | 説明 |
1 | “ | 無名レジスタ |
2-11 | “0 ~ “9 | 番号付きレジスタ |
12 | “- | 小削除用レジスタ |
13-64 | “a ~ “z “A ~ “Z | 名前付きレジスタ |
65-68 | “: “. “% “# | 読み取り専用レジスタ |
69 | “= | Expression レジスタ |
70-72 | “* “+ “~ | ビジュアル選択領域レジスタ |
73 | “_ | 消去専用レジスタ |
74 | “/ | 最終検索パターン用レジスタ |
レジスタは、必ず ” (ダブルクォーテーション)を頭に付けて、一文字で指定します。
無名レジスタ
ヘルプの説明はこちら。
1. 無名レジスタ “” quote_quote quotequote
change – Vim日本語ドキュメント
このレジスタには、コマンド “d”, “c”, “s”, “x” 等で削除されたテキストや、”y” 等
のコピーコマンドでコピーされたテキストが蓄えられる。特定のレジスタが指定されて
いてもいなくても関係ない (例えば “xdd でもこれが使われる)。つまり無名レジスタ
は最後に使われたレジスタを指していると考えられる。よって、大文字レジスタを使っ
て名前つきレジスタにテキストを追加したときも、無名レジスタの中身は、その名前つ
きレジスタと同じになる。
例外はレジスタ ‘_’ である。”_dd は、削除されたテキストをどのレジスタにも蓄え
ない。
無名レジスタの中身は、レジスタを指定しない貼り付けコマンド (p や P) で使うこと
ができる。加えて、このレジスタは ‘”‘ という名前で使うことができる。これは、使
うときには二重引用符 ‘”‘ を 2 個打ち込むということである。レジスタ “” に対する
書き込みはレジスタ “0 にも書き込むことになる。
{Vi ではレジスタの内容はファイルを変更するときに失われ、'”‘ もない}
端的に書かれていないので分かりづらいのが、Vimヘルプの難点です。
簡単にまとめると、格納先のレジスタを指定しない場合、つまりは通常ヤンク/削除したら文字列が格納されるレジスタを無名レジスタと呼びます。
こちらに個別の記事を書きましたので、ご覧ください。
番号付きレジスタ
ヘルプの説明はこちら。
2. 番号付きレジスタ “0 から “9 quote_number quote0 quote1
change – Vim日本語ドキュメント
quote2 quote3 quote4 quote9
これらのレジスタには、コピーや削除コマンドによってテキストが蓄えられる。
番号付きレジスタの 0 には、一番最近にコピーしたテキストが蓄えられるが、コピー
の際に [“x] として別のレジスタ名を指定したときは、これには蓄えられない。
番号付きレジスタ 1 には、一番最近に削除したり変更したテキストが蓄えられるが、
コマンドに別のレジスタ名を指定したり、削除や変更したテキストが1行以下だったり
したときは、これには蓄えられない (そのときは小削除用レジスタが使われる)。例外
は、以下の移動コマンドと削除コマンドを組み合わせたときである。%, (, ),
`, /, ?, n, N, {, }。このときは必ずレジスタ “1 が使われる (これ
はVi互換の動作である)。削除や変更したテキストが1行以下だったときは、レジスタ
“- も使われる。 Note: これらの文字はマップ可能である。例: % は matchit プラ
グインによってマップされている。
削除や変更が行われるたびに、レジスタ 1 の内容はレジスタ 2 に、レジスタ 2 の内
容はレジスタ 3 に、という風にずれていく。レジスタ 9 の内容は失われる。
{Vi では番号付きレジスタの内容はファイルを変更する際に失われる。レジスタ 0 は
ない}
こちらも端的に書かれていないので分かりづらいです。
簡単にまとめると、下記の通りです。
レジスタ | 解説 |
---|---|
“0 | コピーした文字列が格納されるレジスタ |
“1 ~ “9 | 行削除した文字列が格納されるレジスタ。 1行以下の文字列を削除した場合は、別途 小削除用レジスタに格納される。 次に行削除コマンドを実行すると、”1レジスタから”2レジスタに内容を移して格納される。 以降は、 直前の番号レジスタの文字列が格納され、”9 以降は破棄される。 イメージ: 行削除 → “1 → “2 → “3 → … → “9 → バツ |
なお、ヘルプにもある通り、レジスタを指定してして格納した場合には、これらのレジスタは使用(格納)されません。
小削除用レジスタ
ヘルプの説明はこちら。
3. 小削除用レジスタ “- quote_- quote-
change – Vim日本語ドキュメント
このレジスタには、範囲が1行以下の削除コマンドで削除されたテキストが蓄えられる。
ただし、コマンドに [“x] で別のレジスタ名を指定したときはこれには蓄えられない。
ヘルプの太文字の部分、そのままですね。
名前付きレジスタ
一番難解なレジスタかもしれません。ヘルプの説明はこちら。
4. 名前付きレジスタ “a から “z または “A から “Z quote_alpha quotea
change – Vim日本語ドキュメント
これらのレジスタが使われるのは、ユーザーに指定されたときのみである。コピーや削
除の際にこれらのレジスタを小文字で指定すると、コピーや削除されたテキストが蓄え
られ、元から入っていたテキストは消える。大文字で指定すると、元から入っていた内
容の後ろに新しいテキストを付け加える。‘cpoptions’ にフラグ ‘>’ が入っていると、
新しいテキストの前に改行が挿入される。
こちらも簡単にまとめると、下記の通りです。
レジスタ | 説明 |
---|---|
“a ~ “z | 毎回文字列を上書きして格納するレジスタ |
“A ~ “Z | a ~ z のレジスタの文字列に追記して格納するレジスタ |
“a ~ “z レジスタは分かり易いですが、問題は “A ~ “Z です。上の説明で分かりますか?
例を挙げてみます。例えば下記のような文章があった場合。
Vimが大好きなユーザーたち NeoVimもきっと好きになれるに違いない
ここで「が大好きな」を “a に格納してみます。該当の文字列をビジュアル選択して、「”ax」とキー入力します。
Vimユーザーたち NeoVimもきっと好きになれるに違いない
同じように「もきっと好き」を 該当の文字列をビジュアル選択して、「”Ax」とキー入力します。
Vimユーザーたち NeoVimになれるに違いない
最後に改行を入れて、「”ap」とキー入力して、レジスタa に格納した文字列を貼り付けます。
Vimユーザーたち NeoVimになれるに違いない が大好きな もきっと好き
“A で格納する場合は、改行と選択した文字列を追記することになるわけです。
アニメーションでみると、だいたいこんな感じです。
”A ~ ” Z レジスタの使いどころが難しいかもしれませんね。
読み取り専用レジスタ
特殊なレジスタです。ヘルプの説明はこちら。
5. 読みとり専用レジスタ “: と “. と “%
読みとり専用レジスタには ‘%’ と ‘#’ と ‘:’ と ‘.’ がある。コマンド “p”, “P”, “:put” および CTRL-R でのみ使うことができる。
quote_. quote. E29
“. 最後に挿入されたテキストが蓄えられる (挿入モードのコマンド
CTRL-A や CTRL-@ で挿入されるものと同じテキストである)。 Note:
これはコマンドライン上での CTRL-R では使えないことに注意。動作
が少し異なり、テキストを貼り付けるというより挿入するような動作
をする (挿入されるテキストに ‘textwidth’ 等のオプションが影響
する)。
quote_% quote%
“% カレントファイルの名前が蓄えられる。
quote_: quote: E30
“: 一番最近に実行されたコマンドラインの内容が蓄えられる。例: 前回
のコマンドラインによるコマンドを実行するには、”@:” が使える。
コマンドラインがこのレジスタに蓄えられるのは、コマンドライン内
にコマンドが最低でも1文字打ち込まれたときである。そのため、コ
マンドが完全にキーマッピングから実行されたときには、この内容に
変化はない。
{Vimが +cmdline_hist 機能付きでコンパイルされたときのみ有効}6. 代替ファイルレジスタ “#
change – Vim日本語ドキュメント
カレントウィンドウの代替ファイルの名前を含む。これは CTRL-^ コマンドがどのよ
うに働くかを変更する。
このレジスタは書き込み可能で、主にプラグインがこのレジスタを変更した後で元に戻
すためである。バッファ番号を許容する:
let altbuf = bufnr(@#)
…
let @# = altbuf
バッファ番号が越えるあるいはそのバッファが存在しない場合はエラー E86 を返す。
また存在するバッファ名でのマッチングを許容する:
let @# = ‘buffer_name’
与えられた名前にマッチしたバッファが1つより多い場合はエラー E93 を、与えられ
た名前にマッチするバッファがない場合は E94 を返す。
こちらも端的に書かれていないので分かりづらいですが、要は太文字の箇所を意味するレジスタです。 実用的には 、”# なんかは覚えなくても良いかもしれません。
この中でも、”% は使いどころが結構あるかもしれませんね。
Expression レジスタ
こちらも少し特殊なレジスタです。ヘルプの説明はこちら。
7. Expression レジスタ “= quote_= quote= @=
change – Vim日本語ドキュメント
これは、本当はテキストを蓄えるレジスタではないが、レジスタを使うコマンドで式を
評価するために使える。この expression レジスタは読み取り/書き込み可能である。
” または CTRL-R の後に ‘=’ を打ち込むと、カーソルはコマンド行に移動し、あらゆ
る式を入力することができる (expression を参照)。コマンドラインから入力できる
普通の編集用コマンドは、式用の特別履歴も含め、全て使用可能である。<CR> を打ち
込んでコマンドライン入力を終了させると、式の結果が計算される。<Esc>を打ち込ん
で終了させると、式は破棄される。式が入力されないときは、(コマンド “/” と同様)
前回の式が使われる。
式を評価した結果は文字列でなければならない。評価した結果が数値なら、文字列に変
換される。”p” と “:put” コマンドの場合、結果が浮動小数点数なら文字列に変換され
る。リストの場合、各要素が文字列に変換され、それぞれが 1 行として挿入される。
辞書または FuncRef はエラーメッセージが出る(string()を使って変換する)。
レジスタ “= が “p” で使われると、文字列は <NL> 文字 {訳注: New Line — 改行}
の所で分割される。文字列が <NL> で終わっていたら、これは行単位のレジスタと見な
される。
こちらはヘルプがかなり分かりづらいです。
要は、この Expression レジスタを使うと、計算などの処理を実行して挿入することが可能です。
例えば、20+80 の計算結果を Expression レジスタに格納して、結果を貼り付けるとこうなります。
ここで実行できる計算は、こちらを参考にしてください。
ビジュアル選択領域レジスタ
こちらも少し特殊なレジスタです。ヘルプの説明はこちら。
8. 選択範囲レジスタ “* と “+ と “~
change – Vim日本語ドキュメント
これらのレジスタは、GUIで、選択されたテキストを蓄えたり取り出すために使われる。
quotestar と quoteplus を参照。クリップボードが利用できないときは、無名レ
ジスタが代わりに使われる。Unixでは+xterm_clipboardが有効になっているときだけ
クリップボードを利用できる。
Note “* と “+ に区別があるのは X11 システムのみであることに注意。違いについて
は x11-selection を参照。MS-Windowsでは “* と “+ は実際には同義で、クリップ
ボード gui-clipboard を使用する。
quote_~ quote~ <Drop>
この読み込み専用の “~ レジスタは最後にドラッグアンドドロップされたテキストを提
供する。何かがVimにドロップされたとき、”~ レジスタがそれで埋められ、<Drop>仮想
キーが通知される。このキーをリマップして使うことができる。デフォルトでは(全て
のモードにおいて) “~ レジスタの内容をカーソルの位置に挿入する。
{+dnd付きでコンパイルされたときのみ有効。現在はGTK GUIでのみ使える。}
Note: “~ レジスタはプレーンテキストをVimにドロップしたときのみ使われる。URIの
リストは内部で扱われる。
こちらはGUI、つまりは主にマウス操作のためのレジスタと言えます。
正直なところ、あまり活躍の機会が無いレジスタです。。
消去専用レジスタ
こちらは独特なレジスタです。ヘルプの説明はこちら。
9. 消去専用レジスタ “_ quote_
change – Vim日本語ドキュメント
このレジスタを指定してテキストを削除しても、{訳注: レジスタには} 何も起こらな
い。そのため、普通のレジスタに影響を与えずに削除が行える。このレジスタから貼り
付けようとしても、何も出てこない。
通常の削除操作では、文字列の削除と一緒にヤンク(コピー)が無名レジスタに行われます。
そのため、どのレジスタにも格納せずに削除したい場合には、この 消去専用レジスタ “_ を指定することになります。
最終検索パターン用レジスタ
。ヘルプの説明はこちら。
10. 最終検索パターン用レジスタ “/ quote_/ quote/
change – Vim日本語ドキュメント
最後に使われた検索パターンが蓄えられる。これはコマンド “n” やオプション
‘hlsearch’ による強調表示に使われる。
このレジスタは :let で変更できるので、‘hlsearch’ による強調表示を、実際に検
索を行わずに別のマッチに適用することができる。このレジスタを使ってコピーしたり
削除することはできない。
Note 関数から抜けると、この値は関数に入る前の値に復元される。
function-search-undo
@/
レジスタには、コマンド :let で書き込むことができる :let-@。例:
:let @/ = “the”
レジスタを指定せずに貼り付けコマンドを使うと、最後に書き込みが行われたレジスタ
が使われる (その内容は無名レジスタと同じである)。混乱したときは、コマンド
:dis を使うとレジスタの内容が分かる (このコマンドは、全てのレジスタの内容を
表示する。無名レジスタは ‘”‘ と示される)。
そのままです。/ コマンドで検索をかけた後、その検索対象に設定した文字列を挿入したい場合に使うレジスタです。
他のレジスタと違って、/ コマンドと “/ レジスタ の関係は分かり易いかもしれません。
このVimコマンドの補足情報
- 利用頻度
- 便利さ
- 覚え易さ
関連するVimヘルプ
Vimからは、下記のコマンドでヘルプを確認できます。
:help " (各レジスタ名) :help copy-move :help quote_number :help quote- :help quote_alpha :help quote_: :help quote_. :help quote_% :help quote_# :help quote_= :help quote_* :help quote_+ :help quote_~ :help quote_ :help quote_/
ヘルプで検索するときは、通常は大文字小文字は識別されませんので、どちらでも構いません。
ちょっと分量はありますが、こちらをまとめて読むとかなり使い込める様になりますね。
とはいえ、ヘルプ独特の分かりにくさがあるため、このブログを書いているわけですが。。。
参考書籍
こちらの書籍が参考になります。
Vim/neovim関連の書籍で、もっとも評判が良くてバイブルと呼んでる人もいる一冊です。Vim/neovimのバージョンに依存しない沢山のTips形式で、その表題通りに「思考のスピードで編集」できるようになるノウハウが詰まっています。その高い評価は Amazon のレビューからも分かる通りです。Vimmer なら必ず一度は読んでおいて間違いありません。
こちらもVim関連の書籍で評価が高い書籍の一冊です。vim-jpで見かける上級Vimmer(Vimサポーターズ)の皆様による、Vimを実践で使ったノウハウからプラグイン関連の情報が詰まっています。日本の Vim界隈を知る上でも是非一読しておきたい一冊です。
Vim/neovim の設定ファイルやプラグインなど、Vim script に関するノウハウがいくつも詰まった一冊です。日本で Vim Script をここまで深く解説している唯一の書籍と言えます。Vim力を伸ばしたいと考えるなら、絶対に避けては通れない書籍でしょう。