pubDate: 2024-03-04
author: sakakibara
vimを使用している中で混乱しがちな機能がコピー・ペーストだ。
主に、ペーストする際にコピーした内容が思っていたものと違うことがある。
その原因の一つがレジスタの概念を理解していないことが挙げられる。
例えば、以下のfunction
内のxxx
をarg
に変更したいとする。
yiw
でarg
をコピーした後にdiw
で単語を削除し、sift-p
でペーストするとarg
ではなくxxx
がペーストされてしまう。
言ってしまえば d
は削除というよりカットの役割をしているのだ。
レジスタとはテキストを保持するコンテナだ。
x, s, d{motion}, c{motion}, y{motion}
はレジスタを設定するためのコマンドと言える。
例えばd{motion}
は{motion}
で指定したテキストをレジスタに格納し、対象のテキストを削除する。
もはや削除の機能などおまけのようなものだ。
そのうちよく使われるレジスタは主に4つだ。
問題なのはどのy
やd
がどのレジスタに格納され、p
がどのレジスタからペーストするかだ。
レジスタは"a
のように"{register}
で指定する。
また、レジスタは:registers
または:reg
で確認できる。
無名レジスタは"
で表される。
デフォルトではx, s, d{motion}, c{motion}, y{motion}
コマンドは無名レジスタに格納される。
p
でペーストすると無名レジスタがペーストされる。
p
は""p
と同じである。
これが上記の問題の原因だ。
つまり、yiw
でarg
を無名レジスタに格納し、
diw
でxxx
を無名レジスタに格納してarg
が上書きされる。
無名レジスタは上書きが頻発するので、文字通りの”レジスタ”としての役割を果たすことは少ない。
詳しくは[:h quote_quote]
ヤンクレジスは"0
で表される。
y{motion}
でコピーするとその内容はヤンクレジスタに格納される。
"0p
でペーストするとヤンクレジスタに格納された内容がペーストされる。
詳しくは[:h quote0]
ヤンクレジスは[a-zA-Z]
で表される。
ここでは"r
としよう。
"r
は例えば"ryiw
で設定できる。
"r
の内容は"rp
でペーストできる。
正直ヤンクレジスタよりもだいぶ使い勝手がいい。 詳しくは[:h quote_alpha]
ブラックホールレジスタは"_
で表される。
"_d{motion}
で削除すると、削除した内容はブラックホールレジスタに格納される。
というよりゴミ箱に格納してるようなものだ。“/dev/null”のような存在だ。
詳しくは[:h quote_]
command | description |
---|---|
”% | 現在のファイル名 |
”# | 代替のファイル名 |
”. | 直前の削除や挿入 |
”: | 直前のExコマンド |
”/ | 直前の検索パターン |
詳しくは[:h registers]
ちょっとした入れ替えテクニックを紹介する。
command | description |
---|---|
xp | カーソル位置の文字と次の文字を入れ替える |
ddp | カーソル位置の行と次の行を入れ替える |
ここでは紹介しなかったが、実際にはレジスタは10種類ある。 大きく分けてレジスタには10種類ある。
name | register |
---|---|
無名レジスタ(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) | “/ |