これまでソースコードを読む時に複数の端末を用意して、grepして定義を探したりしていたのですが、大きなコードになると検索量も多くなって嫌になってたところ、「GNU GLOBALを使うと幸せになれる」と聞いたので試しに使ってみました
準備: GNU GLOBALのインストール
以下の公式サイトから[Download]を開き、Source archiveにある最新のソースコードをダウンロードします
https://www.gnu.org/software/global/
この記事では、6.5.4 のバージョンを使用しています。また、システムを自由に変更できない環境を想定して、make installを行わない手順となっています。必要に応じて適宜読み替えてください
ダウンロードした圧縮ファイルを解凍し、configure と make を実行します
$ tar xvf global-6.5.4.tar.gz
$ cd global-6.5.4
$ ./configure
$ make
コンパイルした global と gtags を ~/bin にコピーします
$ cp global/global ~/bin
$ cp gtags/gtags ~/bin
※ GNU GLOBALをシステムにインストールしても構わないのであれば、コピーする代わりに make install を実行してください
vimのプラグインを ~/.vim/plugin にコピーします
$ mkdir -p ~/.vim/plugin
$ cp gtags.vim ~/.vim/plugin
~/.vimrc にgtagsの設定を追加します
map <C-h> :Gtags -f %<CR>
map <C-j> :GtagsCursor<CR>
map <C-n> :cn<CR>
map <C-p> :cp<CR>
準備: ソースコードを解析する
解析したいソースコードのディレクトリに入り、gtagsコマンドを実行します。"-v"オプションは処理中のメッセージを表示するためのものです
$ gtags -v
GPATH、GRTAGS、GTAGS という3つのファイルが作成され、これらのファイルにコードの解析結果が入っています。ソースコードに修正が入った場合は、再度gtagsコマンドを実行して解析しなおす必要があります
補足: バージョン管理を行っている場合
git や subversion などでバージョン管理を行っている場合、gtagsで作成された解析結果を間違ってcommitしないように注意しましょう。ignoreの条件(除外リスト)に入れておくのが良いかもしれません
gitの場合は .gitignore 、subversionの場合は .svnignore に以下を追加します
GPATH
GRTAGS
GTAGS
subversionの場合は加えて、条件を適用するために以下のコマンドを実行します (gitは .gitignore に追加するだけでよい)
$ svn propset svn:ignore -R -F .svnignore .
globalコマンドの使い方
globalコマンドで主に次の事が行えます。また、各コマンドで "-x" オプションを付けるとヒットした場所の詳細(ファイル名と行数、行の内容)が表示されるようになります
関数が定義されているソースを調べる
コマンド
global ${関数名}
実行例
$ global Init_ext
dmyext.c
ソースの中に定義されている関数を調べる
コマンド
global -f ${ソースファイル}
実行例
$ global -f main.c
RUBY_EXPORT 12 main.c #undef RUBY_EXPORT
main 23 main.c main(int argc, char **argv)
関数が呼び出されているソースを調べる
コマンド
global -r ${関数名}
実行例
$ global -r Init_ext
internal.h
nacl/pepper_main.c
ruby.c
grepして指定したキーワードが入っているソースを探す
コマンド
global -g ${条件}
実行例
$ global -g win32
dir.c
ext/fiddle/function.c
ext/fiddle/libffi-3.2.1/src/dlmalloc.c
ext/fiddle/libffi-3.2.1/src/x86/ffi.c
ext/fiddle/libffi-3.2.1/src/x86/win32.S
ext/io/console/console.c
ext/nkf/nkf-utf8/nkf.h
ext/tk/tcltklib.c
ext/win32ole/win32ole.c
ext/win32ole/win32ole.h
: (略) :
普通にgrepかけた時とは違い、ファイル名のみが出力されます
vimエディタとの連携
上の準備の手順で、vimのプラグインを入れた状態で、ソースコードをvimで開いて以下の操作をします
ソースコードの関数一覧
Ctrl + h を押すと、下部にそのソースの関数が表示されます
Ctrl + n でリストのカーソルを下に移動します
Ctrl + p でリストのカーソルを上に移動します
カーソル位置の関数にジャンプ
調べたい関数にカーソルを合わせ Ctrl + j を押すと、その関数の中にジャンプします
ジャンプする前の位置に戻るには Ctrl + o を押します
調べると、他にも色々な使い方があるようですが、ここでは基本的な使い方までで留めておきます