Vim の TextYankPost イベント

Vim 8.0.1394 にてオートコマンドイベント TextYankPost が実装されました。

github.com

ヤンクコマンドなどでレジスタが更新された際に処理をフックすることができます。名前に Yank とありますが、 d コマンドや c などもレジスタを更新するので同様に TextYankPost を呼びます。このパッチはイベントとともに v:event という変数を提供しており、これを通して関連する情報を取得できます。

" TextYankPost を発火したオペレータコマンド
autocmd TextYankPost * echomsg v:event.operator

" ヤンクされたテキスト (行ごとに分割された文字列のリスト)
autocmd TextYankPost * echomsg string(v:event.regcontents)

" 更新されたレジスタ
autocmd TextYankPost * echomsg v:event.regname

" レジスタの種類 (:help getregtype())
autocmd TextYankPost * echomsg v:event.regtype

この機能の原型は実はかなり昔に提案されたものだったんですが、ついに取り込まれました。

個人的な所感というか予想ですが、あまりにも限られたプラグイン、いわゆる Yankring 的なもののための機能!という感じで、そういう点で後に回されていたのかもしれません。とはいえ、かくいう私ものどからゲロでるほど欲しかったのでうれしいです。早速ビルドしました。近々vim-highlightedyankもアップデートするので Vim をビルドしましょう。(古い Vim で使えなくなるわけではないです)

追記:
あと、いじっていて気が付きましたが、何もレジスタを指定しないと v:event.regname が空なので、ユーザがコマンドにレジスタを明示的に指定したかしていないかを判別できますね。つまり ""yyyy を見分けられます。これ、 v:register では実現できないのでユーザ定義オペレータを作るときに困っていたのですが、 TextYankPost ごしなら限定的に可能になりました。使い道は…ないかな。