GNU Global 手册 - GNU Global 源码标签系统

GNU Global基础部分翻译
原文链接:https://www.gnu.org/software/global/globaldoc_toc.html

Overview of this tool

What is gnu global

  • GNU Global是一个源代码标签系统,
    • 它可以在不同的环境中以相同的方式工作,例如Emacs编辑器、Vi编辑器、Less查看器、Bash shell、各种web浏览器等。
  • 您可以使用该系统在源代码中找到诸如函数、宏、结构体和类等符号的位置,并轻松地移动到那里。
  • 对于一个包含许多子目录、许多#ifdef和许多main()函数的大型项目,它非常有用。
  • 它类似于ctags或etags,但不同于他们之处在于,gtags是独立于编辑器的。

Concept of project

  • GNU Global可以将包含子目录的源代码树视为项目。
  • 在项目的任何地方,都可以使用该高性能标签数据库。
    • 您不需要指定数据库的位置,因为global(1)会自己定位它。
    • 由于这个特性,您可以在一个项目中自由移动,也可以在许多项目中自由进出。

Features

GNU Global具有以下特性:

  • 支持C, Yacc, Java, PHP4和汇编。

  • 在诸如以下不同的环境中,使用同样的工作:

    • Shell命令行
    • Bash shell
    • Vi编辑器(Nvi, Elvis, vim)
    • less
    • Emacs编辑器(Emacs, Mule, Xemacs)
    • Web浏览器
    • Doxygen文档系统
  • 快速查找指定符号的位置。

  • 不仅能定位标签定义,而且定位对标签的引用。

  • 允许复制标签。

  • 定位与指定模式匹配的路径。

  • 默认为分级搜索。

  • 不仅在源项目中搜索,而且在库项目中搜索。

  • 生成补全列表。

  • 支持多种输出格式。

  • 允许自定义要生成tag的一组候选文件。

  • 支持POSIX 1003.2正则表达式。

  • 支持idutils作为外部搜索引擎。

  • tag文件与机器架构无关。

  • 支持标签文件的增量更新。

  • 可以使用解析器插件来处理新语言。

  • 支持使用gtags.conf进行定制化配置。

  • 生成源代码的hypertext。

  • 支持compact格式,节省磁盘空间。

  • 支持客户端/服务器场景(TRAMP可用时)。

  • 忽略二进制文件,点文件和指定文件。

  • 包括cscope兼容程序(gtags-cscope)。

  • 包括类似grep的命令(-g命令)。

  • 支持类似grep的符号高亮显示。

Command Line

您可以从shell命令行使用标签功能。与其他标签系统相比,这是Global的一大优点。

Preparation

在开始之前,请阅读FAQ(常见问题)文件。

$ more /usr/local/share/gtags/FAQ

首先,您必须在源码树的根目录,执行gtags。例如,如果你想在FreeBSD中浏览Vi编辑器的源代码,请切换到源码目录并调用gtags(1)。

$ cd /usr/src/usr.bin/vi
$ gtags

Gtags遍历子目录,从源文件中提取符号,并在当前目录中创建三个标记文件。在此之后,当前目录下的所有文件和目录都被视为一个工程。

$ ls G*
GPATH   GRTAGS  GTAGS
  • GTAGS definition database
  • GRTAGS reference database
  • GPATH path name database

您应该为标记文件准备相当大的磁盘空间。例如,Linux-2.6.32源代码需要的磁盘空间如下:

source code(Linux-2.6.32)       390MB

GPATH                             6MB
GTAGS                            81MB
GRTAGS                          202MB
-------------------------------------
total of tag files              289MB

Basic Usage

考虑以下源码树:

