【保存必須】Vimレジスタ完全解説 これだけは知っておきたい10種類のレジスタ

最近では、Neovimのプラグインが優秀すぎて、
素のVimの機能を使用しなくても、
十分便利に使うことがなってきたかもしれません。

しかし、プラグインを使わずとも、
Vimには、便利な機能がたくさんあり、
それらを使いこなしてこそ、
真のVimmerであり、Vim教徒です。

本記事では、そんなVimの機能の中でも
やや応用的でありながら、絶対に外すことはできない、
レジスタについて完全解説します。

本記事の動画は、下記になります。
やや抽象的な説明が多いので、
動画でのハンズオンのほうがわかりやすいかもしれません。

レジスタとは?

レジスタとは、
Vim独自のクリップボードのようなもので、
ヤンク(yy)や削除(dd)とかしたものを、
このレジスタという領域に格納しています。

https://vim-jp.org/vimdoc-ja/usr_10.html

ヤンクや削除といった、
Vimの基本コマンドを復習したい方は、
こちらの記事をご参考ください。

[st-card myclass="st-no-shadow" id="11" label="参考" pc_height="" name="" bgcolor="#cccccc" color="#ffffff" webicon="st-svg-file-text-o" readmore="on" thumbnail="on" type="text"]

さて、レジスタの中身を確認するには、

:reg

で確認できます。

実行すると、こんな感じで、
現在のレジスタに格納されている一覧を確認することができます。

Nameという列に、
0とか1のような数字から、
aとかjみたいなアルファベット、
%や:のような記号が存在します。

これらは、レジスタの名称なのですが、
それぞれ異なる役割を持っています。

これらについて順に解説していきます。

レジスタの種類

以下、順番にそれぞれのレジスタの名称と、
役割について解説していきます。

無名レジスタ ("")

無名レジスタとは何でしょうか?

