GNU GLOBAL(gtags)は、ソースコードのタグジャンプです。簡単に複数のソース中から関数や、変数の定義元/参照元を見つけ、その箇所に移動することができます。
ctags、etags(cygwin や Linux に大抵標準で含まれています)と同じ働きをしますが、gtags はさらに強力な機能を持っています。大量の他人の書いたソースを読むプログラマには、必須だと思います。
スポンサードリンク
gtags は、次のような特徴を持っています。
サイトの DownLoad のページより「global-x.x.x.tar.gz」をダウンロードしてください。
通常のインストールと同様です。cygwin 上でも、最近のものを利用する場合は問題ありません。
% tar zxvf global-x.x.x.tar.gz(もしくは gzip -dc global-x.x.x.tar.gz | tar xv -) % cd global-x.x.x % ./configure (--prefix=任意の場所) % make % make install
なお、Cygwin の場合は、+Devel から、gcc, make を予めインストールしておいて下さい。
また、Cygwin の /usr/local/bin(例: C:\cygwin\usr\local\bin) にPATHを通しましょう。
【日本語】
make all-recursive make[1]: ディレクトリ `/home/global-6.5.2' に入ります Making all in libglibc make[2]: ディレクトリ `/home/global-6.5.2/libglibc' に入ります .deps/getopt.Po:1: *** 複数のターゲットパターンです. 中止. make[2]: ディレクトリ `/home/global-6.5.2/libglibc' から出ます Makefile:515: recipe for target `all-recursive' failed
【英語】
make all-recursive make[1]: Entering directory `/home/global-6.5.2' Making all in libglibc make[2]: Entering directory `/home/global-6.5.2/libglibc' .deps/getopt.Po:1: *** multiple target patterns. Stop. make[2]: Leaving directory `/home/global-6.5.2/libglibc' Makefile:515: recipe for target `all-recursive' failed
上記エラーが出る場合は、gccが生成した依存ファイルに含まれるWindows形式のパスを、UNIX形式のパスに変換する必要があります。
例)c:\users\hoge\desktop\tool → /app/mingw/tdm/lib/gcc/
スクリプトで一括置換する例です。
% find . -name *.Po | xargs sed -i "s/c\\:\\\users\\\hoge\\\desktop\\\tool\\\gnupack_devel-11.00\\\app\\\mingw\\\tdm\\\bin\\\..\\//\\/app\\/mingw\\/tdm\\//g"
任意のフォルダに global-x.x.x ディレクトリ内にある 「gtags.el」 をコピーしてください。
※ 「.emacs」に以下の一文を追加してください。(下記は「~/lisp」に「gtags.el」をコピーした場合です)
;; load-pathに追加 (setq load-path (cons "~/lisp" load-path))
Meadowを利用する場合は、C:\Meadow\site-lisp ディレクトリに global-x.x.x ディレクトリ内にある 「gtags.el」 をコピーしてください。
「$HOME/.vim/plugin」フォルダに global-x.x.x ディレクトリ内にある 「gtags.vim」 をコピーしてください。
cp /usr/local/share/gtags/gtags.vim $HOME/.vim/plugin
プログラムソースのあるトップのディレクトリで、次のコマンドを入力します。
gtags -v
ファイル数によっては、かなりの時間を要します。
しばらくすると、「GPATH」「GRTAGS」「GTAGS」のファイルが作成されます。
GTAGS | オブジェクト定義のデータベース |
---|---|
GRTAGS | オブジェクト参照のデータベース |
GPATH | パス名のデータベース |
実際に利用したファイルサイズは、次のようなものです(ファイル数 152個)。
$ ls -lh total 4.0M -rw-r--r-- 1 hoge なし 32K May 1 02:07 GPATH -rw-r--r-- 1 hoge なし 2.6M May 1 02:07 GRTAGS -rw-r--r-- 1 hoge なし 736K May 1 02:07 GSYMS -rw-r--r-- 1 hoge なし 552K May 1 02:07 GTAGS drwxr-xr-x+ 12 hoge なし 0 May 1 01:59 global-4.8.5/
また、HTML化は次のコマンドで可能です。
htags -saF
ただし、非常に大きなファイルとなり、時間もかかります。
スポンサードリンク
emacs/Meadow を起動して、次のコマンドで gtags モードに変更できます。
M-x gtags-mode
このとき、「.emacs」に以下を追加しておけば、便利になります。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; GNU GLOBAL(gtags) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (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) ))
使い方は、ジャンプしたい関数上で、上記のコマンドを入力します。
なお、Cygwin+Meadow環境では、正しくソースの位置を表示してくれない問題があります。
次のように表示され、正しいソースのある場所を誤ってしまいます。
Use C-u M-x make-directory RET RET to create directory and its parents
Cygwin パスを理解させたいのであれば、次のElisp を利用して下さい。
ダウンロードした「cygwin-mount.el」は「C:\Meadow\site-lisp」に置きましょう。
また、「.emacs」に以下を追加しておきます。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; cygwin-mount ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (when (and (featurep 'meadow) (locate-library "cygwin-mount")) (require 'cygwin-mount) (cygwin-mount-activate))
:Gtags main
で global -t main を実行し、結果をエラーウィンドウで開きます。
'-r' で参照元一覧をエラーウィンドウに表示します。
:Gtags -r func1
main.c 内のオブジェクト一覧は次のようなコマンドを入力します。
:Gtags -f main.c <- locate objects in main.c
% や # も使えます。
:Gtags -f % <- locate objects in main.c
「$HOME/.vimrc」に以下を追加しておけば、便利になります。
"---------------------------------------------------- " GNU GLOBAL(gtags) "---------------------------------------------------- nmap <C-q> <C-w><C-w><C-w>q nmap <C-g> :Gtags -g nmap <C-l> :Gtags -f %<CR> nmap <C-j> :Gtags <C-r><C-w><CR> nmap <C-k> :Gtags -r <C-r><C-w><CR> nmap <C-n> :cn<CR> nmap <C-p> :cp<CR>
例えば、「grep」関数が、どのファイルで定義されているかは、次のように調べます。
$ global grep global-4.8.5/global/global.c # grep() は global.c で定義されています
'-t' オプションで ctags フォーマット表示
$ global -t help help global-4.8.5/global/global.c 103 help global-4.8.5/gozilla/gozilla.c 76 help global-4.8.5/gtags-parser/gctags.c 132 help global-4.8.5/gtags/gtags.c 110 help global-4.8.5/htags/htags.c 256
'-r' オプションで参照元表示。help() は 次のファイルで参照されています。
$ global -r help global-4.8.5/global/global.c global-4.8.5/gozilla/gozilla.c global-4.8.5/gtags-parser/gctags.c global-4.8.5/gtags/gtags.c global-4.8.5/htags/htags.c
'-x' オプションで詳細を表示します。
$ global -x grep grep 755 global-4.8.5/global/global.c grep(pattern)
'-a' オプションで絶対パスを表示します。
$ global -a grep /home/hoge/global-4.8.5/global/global.c
global を最新に変更してください。
人気の高い書籍および参考文献を紹介します。
スポンサードリンク
スポンサードリンク