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で入れてください.