Gtags で C++ のクラス名が正しく取得できない問題が出て、その解決ができたので書き残しておこうと思います。
プロジェクトルートに gtags.conf
を配置すると gtags
は自動的にその設定を読み込みます。ぼくはスキップしたいディレクトリ build/
があったのでそれを追加しました。
設定は homebrew
でインストールした /usr/local/opt/global/share/gtags/gtags.conf
からコピーして不要そうな部分を削除しています。
$ cat gtags.conf
default:\
:tc=gtags:
#---------------------------------------------------------------------
# Configuration for gtags(1)
# See gtags(1).
#---------------------------------------------------------------------
common:\
:skip=GPATH,GTAGS,GRTAGS,GSYMS,,HTML/,HTML.pub/,html/,tags,TAGS,ID,y.tab.c,y.tab.h,cscope.out,cscope.po.out,cscope.in.out,SCCS/,RCS/,CVS/,CVSROOT/,{arch}/,autom4te.cache/,build/:
gtags:\
:tc=common:\
:langmap=c\:.c.h,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:
gtags
この設定のとき、C++ のプロジェクトで gtags
を実行しても global Klass
の結果が取得できなかったのが今回の問題です (Klass は例)。
原因
僕の C++ プロジェクトではソースコードの拡張子が .cpp
と .h
なのですが、この gtags.conf
の設定では C++ の拡張子に .h
がなく、C の方に .h
がありました。要するにヘッダファイルだけ C++ ではなく C としてパースされてしまい、C には class が存在しないのでタグが生成されなかったのでした。
解決方法
:langmap=c\:.c.h,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:
gtags
この部分を
:langmap=c\:.c,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H.h,php\:.php.php3.phtml:
gtags
と変更しました。あと、C/C++ しか必要がないのでもっとシンプルに
:langmap=c\:.c,asm\:.s.S,cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H.h:
としておきました。.h は必ず C++ としてパースされてしまいますが、互換性があるはずなので問題ないはずです。まだこの状態でバリバリコードを書いてないのでミスがあるかもしれませんがとりあえず動いてます。
今日の今まで ctags を使い続けてましたが、gtags 良いですね。乗り換えてよかった!