/home/user/
 |
 |-ROOT/      <- the root of source tree (GTAGS,GRTAGS,...)
    |
    |- README       .....   +---------------+
    |                       |The function of|
    |                       +---------------+
    |- DIR1/
    |  |
    |  |- fileA.c   .....   +---------------+
    |  |                    |main(){        |
    |  |                    |       func1();|
    |  |                    |       func2();|
    |  |                    |}              |
    |  |                    +---------------+
    |  |
    |  |- fileB.c   .....   +---------------+
    |                       |func1(){ ... } |
    |                       +---------------+
    |- DIR2/
       |
       |- fileC.c   .....   +---------------+
                            |#ifdef X       |
                            |func2(){ i++; }|
                            |#else          |
                            |func2(){ i--; }|
                            |#endif         |
                            |func3(){       |
                            |       func1();|
                            |}              |
                            +---------------+
  • 一旦您在项目的根目录中创建了tag文件,您就可以从项目的任何地方调用global命令。默认情况下,您将获得所定位文件的相对路径。

    $ cd /home/user/ROOT
    $ global func1
    DIR1/fileB.c            # func1() is defined in fileB.c
    $ cd DIR1
    $ global func1
    fileB.c                 # relative path from DIR1
    $ cd ../DIR2
    $ global func1
    ../DIR1/fileB.c         # relative path from DIR2
    
    • 只有在项目目录中才可以使用global。如果你不在任何项目中,它会显示如下错误信息:

      $ cd /home/user
      $ global func1
      global: GTAGS not found.
      
  • -r选项搜索函数的引用

    $ global -r func2
    ../DIR1/fileA.c         # func2() is referred from fileA.c
    
  • 支持使用POSIX正则表达式

    $ cd /home/user/ROOT
    $ global 'func[1-3]'
    DIR1/fileB.c            # func1, func2 and func3 are matched
    DIR2/fileC.c
    
  • -x选项显示详细信息,类似于ctags命令的-x选项

    $ global func2
    DIR2/fileC.c
    $ global -x func2
    func2              2 DIR2/fileC.c       func2(){ i++; }
    func2              4 DIR2/fileC.c       func2(){ i--; }
    
  • -a选项返回绝对路径名

    $ global -a func1
    /home/user/ROOT/DIR1/fileB.c
    
  • -s选项定位在GTAGS中未定义的符号

    $ global -xs X
    X                  1 DIR2/fileC.c #ifdef X
    
  • -g选项返回有指定pattern的代码行

    $ global -xg '#ifdef'
    #ifdef             1 DIR2/fileC.c #ifdef X
    

    它类似于egrep,但对于源代码阅读来说要方便得多,因为您可以搜索整个项目,而且只在源文件中搜索。

    此外,您可以使用以下选项:

    • -O:仅在文本文件中搜索

    • -o:在源文件和文本文件中搜索

    • -l:在当前路径下搜索

    • -e, -G-i选项也都可用,用法与egrep选项相同

    • --result=grep:指定搜索结果为grep风格

  • -P列出包含指定pattern的路径名

    $ global -P fileB
    DIR1/fileB.c
    $ global -P '1/'
    DIR1/fileA.c
    DIR1/fileB.c
    $ global -P '\.c$'
    DIR1/fileA.c
    DIR1/fileB.c
    DIR2/fileC.c
    
  • -f选项列出指定文件的tags列表

    $ global -f DIR2/fileC.c
    func2              2 DIR2/fileC.c   func2(){ i++; }
    func2              4 DIR2/fileC.c   func2(){ i--; }
    func3              6 DIR2/fileC.c   func3(){
    

Applied Usage

  • 您可以自定义要生成tag的一组候选文件

    $ find . -type f -print >/tmp/list     # make a file set
    $ vi /tmp/list                         # customize the file set
    $ gtags -f /tmp/list
    
  • 如果源文件位于只读设备(如CDROM)上,则不能在源代码树的根目录上创建tag文件。

    • 此时,您可以使用GTAGSROOT环境变量在其他地方创建标记文件。

      $ 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
      
    • 还有另一种方法。由于global也会在/usr/obj + <当前目录>中查找tag文件,你可以像下面这样设置。

      $ cd /cdrom/src                 # the root of source tree
      $ mkdir -p /usr/obj/cdrom/src
      $ gtags /usr/obj/cdrom/src      # make tag files in /usr/obj/cdrom/src
      $ global func
      
  • 如果希望定位source tree中没有定义的符号,那么可以使用GTAGSLIBPATH环境变量指定库目录。

    • 您应该在GTAGSLIBPATH中的每个目录执行gtags。如果没有找到GTAGS, global将忽略这些目录。
    $ 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
    
    • 或者,你可以用一种更直接的方法来做同样的事情。在下面的示例中,我们将系统库和内核视为项目的一部分。

      $ ln -s /usr/src/lib .
      $ ln -s /usr/src/sys .
      $ gtags
      $ global strlen
      lib/libc/string/strlen.c
      $ global access
      sys/kern/vfs_syscalls.c
      
  • 如果忘记了符号名称,可以使用-c (complete)命令

    $ global -c kmem                # maybe k..k.. kmem..
    kmem_alloc
    kmem_alloc_pageable
    kmem_alloc_wait
    kmem_free
    kmem_free_wakeup
    kmem_init
    kmem_malloc
    kmem_suballoc                   # This is what I need!
    $ global kmem_suballoc
    ../vm/vm_kern.c
    
  • 可以在shell补全命令中使用-c选项

    # In Bash:
    
    $ funcs()
    > {
    >         local cur
    >         cur=${COMP_WORDS[COMP_CWORD]}
    >         COMPREPLY=(`global -c $cur`)
    > }
    $ complete -F funcs global
    $ global kmem_TABTAB
    kmem_alloc           kmem_alloc_wait      kmem_init
    kmem_alloc_nofault   kmem_free            kmem_malloc
    kmem_alloc_pageable  kmem_free_wakeup     kmem_suballoc
    $ global kmem_sTAB
    $ global kmem_suballoc
    ../vm/vm_kern.c
    
  • 您可以通过键入一个命令,来编辑所有具有指定tag的文件。例如:

    $ vi `global func1`     # edit fileB.c
    
  • 如果你想按顺序浏览多个文件,请执行以下操作

    $ global -xr fork | awk '{printf "view +%s %s\n",$2,$3}'
    view +650 ../dev/aic7xxx/aic7xxx_asm.c
    view +250 ibcs2/ibcs2_misc.c
    view +401 linux/linux_misc.c
    view +310 ../kern/init_main.c
    view +318 ../kern/init_main.c
    view +336 ../kern/init_main.c
    view +351 ../kern/init_main.c
    $ !! | sh            # from now on, go to next tag with ’ZZ’.
    

Various Applications

Global facility for Bash

Features
  • 可以使用类似vi的tag stack

  • 可以使用类似emacs的tag名称补全

  • 自动调用编辑器。

  • 可以使用tag标记工具

  • 你可以通过cookie工具管理一个目录列表。

Preparation

首先,安装好global程序。然后可以调用globash命令。

$ globash

第一次启动时,会看到以下消息。

# GloBash needs a working directory. Do you create '/home/you/.globash'? ([y]/n)

按ENTER键,你会看到如下提示:

# [/usr/src/sys]/kern _

该提示说明当前目录为’ /usr/src/sys/kern ‘,项目的根目录为’ /usr/src/sys '。tag和marker只在项目中有效。

当你试图离开项目时,globash警告如下:

[/usr/src/sys] cd ..
You are going to get out of the current project.
Tag stack and marker will be removed. Sure? ([y]/n)_

如果你的答案是y RET或只是RET,那么标签堆栈和marker(稍后描述)将被删除。

如果你需要帮助,请键入ghelp

Usage
  • 大多数global的命令字符都可以作为命令使用。

    如果没有指定参数,则使用最新的参数。

    [/usr/src/sys] x fork           <- (global -x fork)
    >    1  fork              94 kern/kern_fork.c fork(p, uap)
    [/usr/src/sys] r                <- (global -xr fork)
    >    1  fork              85 alpha/linux/linux_machdep.c
         2  fork             184 i386/linux/linux_machdep.c
    [/usr/src/sys] s lbolt          <- (global -xs lbolt)
    >    1  lbolt            1210 i386/isa/wd_cd.c     tsleep((cad
    	 2  lbolt            1211 i386/isa/wd_cd.c     tsleep((cad
     	 3  lbolt            709 i386/isa/wfd.c     tsleep ((caddr
    ...
    [/usr/src/sys] g                <- (global -xg lbolt)
    >    1  lbolt            1210 i386/isa/wd_cd.c     tsleep((cad
    ...
    [/usr/src/sys] P init           <- (global -xP init)
    >    1  path    1 dev/hea/eni_init.c 
         2  path    1 dev/hfa/fore_init.c 
         3  path    1 i386/i386/initcpu.c 
         4  path    1 kern/init_main.c 
         5  path    1 kern/init_sysent.c 
         6  path    1 kern/vfs_init.c 
         7  path    1 vm/vm_init.c 
    [/usr/src/sys] _
    
  • 输入补全可用。对于每个命令,都会应用适当的补全

    [/usr/src/sys] x kmem_TABTAB
    kmem_alloc          kmem_free           kmem_malloc         
    kmem_alloc_nofault  kmem_free_wakeup    kmem_object         
    kmem_alloc_wait     kmem_init           kmem_suballoc       
    [/usr/src/sys] x kmem_sTAB
    [/usr/src/sys] x kmem_suballoc
    
  • 可以通过show命令选择tag。

    [/usr/src/sys] x main
    >    1  main              70 alpha/alpha/gensetdefs.c main(in
         2  main             1500 alpha/alpha/ieee_float.c main(i
         3  main             227 boot/alpha/boot1/boot1.c main()
    ....
    [/usr/src/sys] show 3           # 默认使用vi打开该tag
    (Load editor and show boot/alpha/boot1/boot1.c at line 227.)
    

    默认编辑器为vi(1)。可以通过EDITOR环境变量静态指定,也可以通过选项临时指定。

    [/usr/src/sys] show -e 3                # emacs打开
    (Preloaded emacs show boot/alpha/boot1/boot1.c at line 227.)
    [/usr/src/sys] show -l 3                # less打开
    (Load less and show boot/alpha/boot1/boot1.c at line 227.)
    [/usr/src/sys] show -g 3                # firefox打开
    (Preloaded firefox show boot/alpha/boot1/boot1.c at line 227.)
    

    您还可以使用以下命令(以缩写形式):

    list (l)                # print tag list.
    first                   # go to the first tag.
    last                    # go to the last tag.
    next (n)                # go to the next tag.
    prev (p)                # go to the previous tag.
    show N (1,2,3,..,999)   # go to Nth tag
    
  • 您可以使用类似vi的tag stack。您可以通过pop或CTRL-T命令返回到之前的标记列表。

    使用tags命令查看当前tag

    [/usr/src/sys] x main
    >    1  main              70 alpha/alpha/gensetdefs.c main(in
         2  main             1500 alpha/alpha/ieee_float.c main(i
         3  main             227 boot/alpha/boot1/boot1.c main()
    ....
    [/usr/src/sys] show 3
    (Load editor and show boot/alpha/boot1/boot1.c at line 227.)
    [/usr/src/sys] x fork           <- push new tag on the tag stack.
    >    1  fork              94 kern/kern_fork.c fork(p, uap)
    [/usr/src/sys] pop              <- pop tag stack.
    [/usr/src/sys] show
    (Load editor and show boot/alpha/boot1/boot1.c at line 227.)
    
  • 使用mark命令记忆tags

    marked标签在您退出当前项目或退出当前bash会话之前都是有效的。

    [/usr/src/sys] x fork
    >    1  fork              94 kern/kern_fork.c fork(p, uap)
    [/usr/src/sys] mark
    [/usr/src/sys] x main
    >    1  main              70 alpha/alpha/gensetdefs.c main(in
         2  main             1500 alpha/alpha/ieee_float.c main(i
         3  main             227 boot/alpha/boot1/boot1.c main()
    ....
    [/usr/src/sys] mark -l          <- show marker list.
    1  fork              94 kern/kern_fork.c fork(p, uap)
    [/usr/src/sys] mark 1           <- select a marker.
    (Load editor and show kern/kern_fork.c at line 94.)
    [/usr/src/sys] list
    >    1  main              70 alpha/alpha/gensetdefs.c main(in
         2  main             1500 alpha/alpha/ieee_float.c main(i
         3  main             227 boot/alpha/boot1/boot1.c main()
    ....
    
  • 使用cookie命令记忆目录,并使用wrap命令返回到这些记录的目录

    [/usr/src/sys] cookie           <- drop a cookie.
    [/usr/src/sys] cd kern
    [/usr/src/sys]/kern cookie      <- drop a cookie again.
    [/usr/src/sys]/kern cd ../i386
    [/usr/src/sys]/i386 cookie -l   <- show cookie list.
    	1  /usr/src/sys/kern
    	2  /usr/src/sys
    [/usr/src/sys]/i386 warp 2      <- warp to the selected cookie.
    [/usr/src/sys] _
    

Less using Global

Nvi-1.81.5 using Global

Elivs using Global

Vim using Global

在Vim 6.2或更高版本中,您可以使用gtags.vim脚本。

Features
  • 您可以在Vim中使用Global的大部分功能。

  • 智能识别当前token及其类型。

  • 可以使用特殊字符%#和输入补全。

遗憾的是,tag stack功能不可用。如果您想使用该工具,请尝试使用gtags-cscope.vim

Preparation
# 将gtags.vim拷贝到你的插件目录下
# 以下只是一种示例
$ cp /usr/local/share/gtags/gtags.vim $HOME/.vim/plugin
Usage
  • 跳转到main

    :Gtags main
    
    • Vim执行global,解析输出,在quickfix窗口中列出定位到的tags并加载第一个条目。

    • quickfix窗口:

      gozilla/gozilla.c|200| main(int argc, char **argv)
      gtags-cscope/gtags-cscope.c|124| main(int argc, char **argv)
      gtags-parser/asm_scan.c|2056| int main()
      gtags-parser/gctags.c|157| main(int argc, char **argv)
      gtags-parser/php.c|2116| int main()
      gtags/gtags.c|152| main(int argc, char **argv)
      [Quickfix List]
      
    • quickfix窗口命令

      :cn                # go to the next entry.
      :cp                # go to the previous entry.
      :ccN               # go to the N’th entry.
      :cl                # list all entries.
      
    • quickfix窗口帮助

      :h quickfix
      
    • 建议的按键映射

      map <C-n> :cn<CR>
      map <C-p> :cp<CR>
      
  • 查找引用

    :Gtags -r func1
    
  • 要定位GTAGS中未定义的符号,请尝试以下操作

    2021.11.27 - 翻译吐槽,这玩意有啥用😒

    :Gtags -s lbolt
    
  • 要定位字符串,尝试以下操作

    :Gtags -g int argc
    :Gtags -g "root"
    :Gtags -ge -C               <- locate ’-C’
    
  • 要获取指定文件中的tag list,使用-f选项。

    :Gtags -f main.c            <- locate tags in main.c
    

    如果正在编辑main.c本身,可以使用’ % '代替。

    :Gtags -f %                 <- locate tags in main.c
    
  • 支持使用POSIX正则表达式

    :Gtags ^put_                  <- locate tags starting with ’put_’
    :Gtags -g fseek(.*SEEK_SET)   <- locate fseek() using SEEK_SET
    
  • 支持输入补全

    在命令行中,输入一些字符后按CTRL-D, Vim将显示一个以字符串开头的标记名称列表。按TAB键,Vim将完成标签名。

    :Gtags fuTAB
    :Gtags func1                <- ’nc1’ is appended by vim
    
  • 您可以浏览路径包含指定pattern的文件。

        :Gtags -P /vm/              <- under vm/ directory
        :Gtags -P \.h$              <- all include files
        :Gtags -P init              <- path including ’init’
    
  • 除了-c -n -p -q -u -v和所有长名称选项外,您可以使用global的所有选项。它们被原样发送到global。

    :Gtags -gi paTtern        <- matches both ’PATTERN’ and ’pattern’
    :Gtags -POi make          <- matches Makefile but not makeit.c
    
  • GtagsCursor命令显示当前token的定义或引用。

    如果当前token的上下文是一个定义,那么它等价于:Gtags -r current-token,如果它是对某些定义的引用,那么它等价于:Gtags current-token;否则它等价于:Gtags -s current-token

    :GtagsCursor
    

    建议的按键映射:

    map <C-\>^] :GtagsCursor<CR>
    
  • 如果您有一个由htags生成的超文本,那么您可以在您的浏览器中显示源代码的相同部分。让我们加载firefox并尝试

    :Gozilla
    
  • 打开vim并跳转到main函数

     $ vim '+Gtags main'
    

Extended Emacs using Global

Gtags-cscope

你也可以使用cscope作为GNU global的客户端。Global包中包含一个名为gtags-cscope的命令,它是cscope的一个移植版本,也就是说,它本身就是cscope,只是它使用Global而不是cscope作为搜索引擎。

$ gtags-cscope

可以在vim编辑器中使用它的功能,按照以下方式在命令模式中输入:

:set csprg=gtags-cscope
:cs add GTAGS
  • 然后,您可以在Vim编辑器中使用内置的cs find命令。

  • 虽然欺骗并不完美(cs find d没有实现),但这种方法可能比gtags更方便。

    • 您可以使用vim的tag stack工具。

Hypertext generator

Doxygen using Global

Other topics

How to configure Global

您可以使用配置文件自定义Global。

$ cp gtags.conf /etc/gtags.conf         # system wide config file.
$ vi /etc/gtags.conf

$ cp gtags.conf $HOME/.globalrc         # personal config file.
$ vi $HOME/.globalrc
  • 如果$HOME/.globalrc文件存在,则global使用它;
  • 否则如果/etc/gtags.conf存在,则global使用;
  • 否则使用默认值。
  • conf的格式类似于termcap(5)。默认情况下,使用’ default '目标。

Plug-in parser

  • 您可以为gtags(1)编写一个新的解析器。

  • 命令层插件解析器被取消。请编写函数层插件解析器以代替。

  • 请参阅plugin-factory/来发现函数层插件解析器。

  • 您也可以使用Universal ctag作为插件解析器。

    # Installation of Global
    # It assumed that ctags command is installed in '/usr/local/bin'.
    
    $ ./configure --with-universal-ctags=/usr/local/bin/ctags
    $ make
    $ sudo make install
    
    # Executing of gtags
    # It assumed that Global is installed in '/usr/local'.
    
    $ export GTAGSCONF=/usr/local/share/gtags/gtags.conf
    $ export GTAGSLABEL=new-ctags
    $ gtags                         # gtags invokes Universal Ctags internally
    

Incremental updating

修改一些源文件时,不需要重新创建整个标记文件。相反,您可以使用增量更新工具(-u选项)。

$ gtags
$ cd kernel
$ vi user.c                             # modify user.c
...
:wq
$ global -vu                            # -v means verbose
[Sat May 29 00:31:41 JST 2010] Gtags started.
Tag found in '/usr/local/src/linux-2.6.32'.
Incremental updating.
[Sat May 29 00:31:43 JST 2010] Updating 'GTAGS' and 'GRTAGS'.
[1/1] deleting tags of kernel/user.c
[1/1] extracting tags of kernel/user.c
Global databases have been modified.
[Sat May 29 00:31:51 JST 2010] Done.

$ global -vu                            # try again
[Sat May 29 00:33:16 JST 2010] Gtags started.
Tag found in '/usr/local/src/linux-2.6.32'.
Incremental updating.
Global databases are up to date.       # do nothing
[Sat May 29 00:33:19 JST 2010] Done.

Command References

global - print locations of given symbols

SYNOPSIS
global [-adEFGilMnNqrstTvx][-S dir][-e] pattern
global -c[dFiIMoOPrsT] prefix
global -f[adlnqrstvx][-L file-list][-S dir] files
global -g[aEGilMnoOqtvVx][-L file-list][-S dir][-e] pattern [files]
global -I[ailMnqtvx][-S dir][-e] pattern
global -P[aEGilMnoOqtvVx][-S dir][-e] pattern
global -p[qrv]
global -u[qv]
Examples
$ ls -F
Makefile      src/    lib/
$ gtags
$ ls G*
GPATH   GRTAGS  GTAGS
$ global main
src/main.c
$ (cd src; global main)
main.c
$ global -x main
main              10 src/main.c  main (argc, argv) {
$ global -f src/main.c
main              10 src/main.c  main (argc, argv) {
func1             55 src/main.c  func1() {
func2             72 src/main.c  func2() {
func3            120 src/main.c  func3() {
$ global -x '^[sg]et'
set_num           20 lib/util.c  set_num(values) {
get_num           30 lib/util.c  get_num() {
$ global -rx set_num
set_num          113 src/op.c            set_num(32);
set_num          225 src/opop.c               if (set_num(0) > 0) {
$ global strlen
$ (cd /usr/src/sys; gtags)
$ export GTAGSLIBPATH=/usr/src/sys
$ global -a strlen
/usr/src/sys/libkern/strlen.c
$ (cd /usr/src/lib; gtags)
$ GTAGSLIBPATH=/usr/src/lib:/usr/src/sys
$ global -a strlen
/usr/src/lib/libc/string/strlen.c

gtags - create tag files for global

SYNOPSIS
gtags [-ciIOqvw][-C dir][-d tag-file][-f file][dbpath]
Examples
$ ls -F
Makefile      src/    lib/
$ gtags -v
$ global -x main
main              10 src/main.c  main (argc, argv) {

htags - generate a hypertext from a set of source files

htags-server - a private web/cgi server fot htgas

gozilla - force firefox to display specified part of a source file

gtags-cscope - interactively examine a C program

SYNOPSIS
gtags-cscope [-bCdehLlVv][-F file ][-012345678 pattern][-p n]
Requesting the initial search

After the cross-reference is ready, gtags-cscope will display this menu:

Find this symbol:
Find this global definition:
Find functions called by this function (N/A):
Find references of this function:
Find this text string:
Change this text string:
Find this egrep pattern:
Find this file:
Find files #including this file:
Find assignments to this symbol:

Press the or keys repeatedly to move to the desired input field, type the text to search for, and then press the key.

globash - a special shell of Global using GNU bash

gtags.conf - configuration data for GNU Global

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值