Vim で検索時にマッチした位置がサイドバーに表示される機能をエミュレートしてみた

この記事は Vim Advent Calendar 2012 157日目の記事になります。


さて、ブラウザなどで検索を行うとサイドバーに



みたいにマッチした位置が表示されます。
これを Vimsign を使用して無理やりエミュレートしてみました。

[プラグイン]

NeoBundle "osyo-manga/vim-anzu"


前回作成した anzu.vim に機能を追加しました。

[使い方]

前回と同じように基本的にはマッピングして使用するのがいいと思います。

" hoge の位置を sign する
AnzuSignMatchLine hoge

" n や N で移動する時に @/ を使用して sign する
nmap n <Plug>(anzu-smart-sign-matchline)
nmap N <Plug>(anzu-smart-sign-matchline)


" 前回作成した機能と併用して使用する場合
" nmap n <Plug>(anzu-n-with-echo)<Plug>(anzu-smart-sign-matchline)
" nmap N <Plug>(anzu-N-with-echo)<Plug>(anzu-smart-sign-matchline)


" sign を削除する
nmap <Esc><Esc> <Plug>(anzu-clear-sign-matchline)


こんな感じでマッチした行を sign します。
結構ちらついてしまうんですが、やりたかった事は概ね出来た感じ。
行数に対して sign を行なっているのでカーソルを移動させたりすると sign の位置がずれてしまいます。
この場合は、再度 :AnzuSignMatchLine 等を呼び出す必要があります。
なので基本的に n や N などの移動するマッピングと併用して使用するのがいいかと思います。


また Vim だとサイドバーが移動した時に処理をフックすることが出来ないのでマウスでサイドバーを移動させながら検索位置を探すような事は出来ないです。
本当はこれがやりたかったんですけどねぇ…。


ちなみに

augroup anzu-update_matchline
    autocmd!
    autocmd CursorMoved * :AnzuSignMatchLine
augroup END


のような設定を行うとカーソルが移動するたびに更新する事が出来ます、
が、めちゃくちゃ重いしチラツキがハンパないので使用する場合は注意して下さい。


あと sign を使用しているプラグイン全般に言えると思いますが、他の sign を使用しているプラグインとはめちゃくちゃ相性が悪いです。
一応、sign ごとに id が設定できるけど数値しか設定できないし、どうやってプラグイン単位で管理すればいいんだってばよ…。
sign むずい。
ぶっちゃけ sign 周りの処理はかなり怪しいので不具合等があれば教えて下さい。