Perlのソースコードから,文単位でトークンをgit grepするのを作った.
普通のgrepは行単位の検索なので,これまでgit grepするとき, メソッドの呼び出しが複数行に渡ることが予想されるとき,勘で-A 5 とかやって,後ろ5行も表示,とかやってたけど,勘に頼っていて,不便だった.ソースコードはトークン単位とか文単位なので,行単位で扱ってもあまり意味がない.
GitHubに,git-grep-perl-statementというのを置いてある.
例
git-grep-perl-statementのソースコードから,coloredというトークンを探してみる.
% git grep-perl-statement colored git-grep-perl-statement:61 colored($self->highlight_style, $_); git-grep-perl-statement:85 say colored( ['bold'], "@{[ $file ]}:@{[ $_->line_number ]}" );
85行目のところ,coloredのあと改行してても,その命令が終わるまでは表示してくれてる.
flushというトークンを探してみる.
% git grep-perl-statement flush git-grep-perl-statement:47 sub flush { my ($self) = @_; $self->{docs} = []; } git-grep-perl-statement:95 $finder->flush;
メソッドの定義も見れる.
トークンの完全一致を見てるので,flus とかでは出ない.
仕組み
git grep --name-onlyで検索したあと,対象のソースコードをPPIでパースして,検索対象のトークンが含まれる文だけを表示している.
PPIを使えばstatement単位とかtoken単位での操作ができる.
便利
- メソッドの呼び出しが複数行に渡るときに,何も気にしなくても命令の最後まで見れる
- トークン単位で検索できるので,1文字の変数なども探せる
- メソッド名で検索すると,メソッドの定義も見れる
- 内部的に与えられた引数でgit grepしてるので,git grep-per-statement foo lib とかすると,lib/以下のみから検索とかできる
依存モジュールを管理とかインストールとかできるようにしたかったけどよくわからなかった.なんか足りなかったらcpanmで入れてください.