ソースコードに効率的にアクセスする(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 grep
: Gitで管理しているファイルからgrepする。peco
: ターミナル上で汎用的なインクリメンタル検索をするためのツール。peco/peco - GitHubのGIFデモを見るのが早い。
これらを組み合わせると、grepして見つかった行を選択したら、そのファイルのその部分を開いたエディタが立ち上がるということができる。
pecoのインストール
Installation - Mac OS X / Homebrew
Macを使っていてHomebrewを入れていれば二行のコマンドを入れるだけで30秒以内に使えるようになる。
その他
EmacsでPerlのファイルを開く場合はこんな感じ。/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;が便利なのでは。