ホーム | 文書トップ | 目次

GNU GLOBAL(gtags)

Table of Contents

global.gif

1 概要

いわゆるタグジャンプ。他にctags,etags等があるが、これらより強力な機能を持っている。効率的にプログラミングを行う為には必須といってよい。 下記のような特徴がある。

  • ソースツリーのトップでインデックスを作成しておくことで、関数やその他のシンボルを自在に参照することができる
  • タグ情報から、HTMLを生成することもできる(htags)

プログラム自体は、コマンドライン(シェル)から実行するものであり、様々なアプリケーションで利用することが可能であるが、 ここでは、Windowsにおけるemacsで利用することを前提として解説する。

2 リリース情報

2.1 6.0

  • 2011/9/7 リリース
  • gtags.el: case-fold-search 変数に従った挙動をするようになった
    • Emacsでは、case-fold-search 変数により、文字列のマッチングを行う時に大文字小文字を区別するかどうかが変わる (nilでは区別する、tでは区別しない)
    • Emacsのデフォルトは t なので、設定を変更していないと、大文字小文字を区別しない
    • 大文字小文字を区別したい場合は (setq default-case-fold-search nil) すればよい

2.2 5.9.1

  • 2010/7/19 リリース
  • gtags: gtags.files という名称のファイルにタグ生成対象のソースファイルのリストを記述しておくことで、タグ生成対象のソースファイルを指定できる

2.3 5.9

  • 2010/6/8 リリース
  • タグファイルの形式が以前とは変わっているので注意
  • gtags: /usr/bin/sort のパスに sort がある場合、sort を使うことで高速化される

2.4 5.8.2

  • 2010/4/1 リリース
  • gtags: 内蔵パーサ(built-in parser)がデフォルトとなった。

2.5 5.8.1

  • 2010/3/6 リリース

2.6 5.8

  • 2010/2/5 リリース
  • gtags: 内蔵パーサ(built-in parser)により、タグ生成が高速化。.globalrc に use-builtinparser の設定をすることで有効になる
    • (注) 5.8.2 以降からデフォルトとなっているので、5.8.2以降を使用すれば上記設定は不要
  • gtags.el: GTAGS SELECT のバッファを一つだけにする設定追加(gtags-select-buffer-single)

2.7 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 は、タグ情報に存在するソースファイルにジャンプする機能なのだが、タブキーでファイル名が補完できるようになった
      • 候補が複数ある場合は、別のバッファに候補が表示される
      • 何らかの文字を入力しないと補完されない。何も入力されていない状態でも有効(全てのソースファイルが表示される)でもいい気がするが。。

3 インストール方法

  • 下記はWindows環境へのインストール方法である。
  • 以前は、Boland C++でコンパイルしたりCygwin環境でコンパイルしたりしてWin32用のバイナリを作成する必要があったが、
  • 2014年12月現在では、Jason Hood氏が提供しているWin32用バイナリ(下記ページで配布されている)を使用することをお奨めする。

 - + → http://adoxa.3eeweb.com/global/ +

  • http://adoxa.altervista.org/global/
  • C:\usr\global\ 以下に上記で提供されているファイル(zipを展開したもの)を全部コピーする。
    • 下記は version 5.2 の例
    • bin 以外のディレクトリは無くてもよい。
    • C:
      • usr
        • global
          • bin
            • global.exe
            • gozilla.exe
            • gtags-cscope.exe
            • gtags-parser.exe
            • gtags.exe
            • htags.exe
        • info
        • man
        • manifest
        • share
  • windowsの環境変数PATH に C:\usr\global\bin を加えて、PCを再起動する。
    • (Windows XPでは設定がすぐに反映されるので再起動は不要かもしれない)
  • Meadowの site-lisp ディレクトリに C:\usr\global\share\gtags\gtags.el をコピーする。
  • .emacs にgtags.elの設定をする。(設定例は後述)
  • また、cygwinを使用している場合は http://www.emacswiki.org/elisp/より、cygwin-mount.elをダウンロードし、これもsite-lispに入れておく。(設定例は後述)
  • cygwin-mount.el を使用しないと、ファイルにジャンプした際にパス名の展開に失敗し、下記のメッセージが表示されてしまうことがある。
Use C-u M-x make-directory RET RET to create directory and its parents

4 過去のバージョンにおけるインストール時の注意

4.1 4.8.1以前

  • cygwin(GNU)の sed.exe,sort.exe が必要であった為、windowsの sortコマンドと共存させる為、注意が必要
    • GNUの sort.exe に先にパスを通しておく必要がある
  • 4.8.2以降からはこれらのコマンドに依存しなくなった。
    • sort.exe を gnusort.exe として同梱することで回避したようだ。
  • 2007年5月現在では、gnusort.exe も無くなっているようだ。これにより、PATHだけ通しておけばよい。

5 使用方法

5.1 タグファイル生成方法

  • global.exe は タグファイルの情報を元に、シンボルの定義元、参照先を表示する。
  • タグファイルは gtags.exe によって予め生成しておく必要がある。
  • 始めにタグファイルを生成する際には、プログラムソースのトップディレクトリで、コマンドラインから、
> gtags.exe -v
  • を実行する。
  • 以下のファイルが生成される。
    • GPATH
    • GRTAGS
    • GSYMS
    • GTAGS
  • ソースの変更に伴いタグファイルと実際のシンボルの位置に不整合が生じてくる。
  • 変更された部分だけ更新する(Incremental update)場合は、下記オプションにて実行する。
  • ソースの変更規模が大きくて(?)、Incremental updateが失敗する場合は、-i オプションを外して全て生成し直す必要がある。
> gtags.exe -iv
  • 下記コマンドでも同じことを行うが、global.exe はソースの下層ディレクトリで実行可能である。
> global.exe -uv

5.2 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
    • ジャンプした場合にジャンプ前の場所に戻る

6 gtags.el(emacs用)の設定例

6.1 .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)
      ・
      ・
))
  • cygwin を使用している場合は cygwin-mout を入れないとパスの展開に失敗することがある
;---- cygwin-mount ----
(when (and (featurep 'meadow) (locate-library "cygwin-mount"))
  (require 'cygwin-mount)
  (cygwin-mount-activate))
  • 下記は、よくある設定の例だが、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)
         ))

6.2 キーアサイン関係

  • 通常、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)
...

6.3 <literal>*GTAGS SELECT*</literal> のバッファを1つだけ生成されるようにする方法

デフォルト設定では、<literal>*GTAGS SELECT*</literal> のバッファは無限に生成される。

これを、一つだけにする方法である。

従来は、下記のように、gtags.el にパッチをあてて対応する必要があったが、

version 5.8 以降に付属の gtags.el では、このモードに対応している。

gtags-select-buffer-single 変数を t にするだけでよい。 例えば、下記のように設定する。

(setq gtags-mode-hook
      '(lambda ()
         (setq gtags-select-buffer-single t)
         ))

7 Link

ホーム | 文書トップ | 目次