GNU GLOBALでソースコードを可視化

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

ソースコードの可視化のため、gnu globalをインストールしました。

GNU GLOBAL ソースコードタグシステム
tips/40 – VimWiki
ソースコードを快適に読むための GNU GLOBAL 入門 (前編) – まちゅダイアリー(2009-03-07)

スポンサーリンク

あたりを参考に進めます。

Cygwin上にgnu globalをインストール

WindowsXP上のCygwin環境に、gnu globalをインストールします。
Getting GLOBALから、global-5.7.6.tar.gz をダウンロード。

$ tar zxvf global-5.7.6.tar.gz
$ cd global-5.7.6
$ ./configure
$ make
$ make install

Linux上でも同じ手順だと思われます。
インストール先にパスを通すのを忘れずに。

タグファイル、HTMLファイルの作成

続いて、目的のソースコードのディレクトリに移動後、gtagsコマンド。

$ cd ~/src/ruby-rhg
$ gtags -v

「GPATH」「GRTAGS」「GSYMS」「GTAGS」のファイルが作成されます。
続いて、

htags -saF

HTMLという名のディレクトリの中にhtmlファイル作成されるので、index.htmlをブラウザで開く。
A~Zの関数名の索引、ファイル名の索引などから、ソースをたどれるHTMLファイルが一気に作成されています。すごい!
リンクを辿りながら、簡単に関数の呼び出し元を遡れます。

コマンドラインからgnu globalを使う

関数の定義元を調べる

$ global rb_define_method
class.c

詳細に(行数と内容)表示。-x 関数名

$ global -x rb_define_method
rb_define_method  635 class.c   rb_define_method(klass, name, func, argc)

正規表現で検索

$ global '^rb_define'
class.c
ext/syslog/syslog.c
variable.c

関数の呼び出し元を調べる。-r 関数名

$ global -r rb_define_method
array.c
bignum.c
class.c
compar.c
dir.c
enum.c
error.c
eval.c
・・・

ファイル中の関数一覧を表示。-f ファイル名

$ global -f array.c
ARY_DEFAULT_SIZE   22 array.c        #define ARY_DEFAULT_SIZE 16
rb_mem_clear       25 array.c        rb_mem_clear(mem, size)
memfill            35 array.c        memfill(mem, size, val)
ARY_TMPLOCK        45 array.c        #define ARY_TMPLOCK  FL_USER1
rb_ary_modify_check   48 array.c        rb_ary_modify_check(ary)
rb_ary_modify      59 array.c        rb_ary_modify(ary)
rb_ary_freeze      74 array.c        rb_ary_freeze(ary)
rb_ary_frozen_p    81 array.c        rb_ary_frozen_p(ary)
rb_ary_s_alloc     90 array.c        rb_ary_s_alloc(klass)
ary_new           104 array.c        ary_new(klass, len)
・・・

関数名の一部から関数を調べる。-c 関数名の一部

$ global -c rb_define_
rb_define_alias
rb_define_attr
rb_define_class
rb_define_class_id
rb_define_class_under
rb_define_class_variable
rb_define_const
rb_define_global_const
・・・

ソースコード全体からgrep。-g 関数名

$ global -g rb_define_method_id
class.c
intern.h
struct.c

こんな感じに割と簡単にglobalコマンドを使えます。

Vimからgnu globalを使う

Linux、Cygwin上のvim を利用する場合は、「$HOME/.vim/plugin」フォルダに 「global-5.7.6/gtags.vim」 をコピー。
Windows用http://www.kaoriya.net/ のgVimの場合、C:\Program Files\vim72-kaoriya-w32j\runtime\plugin 以下にgtags.vimをコピー。
以下のように、globalコマンドと同様のオプションで、vimコマンドを使えます。

関数の定義元を調べジャンプ
:Gtags rb_define_method

関数の呼び出し元を調べ一覧表示
:Gtags -r rb_define_method

ファイル中の関数一覧を表示
:Gtags -f array.c

ソースコード全体からgrep
:Gtags -g rb_define_method_id

追記。
.vimrcにショートカット定義すると、もっと便利のようです。

ソースコードを快適に読むための GNU GLOBAL 入門 (中編) – まちゅダイアリー(2009-03-08)

map <C-g> :Gtags 
map <C-i> :Gtags -f %<CR>
map <C-j> :GtagsCursor<CR>
map <C-n> :cn<CR>
map <C-p> :cp<CR>

ショートカットは以下のようになる。
Ctrl+G :Gtags と入力する
Ctrl+I 開いているファイルに定義されている関数の一覧を表示
Ctrl+J カーソル位置の関数へジャンプ
Ctrl+N 次の検索結果へジャンプする
Ctrl+P 前の検索結果へジャンプする

ソースを読むときは、以下のようにしている。
1. 読みたいファイルを開く
2. Ctrl+I でそのファイルの関数一覧を表示し、 Ctrl+N や Ctrl+P を使って関数単位で移動する
3. ソースコードの中で知らない関数があったら、 Ctrl+J を使って定義箇所へジャンプする
4. より詳しく調べたい場合は「:Gtags -g 検索文字列」を使う (:Gtags は Ctrl+G で入力)

結局、少々変更しまして、以下のように設定しました。

"GNU GLOBAL
 
"関数の定義元へ
map <C-g> :Gtags
"ファイル中の関数一覧表示
map <C-f> :Gtags -f %<CR>
"関数の呼び出し元一覧表示
map <C-r> :Gtags -r
"カーソル位置の関数の定義元へ
map <C-j> :GtagsCursor<CR>
"検索結果の下(次)へ
map <C-l> :cn<CR>
"検索結果の上(前)へ
map <C-h> :cp<CR>

追記ここまで。

TABで関数名の候補を表示

.bashrc に以下を追加する。

funcs()
{
    local cur
    cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=(`global -c $cur`)
}
complete -F funcs global

すると、
$ global rb_define_[TAB]
と関数名を途中まで入力して、TABで候補表示してくれます。

以上、GNU GLOBALをインストールしたことで、ソースコードを追いやすくなりました。
とくにVimから使えるのは大きいと思います。

スポンサーリンク
 
スポンサーリンク