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
これで仕事も研究も捗るね!