Unite で git grep や hg grep を使うためのプラグインを作った

ご無沙汰しております有末です。みなさん grep してますか?
最近お仕事で超巨大なレポジトリの海の中を彷徨うことが多々あるのでgit grepを多用していました(通常のgrepやptでは遅すぎるので)。そこで、この作業をVimで行いたいという自然な欲求が生まれたのでUnite grepでどうにかできないか試行錯誤しましたが、git grepは対象フォルダの指定に--というフラグを必要とするのでどうしてもUnite grepでは利用できませんでした。その後、色々ググってみたところunite-git_grepというプラグインを見つけたので使ってみたのですが Unite grep との使用感が全く異なり、Uniteインターフェイスに入力するたびにgit grepを走らせる実装となっておりました。
これはこれで便利だとは思うのですが、巨大なレポジトリでは動作が固まるレベルで遅いです。しかたがないのでデフォルトのUnite grep的挙動を示すプラグインを作ったのでご紹介します。
lambdalisue/unite-grep-vcs · GitHub
インストール
いつもどおり neobundle.vim で下記のようにインストールします。
NeoBundle 'lambdalisue/unite-grep-vcs' " 遅滞 NeoBundleLazy 'lambdalisue/unite-grep-vcs', { \ 'autoload': { \ 'unite_sources': ['grep/git', 'grep/hg'], \}}
使い方
grep/git と grep/hg というソースを提供するので下記のようなコマンドを打つことで利用できます。
# カレントディレクトリ以下でgit grep :Unite grep/git:. # 指定ディレクトリ以下で(ry :Unite grep/hg:foobar/hogehoge
スマートに grep する
僕はUnite grepを<Space>ggに当てており、探しものをするときはとりあえず叩く癖があるので下記のように自動的にソースを切り替える関数を作成し利用しています。
nnoremap <silent> [unite]gg :<C-u>call <SID>unite_smart_grep()<CR> function! s:unite_smart_grep() if unite#sources#grep_git#is_available() Unite grep/git:. -buffer-name=search-buffer elseif unite#sources#grep_hg#is_available() Unite grep/hg:. -buffer-name=search-buffer else Unite grep:. -buffer-name=search-buffer endif endfunction
これで仕事も研究も捗るね!