问题
以前一直用cscope进行代码索引,最近想尝试一下gtags,也就是GNU Global,却遇到一个问题:就是公司的项目中,有的C代码的文件的扩展名并不是.h或者.c(例如.hbc和.hbh),在这种情况下,gtags的默认配置无法索引到这些文件中的定义。
如何做?
我找到的方法是修改gtags的配置文件,使得gtags将这些非常见的扩展名识别成C语言的源文件。
从gtags的网站找到配置文件修改相关的文档http://www.gnu.org/software/global/globaldoc.html#SEC41。可惜文档几乎没讲什么,只说明了文件$HOME/.globalrc是个人配置文件,可以把默认配置文件copy到这个文件,然后再根据自己的需要修改配置。坑爹的是,文档中没有说明默认的配置文件示例在哪里。
经过一番搜索,在目录/usr/share/doc/global/examples/找到了默认的配置文件gtags.conf。
-
首先将gtags.conf复制到~/.globalrc文件:
`$cp /usr/share/doc/global/examples/gtags.conf ~/.globalrc`
开始编辑~/.globalrc文件,其中和本文的问题有关的一段配置是
common:\
:skip=GPATH,GTAGS,GRTAGS,GSYMS,HTML/,HTML.pub/,html/,tags,TAGS,ID,y.tab.c,y.tab.h,.notfunction,cscope.out,cscope.po.out,cscope.in.out,.gdbinit,SCCS/,RCS/,CVS/,CVSROOT/,{arch}/,.svn/,.git/,.cvsrc,.cvsignore,.gitignore,.cvspass,.cvswrappers,.deps/,autom4te.cache/,.snprj/:\
:langmap=c\:.c.h,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:
其中的langmap就是我们需要修改的配置,langmap具体的含义可以通过man gtags
查看(打开手册后搜索langmap即可看到)。这里简单说一下,langmap的意思就是把一个语言和对应的扩展名关联起来,格式是language\:extensions list,例如c\:.c.h就表示扩展名为.h和.c的文件会解析为C语言。因此为了让gtags将.hbh和.hbc也解析为C语言,将C语言的配置修改为c\:.c.h.hbc.hbh。langmap的完整设置就变成:
langmap=c\:.c.h.hbc.hbh,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:
保存配置后,重新生成gtags的索引文件,这个时候进行搜索就能索引到.hbc和.hbh文件中的内容啦。
另外,顺便说一下,配置文件中的:skip变量的配置就是指gtags在创建索引文件的时候忽略哪些文件和目录。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。