unite-tags を改造した

時間もないし他にやることもあるし他の人のスクリプトにはあまり手を出さない方がいいと思いつつ、どうしても我慢できなくなってしまったので id:tsukkee さんの unite-tags を改造した。

before: https://github.com/tsukkee/unite-tags
after: https://github.com/thinca/unite-tags

変更点

キャッシュ

タグファイルを読み込んだ結果をキャッシュするようにしました。これにより 2 回目以降の unite の起動が速くなります。タイムスタンプをチェックしてタグファイルが更新されていた場合は自動的に読み直します。

引数

引数を渡すことで候補を事前に絞り込んだ状態で始められるようにしました。これによりカーソル下の単語の候補を表示することができます。

noremap <silent> <C-]> :<C-u>Unite tags:<C-r>=expand('<cword>')<CR><CR>

単に絞り込むだけなら -input= とかでもいいんですが、これは -immediately と言う最近追加された*1オプションと組み合わせると威力を発揮します。
-immediately があると候補が 1 つしかない場合に自動的にアクションを実行します。これにより :tjump のような使い勝手が実現できます。つまり、候補が 1 つしかない場合は直接飛んで、複数ある場合は unite で選択できます。

noremap <silent> <C-]> :<C-u>Unite -immediately -no-start-insert tags:<C-r>=expand('<cword>')<CR><CR>

ただし、実際にはタグジャンプではないのでタグスタック*2は利用できません。
ちなみに引数を / で始めることで正規表現で絞り込めます。

!_TAG_FILE_ENCODING 対応

tags ファイルにこれが含まれている場合は自動的にエンコーディングを変換します。ctags日本語対応版がこれの出力に対応している模様。

source tags/file を追加

fuf.vim で言うところの Tagged-File です。タグファイルに含まれているファイルを候補とします。




全体的にやっつけ実装で十分にテストしてないのであしからず。

*1:というよりこのためにわざわざ追加してもらいました。Shougo さんありがとうございます!

*2::help tag-stack