Λlisue's blog

つれづれなるままに更新されないブログ

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

unite-grep-vcs interface

ご無沙汰しております有末です。みなさん grep してますか?

最近お仕事で超巨大なレポジトリの海の中を彷徨うことが多々あるのでgit grepを多用していました(通常のgrepptでは遅すぎるので)。そこで、この作業を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/gitgrep/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

これで仕事も研究も捗るね!