vimのvisualモードで連続でペーストして書き換えられるようにする
vimを使っているとvisualモードで選択してコピーした単語を貼り付けて文字を書き換えるということをすることは多々あると思います。 しかし、設定によっては連続して書き換えようとすると一度目に書き換えられた文字がヤンクされてしまっていて、それをペーストしようとするので同じ文字を連続でペーストできないという問題が発生してしまいます。
例えば以下の文字で、一行目のhogeをヤンクしてfugaとpiyoを書き換えるようにすることを考えます。
hoge fuga piyo
次のようにfugaは問題なく書き換えられます。
hoge hoge piyo
しかし次にpiyoも書き換えようとすると以下のようにfugaがペーストされてしまいます。
hoge hoge fuga
結論を先にいうと、これは.vimrc
にxnoremap p "_dP
を指定すれば解決します。
解説
では詳細を解説します。
まずこのような問題が発生するのはクリップボードとvimを連携している方だと思います。
vimにはレジスタというものがあります。
試しにvim上で:registers
と打ち込むとその一覧が出力され、左側に"0
や"*
、"%
などが表示されると思います。
これはOSがもつクリップボードのようなもので、ヤンクした内容をそれぞれの領域に保存しています。この領域を指定してヤンクすることができますし、もちろんこの領域を指定してペーストすることも出来ます。ググってみるとやり方はすぐに見つかります。
クリップボードと連携した時はブラウザなどで⌘+C
で保存した文字は、vim上では"*
の領域に保存され、ペーストする際はデフォルトで"*
の領域からペーストするようになります。
とてもベンリで重宝するのですが、visualモードで文字を書き変えた時には、書き変えられた値が"*
の領域に保存されてしまうのです。それが原因で先程のような問題が発生してしまうのです。
そこで解決策として、ビジュアルモードでペーストを実行した時にレジスタを"*
に保存しないようにするという方法をとります。
それが先程紹介したxnoremap p "_dP
です。
ここでは、どこにも保存せず消去するために用意されている消去専用レジスタ"_
を利用して、ペースト時レジスタに文字が保存されないようにしています。
これでvisualモードで連続で書き換えられないという問題が解決されるのではないかと思います。