9fansを見ていると、Rob Pike氏が、Goの型定義や関数定義を検索するコマンドを紹介していた。
実装
上記によるとコマンドは4つ。
bin/f
カレントディレクトリにあるソースコードから関数定義をgrepする。
#!/bin/sh 9 grep -i -n '^func (\([^)]+\) )?'$1'\(' *.go /dev/null
bin/t
f
と似ているけど、こちらは型定義をgrepする。
#!/bin/sh 9 grep -i -n '^type '$1' ' *.go /dev/null
bin/cf
codesearch インデックスからGoの関数定義をgrepする。
#!/bin/sh csearch -n -f '\.go$' '^func (\([^)]+\) )?'$1'\('
bin/ct
同様に、こちらは型定義。
#!/bin/sh csearch -n -f '\.go$' '^type '$1
使い方
上記の f
または t
には、plan9portのgrep*1が使われている。Plan 9のgrepは+
や|
が使える実装なので、インストールしたうえでPATHの末尾に追加しておく必要がある。plan9portのインストールについてはPlan 9 from User Space(plan9port)を使うで書いた。または、試していないけど大体は同じなので、grep -Eで代用できるかもしれない。
出力例はこんな雰囲気。全て filename.go:line
形式で結果を出力するので、Acmeエディタを使っていれば右クリックするだけで該当行にジャンプできるようになっている。
% f String pickle.go:28: func (op Operator) String() string { pickle.go:65: func (e *Expr) String() string { pickle.go:79: func (r *Rule) String() string { pickle.go:110: func (m *Metric) String() string { pickle_test.go:336: func (p *InvalidData) String() string { % t Metric pickle.go:103: type Metric struct {
cf
または ct
では csearch コマンドが使われている。これはgoogle/codesearchで公開されているコマンドで、事前にインデックスを作成しておき、インデックスを正規表現で検索する。
# cgrep, cindex, csearchをインストール % go install github.com/google/codesearch/cmd/... # インデックス化したいディレクトリを列挙する % cindex $GOPATH/src ...
これでcsearchすると、インデックスを検索できるようになる。作成したインデックスは、デフォルトでは$HOME/.csearchindexに作られるが、CSEARCHINDEX環境変数で変更できる。技術的な詳細は、Russ Cox氏が以下に書いているが、難しいので読めていない。