xmap p <Plug>(yankround-p) xmap gp <Plug>(yankround-gp)
以上のようなマッピングを定義することで、ビジュアルモードでの p
でビジュアル選択している部分と、レジスタの内容を置き換えることが出来ます(ここまでは Vim のデフォルトの挙動と同じです)。
<Plug>(yankround-prev)
<Plug>(yankround-next)
で貼り付けたテキストを置き換えられます。
ところで、yankround は、貼り付け操作を :execute 'normal! p'
で行っていますが、ビジュアルモードから yankround の関数を呼ばれたときにはビジュアルモードが解除されているので、ビジュアルモードに再び入るために、gv
バインドを使うようにしています。
ノーマルモードの gv
は、最後に試用したのと同じ範囲のビジュアルモードを開始します。
その状態から p
バインドで貼り付けを行うのですが、どうも、無名レジスタを使ったときの挙動が妙なのです。
普通にビジュアルモード選択してから、ビジュアルモードを解除した後、gv
して再びビジュアル選択し、p
をしたときには期待通りにテキストの置き換えは行われます(そして無名レジスタには代わりに選択されていた文字列が入ります)。
しかし、ビジュアルモードから:execute 'normal! gvp'
を行ったときには、バッファに何の変化も生じません。
無名レジスタに元々入っていた文字列ではなく削除された文字列で置き換えが行われているのではないでしょうか(つまり、文字列を削除した後削除した文字列を貼り付けているので何も変わらないように見える)。
これが Vim の仕様なのかバグなのか分かりませんが、仕方がないのでビジュアルモード利用時には、レジスタ0
も利用しています。
ですので、yankroundのビジュアルモードでの挙動はレジスタ0
を汚染する仕様になっています。