Vim
Git
fzf

fzfを使用してgit grepを行う

やりたいこと

  • Git grepをvimから呼び出す
  • fzfを使用して検索されたファイルの該当行に飛ぶ

準備

fzf, fzf.vimを入れておきしょう。

https://qiita.com/hisawa/items/fc5300a526cb926aef08

環境は

  • Mac 10.12.6
  • Custom Version 8.0.1633 (KaoriYa 20180324)

やり方

下記を.vimrcに追記して読み込む。
:Gitgrep hogehogeで使用できます。

.vimrc
command! -bang -nargs=+ Gitgrep call fzf#run({
      \ 'source': 'git grep -n -I -i <args>',
      \ 'sink': function('s:line_handler'),
      \ 'dir': s:get_git_base_path(expand("%:p:h")),
      \ 'up': '~40%',
      \ 'options': '+m'
      \ })

" .gitディレクトリがあるパスを取得する
function! s:get_git_base_path(current_dir) abort
  if isdirectory(expand(a:current_dir . '/.git'))
    return a:current_dir
  else
    let sp_dir = split(a:current_dir, '/')
    call remove(sp_dir, -1)
    return s:get_git_base_path('/' . expand(join(sp_dir, '/')))
  endif
endfunction

" 行が選択された時の動き
function! s:line_handler(line)
  let keys = split(a:line, ':')
  " path
  exec 'e '. keys[0]
  " line
  exec keys[1]

  normal! ^zz
endfunction

できなかったこと

  • .gitファイルがなかった場合のエラー処理
  • git grep <pattern> <path>のpath部分の指定

いい方法があれば教えてください。
https://gist.github.com/hsawaji/42a604c955929d26debc44d70885b4f7

参考

https://github.com/junegunn/fzf/wiki/Examples-(vim)
https://gist.github.com/drasill/adb258e1363a22e6e433