Astroの光線のサムネイル。

pubDate: 2024-03-04

author: sakakibara

vim

公開学習

コピーが思うようにいかない

vimを使用している中で混乱しがちな機能がコピー・ペーストだ。
主に、ペーストする際にコピーした内容が思っていたものと違うことがある。 その原因の一つがレジスタの概念を理解していないことが挙げられる。

例えば、以下のfunction内のxxxargに変更したいとする。

yiwargをコピーした後にdiwで単語を削除し、sift-pでペーストするとargではなくxxxがペーストされてしまう。

言ってしまえば d は削除というよりカットの役割をしているのだ。

レジスタの種類

レジスタとはテキストを保持するコンテナだ。
x, s, d{motion}, c{motion}, y{motion}はレジスタを設定するためのコマンドと言える。
例えばd{motion}{motion}で指定したテキストをレジスタに格納し、対象のテキストを削除する。
もはや削除の機能などおまけのようなものだ。
そのうちよく使われるレジスタは主に4つだ。

問題なのはどのydがどのレジスタに格納され、pがどのレジスタからペーストするかだ。

レジスタは"aのように"{register}で指定する。 また、レジスタは:registersまたは:regで確認できる。

無名レジスタ("")

無名レジスタは"で表される。

デフォルトではx, s, d{motion}, c{motion}, y{motion}コマンドは無名レジスタに格納される。

pでペーストすると無名レジスタがペーストされる。
p""pと同じである。

これが上記の問題の原因だ。
つまり、yiwargを無名レジスタに格納し、
diwxxxを無名レジスタに格納してargが上書きされる。

無名レジスタは上書きが頻発するので、文字通りの”レジスタ”としての役割を果たすことは少ない。

詳しくは[:h quote_quote]

ヤンクレジスタ(“0)

ヤンクレジスは"0で表される。

y{motion}でコピーするとその内容はヤンクレジスタに格納される。

"0pでペーストするとヤンクレジスタに格納された内容がペーストされる。

詳しくは[:h quote0]

名前付きレジスタ(“[a-zA-Z]))

ヤンクレジスは[a-zA-Z]で表される。
ここでは"rとしよう。

"rは例えば"ryiwで設定できる。 "rの内容は"rpでペーストできる。

正直ヤンクレジスタよりもだいぶ使い勝手がいい。 詳しくは[:h quote_alpha]

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

ブラックホールレジスタは"_で表される。

"_d{motion}で削除すると、削除した内容はブラックホールレジスタに格納される。 というよりゴミ箱に格納してるようなものだ。“/dev/null”のような存在だ。

詳しくは[:h quote_]

その他のレジスタ(”[%#.:/])

commanddescription
”%現在のファイル名
”#代替のファイル名
”.直前の削除や挿入
”:直前のExコマンド
”/直前の検索パターン

詳しくは[:h registers]

入れ替え操作テクニック

ちょっとした入れ替えテクニックを紹介する。

commanddescription
xpカーソル位置の文字と次の文字を入れ替える
ddpカーソル位置の行と次の行を入れ替える

その他のレジスタ

ここでは紹介しなかったが、実際にはレジスタは10種類ある。 大きく分けてレジスタには10種類ある。

nameregister
無名レジスタ(unnamed register)""
数字レジスタ(10 numbered register)“0 to “9
削除レジスタ(small delete register)“-
名前付きレジスタ(26 named register)“a to “z or “A to “Z
read-onlyレジスタ(3 read-only register)”:, ”., “%
代替バッファレジスタ(alternate buffer register)“#
式レジスタ(expression register)“=
選択レジスタ(selection register)”* and “+
ブラックホールレジスタ(black hole register)“_
検索パターンレジスタ(last search pattern register)“/