Global とは?
GNU Global とか 多摩通信 を参照。
gtags まとめ
基本
emacs から使う為に知っておくべきこと。
タグファイル作成
$ gtags -vv
タグファイルを作りたいディレクトリに cd して実行。 -v は verbose なのでお好みで。
タグファイル更新
$ global -uv
同じく更新したいディレクトリで。
書き込めないディレクトリでタグファイルを作る
$ gtags -vv /where/tag/file/store
カレントディレクトリのタグファイルが /where/tag/file/store に作成され る。
参照するには、`GTAGSDBPATH' と `GTAGSROOT' 環境変数を使う。 詳しくはマニュアル。
書き込めないディレクトリでタグファイルを更新
$ GTAGSDBPATH=/where/tag/file/store GTAGSROOT=/where/tag/source/ global -uv
/where/tag/source/ ディレクトリのタグファイルが /where/tag/file/store に作成される。
パーサを変更する。
デフォルトの global は4種類? の言語しか対応していないので、パーサを変更 する。
設定ファイルに以下のように書く。
default:\
:tc=ctags:tc=htags:
# common
common:\
:skip=GPATH,GTAGS,GRTAGS,GSYMS,HTML/,HTML.pub/,html/,tags,TAGS,\
ID,y.tab.c,y.tab.h,.notfunction,cscope.out,.gdbinit,SCCS/,RCS/,\
CVS/,CVSROOT/,{arch}/,.svn/,.git/,.cvsrc,.cvsignore,.gitignore,\
.cvspass,.cvswrappers,.deps/,autom4te.cache/,.snprj/:\
:langmap=c\:.c,yacc\:.y,asm\:.asm.ASM.s.S,java\:.java.hx,\
cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H.h,php\:.php.php3.phtml,\
other\:asp.asa.awk.gawk.mawk.bas.bi.bb.pb.bet.cs.cbl.cob.CBL.COB\
.e.erl.ERL.hrl.HRL.f.for.ftn.f77.f90.f95.F.FOR.FTN.F77.F90.F95.htm\
.html.js.cl.clisp.el.l.lisp.lsp.ml.lua.mak.mk.p.pas.pl.pm.plx.perl\
.py.pyx.pxd.scons.cmd.rexx.rx.rb.ruby.SCM.SM.sch.scheme.scm.sm\
.sh.SH.bsh.bash.ksh.zsh.sl.sml.sig.sql.tcl.tk.wish.itcl.vr.vri.vrh.v.vim:
# ctags
ctags:\
:tc=common:\
:format=compact:
:suffixes=,asm,ASM,s,S,asp,asa,awk,gawk,mawk,bas,bi,bb,pb,bet,\
c,c++,cc,cp,cpp,cxx,h,h++,hh,hp,hpp,hxx,C,H,cs,cbl,cob,CBL,COB,e,erl,ERL,\
hrl,HRL,f,for,ftn,f77,f90,f95,F,FOR,FTN,F77,F90,F95,htm,html,java,js,hx,\
cl,clisp,el,l,lisp,lsp,ml,lua,mak,mk,p,pas,pl,pm,plx,perl,php,php3,phtml,\
py,pyx,pxd,scons,cmd,rexx,rx,rb,ruby,SCM,SM,sch,scheme,scm,sm,sh,SH,bsh,\
bash,ksh,zsh,sl,sml,sig,sql,tcl,tk,wish,itcl,vr,vri,vrh,v,vim,y:\
:extractmethod:\
:GTAGS=ctags --sort=no --langmap=java\:+.hx -xu --format=1 %s:\
:GRTAGS=gtags-parser -dtr %s:\
:GSYMS=gtags-parser -dts %s:
htags 関係は省略。extractmethod はおまじないの呪文。format に compact を指定しているのは、SEGV で落ちる為の対策と検索速度の向上のため。
gtags.el の使い方。
gtags.el の設定方法。
ロードパスが通ったディレクトリに置いて、以下を .emacs に。
(require 'gtags)
以下は私の設定。
(require 'gtags) (define-key gtags-mode-map "\M-," 'gtags-find-rtag) (define-key gtags-mode-map "\M-s" 'gtags-find-symbol) (define-key gtags-mode-map "\M-r" 'gtags-pop-stack) (add-hook 'c-mode-common-hook (lambda () (gtags-mode 1) (setq gtags-libpath `((,(expand-file-name "~/.tags/c") . "/usr/include"))))) (add-hook 'java-mode-hook (lambda () (gtags-mode 1) (setq gtags-libpath `((,(expand-file-name "~/.tags/haxe") . "/usr/local/haxe"))))) (add-hook 'gud-mode-hook (lambda () (gtags-mode 1))) (add-hook 'ruby-mode-hook (lambda () (gtags-mode 1) (setq gtags-libpath `((,(expand-file-name "~/.tags/ruby") . "/usr/lib/ruby/1.8"))))) (add-hook 'python-mode-hook (lambda () (gtags-mode 1) (setq gtags-libpath `((,(expand-file-name "~/.tags/python") . " /usr/lib/python2.5")))))
`gtags-libpath' の説明をしてませんでしたと。
ライブラリのタグファイルの指定
通常、プログラムは現在いじってるソースツリーの他に、ライブラリも参照す る。ライブラリのタグファイルの指定は環境変数 `GTAGSLIBPATH' を設定すれ ばよいが、大体の人はライブラリが置いてある場所 (/usr/include/, /usr/lib/) に書き込み権限持ってないんだな。
`gtags-libpath' はバッファローカル変数で、そのファイルが参照するべきラ イブラリのタグ位置を示します。
例えば C 言語のライブラリのタグを生成するには、以下を実行。 `/usr/include' のタグを `~/.tags/c' に、 `/usr/local/include' のタグを `~/.tags/c_local' に作ります。
$ cd /usr/include $ gtags -vv ~/.tags/c $ cd /usr/local/include $ gtags -vv ~/.tags/c_local
この場合、.emacs には以下を追加すればよい。
(add-hook 'c-mode-hook (lambda () (gtags-mode 1) (setq gtags-libpath `((,(expand-file-name "~/.tags/c") . "/usr/include") (,(expand-file-name "~/.tags/c_local") . "/usr/local/include")))))
c-mode-hook を設定して、c-mode に入ったときに、gtags-mode に入り、 さらにライブラリの位置とそれらのタグファイルの位置を指定。
` (バッククオート) の意味は説明しなくてもいいよね…? 絶対パスで指定しないとエラーが出ますので。
*-mode-hook ごとに指定すれば、それぞれの言語でタグファイルを切り替えられるでしょう。
現在の制限というか仕様というか、バグというか
複数のプロジェクトのファイルを開いている場合、gtags-visit-rootdir がプ ロジェクトを認識してくれない。 →仕様です。毎回切り替えてください。
Global がシンボリックリンクを無視してくれる。 →多分仕様。
もっと早く。 →そのうちプロセスを並列に実行する様にしようかと思っています。