unite-anzu つくった

この記事は Vim Advent Calendar 2012 336日目の記事になります。
Vim Advent Calendar 2013 の募集も開始しました。
興味のある方はぜひご参加下さい。
また、2012 の参加者もまだまだ募集中ですよ!

  • 元ネタ


unite-line でおk、という気がしたんですが確かに 60万行近いバッファだと確かにレスポンスが悪かったのでつくってみました。
つくるにあたって anzu.vim の処理が流用できそうだったのでそのまま unite-anzu にしました。

[プラグイン]

NeoBundle "osyo-manga/vim-anzu"

[使い方]

" 起動した {pattern} にマッチする行を unite.vim に出力する
Unite anzu:{pattern}

" 引数がない場合は @/ を参照する
Unite anzu

" 行を短縮表示ではなくて、折り返し表示する場合は -wrap を追加
Unite -wrap anzu

[anzu.vim のパフォーマンス]


と、いうお達しがあったのでちょっと測ってみました。
あくまでも目安として参考にして下さい。

  • / で検索後に n で移動した時の処理時間
行数 1回目 2回目以降 マッチ数
10万行 0.1596ms 0.0020ms 798
50万行 0.9787ms 0.0072ms 3990
50万行 0.3089ms 0.0153ms 30
100万行 3.3217ms 1.2757ms 7980
100万行 0.6381ms 0.0156ms 60
150万行 5.1963ms 1.8096ms 11970
150万行 0.9269ms 0.0155ms 90
" Vim の設定
" anzu.vim のマッチ数の上限
let g:anzu_search_limit = 1000000

" 古い正規表現エンジンを使用
set re=1

nmap n <Plug>(anzu-n)


anzu.vim のレスポンスは1回目は行数に、2回目以降はマッチ数に比例します。
anzu.vim は結果をキャッシュしているので、バッファの内容に変更がなければ2回目以降は処理が早いです。
行数が多くてもマッチ数が少なければそこまで重くは感じないと思います。
ちなみに unite-anzu も同様に2回目以降であればすぐに起動します。