ソースコードに効率的にアクセスする(git grep + peco, helm plugins)

これまでhelmとシェルの補完機能で生きてきたけど、ファイル数が100を超えるようなプロジェクトだとそれではしんどくなってくる。もう少し規模の大きいコードベース向けの既存の解決策をいくつか紹介する。

git grep (またはgit ls-files) + pecoで絞り込む

Goソースをgrep → pecoで選択 → vimで該当行番号にジャンプした状態で開くワンライナー - Qiitaが参考になる。ファイルパスを**/*.goから**/*.pmなどに変えればPerlソースにも使えるし、後述するようにawkの部分を変えるとEmacsでも使える。使ってる様子

git find foobarのように使えるシェルスクリプト版もあります。

git findコマンドを作った - あんパン

仕組み

  • git grep: Gitで管理しているファイルからgrepする。
    • 検索対象はカレントディレクトリ以下になる。つまり/lib/Bananaにいる状態では/lib/Plackや/scriptなどのファイルは検索されない。
    • grepのオプションが通らないことがある。
  • peco: ターミナル上で汎用的なインクリメンタル検索をするためのツールpeco/peco - GitHubGIFデモを見るのが早い。

これらを組み合わせると、grepして見つかった行を選択したら、そのファイルのその部分を開いたエディタが立ち上がるということができる。

pecoのインストール

Installation - Mac OS X / Homebrew

Macを使っていてHomebrewを入れていれば二行のコマンドを入れるだけで30秒以内に使えるようになる。

その他

EmacsPerlのファイルを開く場合はこんな感じ。/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n $(git grep -n "$1" -- "**/*.pl" "**/*.pm" "**/*.t" | grep -v "[0-9]:\s*//" | peco | awk -F ":" '{print "+"$2" "$1}')

ファイルパスだけを使って絞り込みたいときにはgit ls-filesが使える。

Emacs

シェルを使わずにEmacsだけでアクセスするためのelispを紹介する。helmプラグインがメイン。

ファイルパスから開く

helm-ls-gitというelispもあるが、anything-git-projectの helm版. - Life is very shortはmodified filesを上のほうに表示してくれたりするので(と書いたけど、helm-ls-gitにも同様の機能があった)、僕はこちらを使うことにした。

git grepから開く

yasuyk/helm-git-grepがよさそう。package-installからインストールできた。

helmを使ってない人はemacs内でgit grepする方法 - $shibayu36->blog;が便利なのでは。

todo