GNU GLOBAL(gtags)
Table of Contents
概要
いわゆるタグジャンプ。他にctags,etags等があるが、これらより強力な機能を持っている。効率的にプログラミングを行う為には必須といってよい。 下記のような特徴がある。
- ソースツリーのトップでインデックスを作成しておくことで、関数やその他のシンボルを自在に参照することができる
- タグ情報から、HTMLを生成することもできる(htags)
プログラム自体は、コマンドライン(シェル)から実行するものであり、様々なアプリケーションで利用することが可能であるが、 ここでは、Windowsにおけるemacsで利用することを前提として解説する。
<a name="release" id="release">
リリース情報
公式ページのWhat's Newのところに記載されているリリースノートからピックアップ。 なお、ピックアップ基準は、私の主観なので、注意。
GNU GLOBAL ハンドブック サポートページの 新機能の御紹介 も参照。
6.0
- 2011/9/7 リリース
- gtags.el: case-fold-search 変数に従った挙動をするようになった
- Emacsでは、case-fold-search 変数により、文字列のマッチングを行う時に大文字小文字を区別するかどうかが変わる (nilでは区別する、tでは区別しない)
- Emacsのデフォルトは t なので、設定を変更していないと、大文字小文字を区別しない
- 大文字小文字を区別したい場合は (setq default-case-fold-search nil) すればよい
5.9.1
- 2010/7/19 リリース
- gtags: gtags.files という名称のファイルにタグ生成対象のソースファイルのリストを記述しておくことで、タグ生成対象のソースファイルを指定できる
5.9
- 2010/6/8 リリース
- タグファイルの形式が以前とは変わっているので注意
- gtags: /usr/bin/sort のパスに sort がある場合、sort を使うことで高速化される
5.8.2
- 2010/4/1 リリース
- gtags: 内蔵パーサ(built-in parser)がデフォルトとなった。
5.8.1
- 2010/3/6 リリース
5.8
- 2010/2/5 リリース
- gtags: 内蔵パーサ(built-in parser)により、タグ生成が高速化。.globalrc に use-builtin_parser の設定をすることで有効になる
- (注) 5.8.2 以降からデフォルトとなっているので、5.8.2以降を使用すれば上記設定は不要
- gtags.el: GTAGS SELECT のバッファを一つだけにする設定追加(gtags-select-buffer-single)
5.7.7
- 2009/12/19 リリース
- gtags の –statistics (統計データ) オプション追加
- 下記のように、タグ情報の生成時間がメッセージが表示される
$ gtags.exe --statistics period elapsed[sec] ----------------------- ------------ Time of creating GTAGS 0.172 Time of creating GRTAGS 0.109 Time of creating GSYMS 0.141 ----------------------- ------------ The entire time 0.438
- gtags.el の gtags-find-file のファイル名の補完機能追加
- これは便利。gtags-find-file は、タグ情報に存在するソースファイルにジャンプする機能なのだが、タブキーでファイル名が補完できるようになった
- 候補が複数ある場合は、別のバッファに候補が表示される
- 何らかの文字を入力しないと補完されない。何も入力されていない状態でも有効(全てのソースファイルが表示される)でもいい気がするが。。
- これは便利。gtags-find-file は、タグ情報に存在するソースファイルにジャンプする機能なのだが、タブキーでファイル名が補完できるようになった
インストール方法
下記はWindows環境へのインストール方法である。
Windows用バイナリのインストール
Pygmentsパーサプラグイン関連のインストール
- GNU GLOBAL with Pygments
- GNU GLOBALで Pygmentsパーサを使用すると、Perl等の言語でもタグ生成が可能になる
使用方法
タグファイル生成方法
- global.exe は タグファイルの情報を元に、シンボルの定義元、参照先を表示する。
- タグファイルは gtags.exe によって予め生成しておく必要がある。
- 始めにタグファイルを生成する際には、プログラムソースのトップディレクトリで、コマンドラインから、
> gtags.exe -v
- を実行する。
- 以下のファイルが生成される。
- GPATH
- GRTAGS
- GSYMS
- GTAGS
- ソースの変更に伴いタグファイルと実際のシンボルの位置に不整合が生じてくる。
- 変更された部分だけ更新する(Incremental update)場合は、下記オプションにて実行する。
- ソースの変更規模が大きくて(?)、Incremental updateが失敗する場合は、-i オプションを外して全て生成し直す必要がある。
> gtags.exe -iv
- 下記コマンドでも同じことを行うが、global.exe はソースの下層ディレクトリで実行可能である。
> global.exe -uv
emacs上(gtags.el)の使い方
- Meadow上からソースファイルを開き下記のコマンドが実行可能になる。
- gtags-find-tag
- 関数の定義元(関数の実体)へジャンプ
- gtags-find-rtag
- 関数の参照元(関数のプロトタイプ宣言、関数をコールしている部分)へジャンプ
- gtags-find-symbol
- 変数等のジャンプ
- gtags-find-pattern
- マッチした行にジャンプ
- gtags-find-file
- マッチしたファイル名にジャンプ。
- ディレクトリ構造等関係なく、ファイル名を入力するだけでジャンプできるので実はかなり便利な機能。
- gtags-find-tag-from-here
- ミニバッファにキーワードを表示せず、直接ジャンプするようだ。
- あまり使っていなかったが、実は、上記(tag/rtag/symbol/patterm)を自動選択しているのかもしれない。(まだドキュメントで確認していないが)
- 基本的にこれを実行すればよいのかも?
- gtags-pop-stack
- ジャンプした場合にジャンプ前の場所に戻る
gtags.el(emacs用)の設定例
.emacs の定義
- .emacsの設定の一例
;--- GNU GLOBAL(gtags) gtags.el --- (when (locate-library "gtags") (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 "\M-p" 'gtags-find-pattern) (global-set-key "\M-f" 'gtags-find-file) ;ファイルにジャンプ (global-set-key [?\C-,] 'gtags-pop-stack) ;前のバッファに戻る
- add-hook 'c-mode-common-hook にて、*.c や、*.h ファイル等を開き、c-mode に入った時に自動的に gtags-mode に入るようにする
(add-hook 'c-mode-common-hook '(lambda() ・ ・ (gtags-mode 1) ・ ・ ))
- 下記は、よくある設定の例だが、gtags-find-pattern や gtags-find-file が設定から漏れているので片手(両手?)落ちである。
- また、autoload して、local-set-key していると、gtags-mode に入らない限り機能が使えない。
- 上記のように require 'gtags して、global-set-key すれば、いつでも gtags-find-file 等が使用できる。
- ただし gtags.el の最後に、(provide 'gtags) の記述があることを確認して (require 'gtags) する。
- ちょっと前のversionの gtags.el では最後にこの記述が無かったため、エラーになる。
(autoload 'gtags-mode "gtags" "" t) (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) ))
キーアサイン関係
- 通常、gtags-pop-stack は C-t にアサインされているが、私の場合、C-t は scroll-down をアサインしているので, C-, (カンマ) に変更している。
- ただし、このアサインは、gtags.el 内で define-key されているので、私はgtags.elをカスタマイズしてコメントアウトしている。
- (gtags.el)
... (define-key gtags-select-mode-map "q" 'gtags-pop-stack) (define-key gtags-select-mode-map "u" 'gtags-pop-stack) ;(define-key gtags-select-mode-map "\C-t" 'gtags-pop-stack) ; ここ (define-key gtags-select-mode-map "\C-m" 'gtags-select-tag) (define-key gtags-select-mode-map "\e." 'gtags-select-tag) ...
\*GTAGS SELECT\* のバッファを1つだけ生成されるようにする方法
デフォルト設定では、\*GTAGS SELECT\* のバッファは無限に生成される。
version 5.8 以降に付属の gtags.el では、これを一つだけにするモードに対応している。
gtags-select-buffer-single 変数を t にする。 例えば、下記のように設定する。
(setq gtags-mode-hook '(lambda () (setq gtags-select-buffer-single t) ))