読者です 読者をやめる 読者になる 読者になる

副作用の少ないYankRing.vimみたいなのができました

Vimmerにハロウィンがアドベントしましたね。
Vim Advent Calendar 2012 335日目の記事です。


Vimレジスタの履歴を取って再利用するプラグインにYankRing.vimというものがあります。間違えてp(テキストを貼り付け)してしまっても<C-p>で即座に履歴を遡(さかのぼ)ってテキストを置き換えられます。とてもお手軽で、優れたインターフェイスです。
しかしながら副作用が多く、他のプラグインや設定と干渉してしまうという問題がありました。(重要なキーマッピングを軒並み置き換えてしまうのは勘弁してほしいです。)
それを見かねたShougoさんはunite-source-history/yankというものを作ってくださいました。レジスタの履歴がunite.vimのインターフェイスで閲覧でき、操作できます。便利でしたが、YankRing.vimと比べると、お手軽さで劣りました。

それでしばらくはレジスタ履歴を使わず、必要になったらその都度ヤンクし直すという原始的なことをしていましたが、ふとYankRing.vimの載っている記事を見て*1あの操作感が羨ましくなったので、それっぽい挙動をするプラグインを作ってみました。

NeoBundle 'LeafCage/yankround.vim'

副作用が(たぶん)起こらないように注意しましたので、ヘビーユーザーにも堪える作りになっています。

YankRing.vimっぽく使う

もしYankRing.vimっぽく利用するのであれば、以下のキーマッピングをして下さい。

nmap p <Plug>(yankround-p)
nmap P <Plug>(yankround-P)
nmap gp <Plug>(yankround-gp)
nmap gP <Plug>(yankround-gP)
nmap <C-p> <Plug>(yankround-prev)
nmap <C-n> <Plug>(yankround-next)

これで貼り付けを行った後に<C-p><C-n>レジスタ履歴を遡ってテキストを置き換えることが出来ます。
カーソルを動かすと候補が確定されます。


デフォルトの履歴取得数は30までです。

let g:yankround_max_history = 35

で変更できます。
Vim終了時に履歴のキャッシュを専用ファイルに保存しますがそのディレクトリはデフォルトで以下の場所になります。

let g:yankround_dir = '~/.cache/yankround'

<C-p><C-n>は貼り付け直後にしか有効ではありません。
もしもそれが勿体ないと感じるのでしたら、<expr>を使ったマッピングでyankround#is_active()を使うことで、普段は別の役割を持たせることが出来ます。
例えば、yankroundが有効でないときの<C-p>で、:CtrlPを呼び出すなど。

nnoremap <silent><SID>(ctrlp) :<C-u>CtrlP<CR>
nmap <expr><C-p> yankround#is_active() ? "\<Plug>(yankround-prev)" : "<SID>(ctrlp)"

CtrlPでレジスタ履歴を利用する

yankround.vimにはkien/ctrlp.vimの拡張も付属しています。
:CtrlPYankRoundコマンドで利用することが出来ます。

nnoremap <silent>g<C-p> :<C-u>CtrlPYankRound<CR>

レジスタ履歴が一覧表示されます。履歴を選択後、

  • <CR>で、その履歴をカーソル位置に挿入します。
  • <C-x>(<C-s>)で、無名レジスタ " にその履歴をセットします。
  • <C-t>で、その履歴を履歴から削除します。

※unite-sourceは時間がなかったのと面倒くさかったので作りませんでした。作りました。

貼り付けた部分をハイライトする機能も付けました。

こうして私に再びレジスタ履歴がアドベントしました。
もしも私と同じく、本当はYankRing使いたかったんだけど、キーマップを乗っ取られるのが嫌で利用を諦めていたのなら、ぜひyankround.vimをお試し下さい。

*1:実はunite-source-history/yankっぽいのをctrlp.vimで実装して、それをVACの記事にしようとしてすでにその記事まで書いていたのだが、YankRing.vimとの比較という項を書くためにYankRing.vimについて調べていたら、やっぱりYankRing.vimのインターフェイスの方が便利じゃねーかと思えてきて急遽YankRingっぽいのを作ったというのが真相。