最近では、Neovimのプラグインが優秀すぎて、
素のVimの機能を使用しなくても、
十分便利に使うことがなってきたかもしれません。
しかし、プラグインを使わずとも、
Vimには、便利な機能がたくさんあり、
それらを使いこなしてこそ、
真のVimmerであり、Vim教徒です。
本記事では、そんなVimの機能の中でも
やや応用的でありながら、絶対に外すことはできない、
レジスタについて完全解説します。
本記事の動画は、下記になります。
やや抽象的な説明が多いので、
動画でのハンズオンのほうがわかりやすいかもしれません。
レジスタとは?
レジスタとは、
Vim独自のクリップボードのようなもので、
ヤンク(yy)や削除(dd)とかしたものを、
このレジスタという領域に格納しています。
https://vim-jp.org/vimdoc-ja/usr_10.html
ヤンクや削除といった、
Vimの基本コマンドを復習したい方は、
こちらの記事をご参考ください。
-
参考ターミナルインストールから始めるVim/Neovim8つの基本キーバインド
本記事では、0からVimやNeovimについて、解説していきます。 Vimって何?っていう人や、ターミナルもほとんど使っていないという人でも、最低限これだけは知っておきたいVimのキーバインドを本記事 ...
続きを見る
さて、レジスタの中身を確認するには、
:reg
で確認できます。
実行すると、こんな感じで、
現在のレジスタに格納されている一覧を確認することができます。
Nameという列に、
0とか1のような数字から、
aとかjみたいなアルファベット、
%や:のような記号が存在します。
これらは、レジスタの名称なのですが、
それぞれ異なる役割を持っています。
これらについて順に解説していきます。
レジスタの種類
以下、順番にそれぞれのレジスタの名称と、
役割について解説していきます。
無名レジスタ ("")
無名レジスタとは何でしょうか?
これは、平たく言うと
デフォルトのレジスタのような感じです。
vim help (:h "")
- 無名レジスタ "" quote_quote quotequote
このレジスタには、コマンド "d", "c", "s", "x" 等で削除されたテキストや、"y" 等
のコピーコマンドでコピーされたテキストが蓄えられる。特定のレジスタが指定されて
いてもいなくても関係ない (例えば "xdd でもこれが使われる)。つまり無名レジスタ
は最後に使われたレジスタを指していると考えられる。よって、大文字レジスタを使っ
て名前つきレジスタにテキストを追加したときも、無名レジスタの中身は、その名前つ
きレジスタと同じになる。
例外はレジスタ '_' である。"_dd は、削除されたテキストをどのレジスタにも蓄え
ない。
無名レジスタの中身は、レジスタを指定しない貼り付けコマンド (p や P) で使うこと
ができる。加えて、このレジスタは '"' という名前で使うことができる。これは、使
うときには二重引用符 '"' を 2 個打ち込むということである。レジスタ "" に対する
書き込みはレジスタ "0 にも書き込むことになる。
{Vi ではレジスタの内容はファイルを変更するときに失われ、'"' もない}
つまり、何も考えず、
ヤンクとかコピーとか削除をしていると、
この無名レジスタに格納されて、
貼り付けの際も、単に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では、
vim help (:h "-)
- 小削除用レジスタ "- quote_- quote-
このレジスタには、範囲が1行以下の削除コマンドで削除されたテキストが蓄えられる。
ただし、コマンドに ["x] で別のレジスタ名を指定したときはこれには蓄えられない。
となっています。
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としてのレベルが上がるので、
ぜひともマスターしていただけると。
-
あわせて読みたい【Vim/NeoVimマクロ】作成/保存/追記/定義/格納場所など使用例も解説
本記事では、Vimのマクロについて解説します。 マクロは、Vimの機能の中でも、応用的なトピックだと思いますが、使いこなせると便利なので、本記事で作成、保存、定義、格納場所といった基本事項を解説します ...
続きを見る