紙の裏のメモ

崖の上のポニョみたいなイントネーションです。坂の上の雲みたいな(ry

vimのvisualモードで連続でペーストして書き換えられるようにする

vimを使っているとvisualモードで選択してコピーした単語を貼り付けて文字を書き換えるということをすることは多々あると思います。 しかし、設定によっては連続して書き換えようとすると一度目に書き換えられた文字がヤンクされてしまっていて、それをペーストしようとするので同じ文字を連続でペーストできないという問題が発生してしまいます。

例えば以下の文字で、一行目のhogeをヤンクしてfugaとpiyoを書き換えるようにすることを考えます。

hoge
fuga
piyo

次のようにfugaは問題なく書き換えられます。

hoge
hoge
piyo

しかし次にpiyoも書き換えようとすると以下のようにfugaがペーストされてしまいます。

hoge
hoge
fuga

結論を先にいうと、これは.vimrcxnoremap p "_dPを指定すれば解決します。

解説

では詳細を解説します。

まずこのような問題が発生するのはクリップボードvimを連携している方だと思います。

vimにはレジスタというものがあります。 試しにvim上で:registersと打ち込むとその一覧が出力され、左側に"0"*"%などが表示されると思います。

これはOSがもつクリップボードのようなもので、ヤンクした内容をそれぞれの領域に保存しています。この領域を指定してヤンクすることができますし、もちろんこの領域を指定してペーストすることも出来ます。ググってみるとやり方はすぐに見つかります。

クリップボードと連携した時はブラウザなどで⌘+Cで保存した文字は、vim上では"*の領域に保存され、ペーストする際はデフォルトで"*の領域からペーストするようになります。

とてもベンリで重宝するのですが、visualモードで文字を書き変えた時には、書き変えられた値が"*の領域に保存されてしまうのです。それが原因で先程のような問題が発生してしまうのです。

そこで解決策として、ビジュアルモードでペーストを実行した時にレジスタ"*に保存しないようにするという方法をとります。 それが先程紹介したxnoremap p "_dPです。

ここでは、どこにも保存せず消去するために用意されている消去専用レジスタ"_を利用して、ペースト時レジスタに文字が保存されないようにしています。

これでvisualモードで連続で書き換えられないという問題が解決されるのではないかと思います。