GNU Global 関係

個人的な改造点など。

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 がシンボリックリンクを無視してくれる。 →多分仕様。

もっと早く。 →そのうちプロセスを並列に実行する様にしようかと思っています。