本文引用自 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'