これは、平たく言うと
デフォルトのレジスタのような感じです。

  1. 無名レジスタ "" quote_quote quotequote
    このレジスタには、コマンド "d", "c", "s", "x" 等で削除されたテキストや、"y" 等
    のコピーコマンドでコピーされたテキストが蓄えられる。特定のレジスタが指定されて
    いてもいなくても関係ない (例えば "xdd でもこれが使われる)。つまり無名レジスタ
    は最後に使われたレジスタを指していると考えられる。よって、大文字レジスタを使っ
    て名前つきレジスタにテキストを追加したときも、無名レジスタの中身は、その名前つ
    きレジスタと同じになる。
    例外はレジスタ '_' である。"_dd は、削除されたテキストをどのレジスタにも蓄え
    ない。
    無名レジスタの中身は、レジスタを指定しない貼り付けコマンド (p や P) で使うこと
    ができる。加えて、このレジスタは '"' という名前で使うことができる。これは、使
    うときには二重引用符 '"' を 2 個打ち込むということである。レジスタ "" に対する
    書き込みはレジスタ "0 にも書き込むことになる。
    {Vi ではレジスタの内容はファイルを変更するときに失われ、'"' もない}

vim help (:h "")

つまり、何も考えず、
ヤンクとかコピーとか削除をしていると、
この無名レジスタに格納されて、
貼り付けの際も、単にpとかで行うと、
この無名レジスタの内容が貼り付けられるということです。

そしてこの後、順に解説しますが、
aとかの名前付きレジスタを指定して、
そこにヤンクとかをしても、
この無名レジスタにも同じものがヤンクされます。

ちなみに、削除・ヤンク・プットは、
レジスタを指定して実行することができます。

"{register}
・名前付きレジスタ(a)からpを実行したい場合
"ap
・無名レジスタ("")からpを実行したい場合
p または ""p
→ レジスタを指定しないと無名レジスタが使われる。

すなわち、"と押した後に、
register名を指定すると、
そのレジスタの内容を、ヤンクなりできるという感じです。

ヤンクレジスタ("0)

yコマンドを使うと、
無名レジスタに加えて、
ヤンクレジスタにもコピーされます。

ヤンクレジスタは、0のことです。

このレジスタは、dとかxのようなコマンドを使っても、
書き変わらないので、ヤンクしたものを貼り付けるために、
ddしたら、レジスタが上書きされちまった問題を
防ぐことができます。

番号付きレジスタ ("1 ~ "9)

こちらは、削除とか変更をした際に、
1から順番に9までのレジスタにその内容が格納されていく。

ヤンクレジスタに対する、削除レジスタみたいな感じです。

名前付きレジスタ("a ~ "z "A ~ "Z)

これらのレジスタは、ユーザーが自由に使えるレジスタにあたります。
なにかをレジスタに格納したいとき、
番号付きレジスタとかに入れてしまうと、
ddとかを繰り返すうちに消えてしまうおそれがあるが、
名前付きレジスタは、指定しない限りは書き換わりません。

小文字と大文字の違いは、
小文字指定の場合、すでに格納されている内容が消えるのに対し、
大文字指定の場合、すでに格納されている内容への追記になります。

小削除用レジスタ ("-)

これはあまり聞かないレジスタかもしれません。
(それにあまり使う機会も多くないかなと思います。)

helpでは、

  1. 小削除用レジスタ "- quote_- quote-
    このレジスタには、範囲が1行以下の削除コマンドで削除されたテキストが蓄えられる。
    ただし、コマンドに ["x] で別のレジスタ名を指定したときはこれには蓄えられない。

vim help (:h "-)

となっています。

helpでは、1行以下となっているので、
ddで削除した場合も格納されるとおもいきや、
格納されませんでした(筆者環境の場合)

ビジュアルモードとかで、単語単位の削除で、
明示的にレジスタを指定しなかった場合に、
このレジスタに格納されます。

読み取り専用レジスタ (": ". "% )

":

一番最近に実行されたコマンドラインが、
格納されるレジスタです。

実行したいときは、コマンドラインモードで、
@ :で実行できます。

".

こちらは、最後に挿入されたテキストが、
格納されるレジスタです。

"%

カレントファイル名が、
格納されるレジスタです。

ブラックホールレジスタ("_)

消去専用レジスタのことです。

vimではddとかをしても、
事実上は、削除ではなくカットにあたり、
番号付きレジスタとかに格納されるが、
このレジスタを指定することで文字通りの削除になります。

システムクリップボードレジスタ("+)

システムのクリップボードのレジスタは+にあります。

X11ウインドウシステムには、プライマリと呼ばれるクリップボードがあるらしく、
*がそのレジスタにあたります。

windowsやmacでは、これはないので、
+も*もほとんど同じようなものといった感じかなと思います。

Vimのhelpでは、選択範囲レジスタとなっており、
難しく書かれているが、要はクリップボードの内容が、
格納されているレジスタで、環境とかOSによって、
+とか*になったりする感じと思っていただければ大丈夫です。

最終検索パターン用レジスタ ("/ )

これは割りとそのまんまで、
最後に/ とかで検索したパターンの内容が、
格納されるレジスタです。

コマンドで検索することができ、
例えばこれでhlsearchのハイライトを変えることができます。

:let @/ = "Plug"

この場合、Plugというワードでハイライトします。

まあそんなに使う機会はないかもしれませんが。

Expressionレジスタ("=)

これは、insertモードで<C-r>=を実行して、
電卓のように、計算式を入力できます。

ここまで来ると、レジスタというより電卓に近い気もします。

コマンドラインモードで、<C-r>=を実行しても、
このモードに入ることは可能です。

round(150.123)みたいに、
関数のようなものを使うことも可能です。

いやでも、いつ使うねんっていうぐらい、
使い所が難しいレジスタのような気もします。

こいつを使いこなせるようになったら、
結構なVim職人かなと思います。

よく使うレジスタ

以上、vimのレジスタについて紹介しました。
平たく言えば、レジスタとは、
複数種類のクリップボードみたいな感じですね

本来なら一つしかないクリップボードが、
たくさんあるなんて、やっぱりVimってすごいですね。

Vimのhelpでは、
代替ファイルレジスタというものもありましたが、
ニッチすぎるかつ、一生使わなくてもおかしくないので、
取りあげませんでした。

今回挙げた中でも、
一番使うのは、やはり無名レジスタで、
あとは番号付きレジスタや名前付きレジスタでしょうか。

レジスタを的確に使いこなせるようになると、
一気にVimmerとしてのレベルが上がるので、
ぜひともマスターしていただけると。

[st-card myclass="st-no-shadow" id="873" label="あわせて読みたい" pc_height="" name="" bgcolor="#cccccc" color="#ffffff" webicon="st-svg-file-text-o" readmore="on" thumbnail="on" type="text"]