Xemacsでソースコードを泳ぐ

はじめに

GNU GLOBAL source code tag system

題名のとおり、ソースコードを読むときにタグをたどっていろんな場所にジャンプすることを可能にするツールです。関数、変数の参照、定義位置に飛んでくれます。わたしが特にお薦めするのは関数の参照位置に飛んでくれることです。その他にも変数の参照位置や、正規表現(like?)によるパターンマッチングができることなど、プログラミング作業で重宝すること請け合いです。

ここでは、xemacsにglobalをセットアップして、自由にソースコードを泳げるようになるまでを備忘を兼ねて書いています。

インストール

Fedora Core 6なら、yum install globalを実行してください。これでインストール完了します。(他のパッケージシステムは使ったことが無いので書けません。m(__)m)

確認する場合は、以下のように実行してください。2007-01-05現在で、version5.3でした。

[root@mayu ~]# rpm -qa | egrep global
global-5.3-1.fc6
[root@mayu ~]# global --version
5.3

tarボールからインストールする場合は、GLOBALのサイトからダウンロードしてください。おきまりの手順で利用できるようになりました。
[root@mayu src]# tar zxvf global-5.3.tar.gz
[root@mayu src]# cd global-5.3
[root@mayu global-5.3]# ./configure --prefix=/usr
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
:
config.status: creating config.h
config.status: executing depfiles commands
[root@mayu global-5.3]# make install

自分で、rpmパッケージを作成する場合はGetting GLOBALよりspecファイルを入手することができます。

Xemacsへセットアップする

GLOBALを使うためのチュートリアルに、emacsで使用例もあります。3.7 Extended emacs using globalがそれです。これを見ながら設定してゆきます。

Xemacsでglobalを使用するためにgtags.elが用意されています。私の環境では(yumでインストールした)、/usr/share/gtagsに配置されていました。このパスを~/.xemacs/init.elに追加します。
;; gtags settings
(setq load-path (cons "/usr/share/gtags" load-path))
(autoload 'gtags-mode "gtags" "" t)

gtagscommands
Xemacsを再起動し、gtags-modeを起動(M-x gtags-mode)することができればOKです。起動後は、gtagsのいろんなコマンドがでてきます。

C,C++のソースコードを開いたときに自動的にctags-modeを実行するようにしておくと実行の手間が省けます。~/.xemacs/init.elに次のように書きます。
;; it is executed by c-mode hook
(setq c-mode-hook
'(lambda ()
(gtags-mode 1)
))

次に、ショートカットキーを設定します。参考サイトから気に入ったモノを組み合わせて使用しています。感謝m(__)m
;; access keys
(setq gtags-mode-hook
'(lambda ()
(local-set-key "¥M-t" 'gtags-find-tag)
(local-set-key "¥M-r" 'gtags-find-rtag)
(local-set-key "¥M-s" 'gtags-find-symbol)
(local-set-key "¥C-t" 'gtags-pop-stack)
(local-set-key "¥C-cgt" 'gtags-find-tag); 関数の定義
(local-set-key "¥C-cgr" 'gtags-find-rtag);関数の参照先へ
(local-set-key "¥C-cgs" 'gtags-find-symbol);変数の定義元/参照先へ
(local-set-key "¥C-cgf" 'gtags-find-file);ファイル一覧
(local-set-key "¥C-cgp" 'gtags-find-pattern);POSIX regular expressions.
))

では、泳いでみましょう

試しにGLOBALのソースコードの中を泳いでみましょう。GLOBALのソースディレクトリに移動してgtagsコマンドを実行します。
[t-randt@mayu global-5.3]$ gtags -v
[t-randt@mayu global-5.3]$ ls G*
GPATH GRTAGS GSYMS GTAGS

上の四つのファイルがタグデータです。

findmainfunctionでは、gtags.cをXemacsで開いて、main関数の定義を探してみましょう。M-tを押すと、関数名の入力を聞いてきますので、mainと入力しEnterを押します。

main関数の定義リストが表示されます。GLOBALはいくつかの実行ファイルを持っていますので複数のmain関数があります。

gtags.cのmain関数を選んでEnterを押すと、定義されている場所にジャンプします。

refertogetopt_logfunc次に、関数の参照位置にジャンプしてみます。main関数の中にあるgetopt_long関数にカーソルを合わせ、M-rを押します。getopt_log関数を参照している位置のリストが表示されます。

callgetopt_longatglobalcリスト中の最初の行を選択してEnterを押すと、global.cファイルにあるgetopt_log関数参照位置へとジャンプします。

他にも良く使う機能はgtags-find-symbol/gtags-find-patternです。特に後者は正規表現を使って関数や変数の定義、参照位置を検索できるので便利です。

おしまいに

GLOBALはソースコードを元にタグデータ(行位置)を作成しますので、ソースコードが改変されると飛び位置がズレてしまいます。改変があったときはタグデータを作りなおすのが吉。

実はお仕事ではXemacsを使ってません。そのかわり、Meadowというemacsライクなeditorを使用しています。これがXemacsと同じ様に使えるので重宝してます。ちょっと、CygwinやWindows特有の設定が必要ですが。これについては、参考サイトに情報があります。

GLOBALには他にも使えそうな機能があるようですので時間作って見てゆく予定です。

参考サイト

コメントを残す