本文引用自 http://forum.ubuntu.org.cn/viewtopic.php?f=68&t=343460
http://blog.chinaunix.net/uid-20416834-id-120183.html 感谢作者们
gnu global是一个类似cscope的工具,也能提供源文件之间的交叉索引。
其独到之处在于,当生成索引文件以后,再修改整个项目里的一个文件,然后增量索引的过程非常快。
安装过程省略。
安装好以后,有global、gtags、gtags-cscope三个命令。global是查询,gtags是生成索引文件,gtags-cscope是与cscope一样的界面。
example:
这条命令会在你修改一个c文件并:w以后,自动进入c文件所在目录并执行"global -u"更新索引文件。
最后,还有一个问题,cscope有一个-f参数,这个参数可以指定cscope.out文件的路径。而gtags-cscope的哲学不一样,它是自己一路向上寻找GTAGS文件,所以没有-f参数。而vim调用:cs add的时候,是会使用-f参数的。这样,当:cs add GTAGS文件的时候,就不能指定当前目录的子目录以外的路径。这也导致:cs add命令只能使用一个GTAGS文件。
针对这个问题,我写了一个vim的patch http://forum.ubuntu.org.cn/viewtopic.php?f=68&t=342099,在fork出gtags-cscope子进程以后会把子进程chdir()到GTAGS文件所在的目录,这样就OK了。
Global源码标签工具支持C,C++,YACC,JAVA,PHP4,ASM。并且可以与shell,vi,emacs,浏览器,doxygen等等配合使用。也是款不错的工具。
$cd /usr/src/linux
$gtags
$ls G*
GPATH GRTAGS GSYMS GTAGS
$global start_kernel
arch/alpha/boot/bootp.c
arch/alpha/boot/bootpz.c
arch/alpha/boot/main.c
init/main.c
$global -r start_kernel
arch/blackfin/mach-bf548/head.S
arch/frv/kernel/debug-stub.c
arch/mn10300/kernel/gdb-stub.c
...
$global 'ah[46]_init'
net/ipv4/ah4.c
net/ipv6/ah6.c
$global -x ah4_init
ah4_init 321 net/ipv4/ah4.c static int __init ah4_init(void)
$global -a ah4_init
/usr/src/linux-source-2.6.26/net/ipv4/ah4.c
global -xs X |more
X 161 arch/alpha/kernel/setup.c #define WEAK(X) \
X 39 arch/arm/common/dmabounce.c #define DO_STATS(X) do { X ; } while (0)
X 41 arch/arm/common/dmabounce.c #define DO_STATS(X) do { } while (0)
...
$global -xg 'Linus Torvalds' | more
Linus%20Torvalds 8 arch/alpha/boot/bootp.c * based significantly on the arch/alpha/boot/main.c of Linus Torvalds
Linus%20Torvalds 9 arch/alpha/boot/bootpz.c * based significantly on the arch/alpha/boot/main.c of Linus Torvalds
Linus%20Torvalds 4 arch/alpha/boot/main.c * Copyright (C) 1994, 1995 Linus Torvalds
...
$global -P 'head\.S$'
arch/alpha/boot/head.S
arch/alpha/kernel/head.S
arch/arm/boot/compressed/head.S
arch/arm/kernel/head.S
...
$global -f net/ipv4/af_inet.c
DEFINE_SNMP_STAT 119 net/ipv4/af_inet.c DEFINE_SNMP_STAT(struct linux_mib, net_statistics) __read_mostly;
inet_autobind 174 net/ipv4/af_inet.c static int inet_autobind(struct sock *sk)
inet_listen 194 net/ipv4/af_inet.c int inet_listen(struct socket *sock, int backlog)
...
$cd net/ipv4/
$global -l ah[46]_init
ah4.c
$ find . -type f -print >/tmp/list # make a file set
$ vi /tmp/list # customize the file set
$ gtags -f /tmp/list
$ mkdir /var/dbpath
$ cd /cdrom/src # the root of source tree
$ gtags /var/dbpath # make tag files in /var/dbpath
$ export GTAGSROOT=`pwd`
$ export GTAGSDBPATH=/var/dbpath
$ global func
$ pwd
/develop/src/mh # this is a source project
$ gtags
$ ls G*TAGS
GRTAGS GTAGS
$ global mhl
uip/mhlsbr.c # mhl() is found
$ global strlen # strlen() is not found
$ (cd /usr/src/lib; gtags) # library source
$ (cd /usr/src/sys; gtags) # kernel source
$ export GTAGSLIBPATH=/usr/src/lib:/usr/src/sys
$ global strlen
../../../usr/src/lib/libc/string/strlen.c # found in library
$ global access
../../../usr/src/sys/kern/vfs_syscalls.c # found in kernel
$global -c start_k
start_kcs_transaction
start_kernel
start_kernel_proc
start_kernel_thread
$gtags
$htags
$mkdir ~/.vim
$mkdir ~/.vim/plugin
$cp /usr/share/doc/global/examples/gtags.vim.gz ~/.vim/plugin/
$cd ~/.vim/plugin
$gzip -d gtags.vim.gz
:Gtags start_kernel //打开函数浏览
[Quickfix List]操作
:cn //切换下一个文件
:cp //切换前一个文件
:ccN //N为数字,切换到指定序号文件
:cl //查看整个列表
:h quickfix //list帮助
$vim '+Gtags start_kernel'