Plan 9とGo言語のブログ

主にPlan 9やGo言語の日々気づいたことを書きます。

Goの型や関数定義を検索するコマンド

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 9grep+|が使える実装なので、インストールしたうえで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氏が以下に書いているが、難しいので読めていない。

*1:9 grepの部分がそれ