vimのヤンク履歴とヒストリ貼り付け

どうしてもエディタに欲しい機能というのは人によって違うと思います。
自分的にはヒストリ貼り付けがその一つです。
「3行目と5行目と12-14行目をコピーして、20行目にコピーした順番通り貼り付ける」とか。
vimだとヤンクした履歴は残りませんが、削除履歴は9個残っています。

まず確認するために :di でレジスタの状態を見てみます。
"0 はヤンクした文字列専用のレジスタ
"1 - "9 は削除した文字列が削除順に並んでいます。


そこで何カ所かコピーしたい行をdduで削除&アンドゥしてから

"1P.....

とやるとヒストリ順に貼り付けされます。

"1P.u.u.

だと特定の行を確認しながら選んで貼り付けられたり、

"3p

のようにレジスタを指定しての貼り付けも当然出来ます。
これはviからある由緒正しいトリックなので何処でも使えます。

けれど、ヤンクするためにいちいちソースに編集履歴を残すのもアレなんで次のスクリプトを使ってます。

nmap <silent> Y   Y:CpR0toR1<CR>
vmap <silent> Y   Y:CpR0toR1<CR>
vmap <silent> y   y:CpR0toR1<CR>
omap <silent> y   y:CpR0toR1<CR>
command! CpR0toR1 if @0 =~ "\<NL>"|let @9=@8|let @8=@7|let @7=@6|let @6=@5|let @5=@4|let @4=@3|let @3=@2|let @2=@1|let @1=@0|endif

これを .vimrc に設定してYとか3yyとかやるとヤンクした行が削除レジスタにコピーされるので、あとは

"1P.....

でヒストリ貼り付けが出来ます。

ただ、y3j や ye の様に y のあとに y 以外のモーションが来るヤンクには有効ではありません。
そういうわけで単語単位とかのヤンクは反映されません。


自分的には行単位の貼り付けがしたいので十分実用ですが、単語単位のヤンクでも反映されるようにならないかということで operatorfunc を利用してのチャレンジを試みましたが挫折しました。
結構 y は複雑な処理をしていて面倒です。どうすればいいんだー。

yankring.vimとか使えばいいのだろうけど、大げさすぎるというか、基本コマンドを置き換えられるのはどうも気分的にちょっと……。
この辺はemacsだとしょせんコマンド全部lispだから気にならないんだけれど。


というような話をしたら、「そもそもコピペでソースを書くな」と偉い人に言われてぐうの音もでませんですよ。