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から使えるのは大きいと思います。
- - 関連記事 -
- Cygwin1.5にRuby1.7をソースからビルド
- irbで対話的にRuby実行
- Aptana Studio + RadRailsプラグイン(Eclipse系Ruby・IDE)を試す。NetBeansとの比較
- NetBeans IDEでRuby開発
- Rubyの真偽値・nilとfalseだけが偽
- Rubyの魅力
- データ構造を確認するpメソッドとppメソッド
- requireで別ファイルを取り込む
- Rubyはオブジェクト指向のインタープリタ言語
- 文字列とprint, puts, pなどの表示・出力メソッド
- Hello world ! Hello, Ruby !
- Rubyを勉強する環境構築(E-TextEditor)
- Rubyのto_sメソッドで2進数、8進数、16進数、10進数の変換