emacsのgtagsパッケージを使ってみる

GNU Globalをemacs上で使うgtagsパッケージの使い方を記載します。


1 gtagsパッケージとは

GNU Globalで作成したソースコードのタグシステムをemacs上で利用する為のemacsパッケージです。

GNU GlobalはC/C++等のソースコードのタグジャンプを可能にします。

ソースコードを読んでいる際に関数定義に飛んだり、関数や変数が使われてる箇所へ飛ぶことができるようになります。

grepで追跡している場合に比べて格段に効率が良くなります。

2 サポートしている言語

デフォルトだと以下の6個をサポートしています。

古いバージョンだと十分にサポートされていない場合があります。

supports 6 languages by built-in parser. (definition and reference)
C, C++, Yacc, Java, PHP4 and assembly.

プラグインを導入することで25個をサポートしています。

supports 25 languages by Pygments + Exuberant Ctags plug-in
parser. (definition and reference) 
Awk, Dos batch, COBOL, C, C++, C#, Erlang, Fortran, Java,
JavaScript, Lisp, Lua, Pascal, Perl, PHP, Python, Ruby, Matlab,
OCaml, Scheme, Tcl, TeX, Verilog, Vhdl and Vim. 

3 GNU Globalのインストール

gtagsコマンドやgtags.elが含まれます。

gtags.elは.emacsでパスが通った場所に設置してください。

できる限り新しいバージョンをインストールすべきなので、ソースコードをビルドしたインストールをお勧めします。

3.1 ソースコードをビルドしたインストール

GNU Globalのページからソースコードをダウンロードします。

プラグインを含めたビルド方法はこちらのページを参考にしてください。

$ wget http://tamacom.com/global/global-6.5.tar.gz
$ tar zxf global-6.5.tar.gz
$ cd global-6.5
$ ./configure --prefix=${HOME} && make all install

gtags.elは~/share/gtags/gtags.elにインストールされます。

3.2 パッケージ管理ツールを使ったインストール

globalという名前のパッケージをインストールします。

$ sudo apt-get install global

gtags.elは/usr/share/emacs/site-lisp/global/gtags.elにインストールされます。

4 .emacsの設定

gtagsは常に使えるようにしたいので、globalなキー割り当てをします。

(require 'gtags)
(global-set-key "\M-t" 'gtags-find-tag)
(global-set-key "\M-r" 'gtags-find-rtag)
(global-set-key "\M-s" 'gtags-find-symbol)
(global-set-key "\C-t" 'gtags-pop-stack)

 

gtags-find-tag 関数の定義場所の検索
gtags-find-rtag 関数や使用箇所の検索
gtags-find-symbol 変数の使用箇所の検索
gtags-pop-stack タグジャンプした箇所からひとつ戻ります

 

5 使い方

ソースコードのトップディレクトリにてgtagsコマンドを実行します。

-vオプションを用いればタグが付与されたファイルが標準出力されます。

$ cd /path/to/src
$ gtags

タグ情報を持つGPATH、GRTAGS、GTAGSというファイルが生成されます。

トップディレクトリ配下にあるソースコード上でgtags-find-tag等を呼び出してタグジャンプが可能になります。

 

emacsでソースコードを開き、mainという文字列にカーソルを合わせた状態でM-tを押します。

検索文字列にmainが挿入された状態になります。自分で入力し直すこともできます。

https://dl-web.dropbox.com/s/omrnuje6wj3riuw/0001_Tag.png

main関数の定義がある箇所の一覧が表示されます。ひとつを選択した状態でRETキーを押します。

https://dl-web.dropbox.com/s/elefnz2ums6ckzr/0002_List.png

main関数の定義に飛ぶことができました。

https://dl-web.dropbox.com/s/u49h16fiylorjla/0003_Show.png

5.1 下位ディレクトリに別のGPATH、GRTAGS、GTAGSがある場合

ソースコードに対して、近い方のGPATH、GRTAGS、GTAGSが用いられます。

$ tree top
top
├── GPATH
├── GRTAGS
├── GTAGS
├── bar
│   └── bar.c
└── foo
    ├── GPATH
    ├── GRTAGS
    ├── GTAGS
    └── foo.c

例えば、foo.cでgtags-find-tag等を呼び出すと、fooディレクトリのGPATH、GRTAGS、GTAGSが用いられます。

bar.cでgtags-find-tag等を呼び出すと、topディレクトリのGPATH、GRTAGS、GTAGSが用いられます。