ctags使用细节

1、使用tags
   
    tag是什么?一个位置。它记录了关于一个标识符在哪里被定义的信息,比如C或C++程序中的一个函数定义。这种tag聚集在一起被放入一个tags文件。这个文件可以让Vim能够从任何位置起跳达到tag所指示的位置-标识符被定义的位置。

下面的命令可以为当前目录下的所有C程序文件生成对应的tags文件:
        (shell command) ctags *.c

现在你在Vim中要跳到一个函数的定义(如startlist)就可以用下面的命令:
       (ex command) :tag startlist
这个命令会带你到函数"startlist"的定义处,哪怕它是在另一个文件中。

CTRL+] 命令会取当前光标下的word作为tag的名字并直接跳转。这使得在大量C程序中进行探索更容易一些。假设你正看函数"write block",发现它调用了一个叫"write line"的函数,这个函数是干什么的呢?你可以把光标置于"write_line"上,按下CTRL+] 即可。如果"write_line"函数又调用了 "write_ char".你当然又要知道这个函数又是什么功能。同时,置光标于"write_char"上按下CTRL+]。现在你位于函数"write_char"的定义处。

":tags"命令会列出现在你就已经到过哪些tag了:
       (ex command):tags
       #      TO          tag       FROM line          in file/text
       1       1       write_line        8             write_block.c
       2       1       write_char        7             write_line.c

现在往回走。CTRL+T命令会跳到你前一次的tag处。在上例中它会带你到调用了"write_char"的"write_line"函数的地方。CTRL+T可以带一个命令记数, 以此作为往回跳的次数, 你已经向前跳过了,现在正在往回跳,我们再往前跳一次。下面的命令可以直接跳转到当前tag序列的最后:
       (ex command) :tag
你也可以给它一个前辍, 让它向前跳指定的步长. 比如":3tag"。CTRL+T也可以带一个前辍。这些命令可以让你向下深入一个函数调用树(使用CTRL+]), 也可以回溯跳转(使用CTRL+T). 还可以随时用":tags"看你当前的跳转历史记录。

2、分隔窗口

":tag"命令会在当前窗口中载入包含了目标函数定义的文件。但假设你不仅要查看新的函数定义,还要同时保留当前的上下文呢?你可以在":tag"后使用一个分隔窗口命令":split"。Vim还有一个一举两得的命令:
      (ex command) :stag tagname
要分隔当前窗口并跳转到光标下的tag:
      (normal mode command) CTRL+W+]
如果同时还指定了一个命令记数, 它会被当作新开窗口的行高.

3、多个tags文件

如果你的源文件位于多个目录下,你可以为每个目录都建一个tags文件。Vim会在使用某个目录下的tags文件进行跳转时只在那个目录下跳转。

要使用更多tags文件,可以通过改变‘tags‘选项的设置来引入更多的tags文件。如:
       (ex command) :set tags=./tags, ./../tags, ./*/tags
这样的设置使Vim可以使用当前目录下的tags文件,上一级目录下的tags文件,以及当前目录下所有层级的子目录下的tags文件。这样可能会引入很多的tags文件,但还有可能不敷其用。比如说你正在编辑"~/proj/src"下的一个文件,但又想使用"~/proj/sub/tags"作为 tags文件。对这种Vim情况提供了一种深度搜索目录的形式。如下:(ex command) :set tags=~/proj/**/tags

4、单个tags文件

Vim在搜索众多的tags文件时,你可能会听到你的硬盘在咔嗒咔嗒拼命地叫。显然这会降低速度。如果这样还不如花点时间生成一个大一点的tags文件。这需要一个功能丰富的ctags程序,比如上面提到的那个。它有一个参数可以搜索整个目录树:
       (shell command)cd ~/proj
        ctags -R
    用一个功能更强的ctags的好处是它能处理多种类型的文件。不光是C和C++源程序,也能对付Eiffel或者是Vim脚本。你可以参考ctags程序的文件调整自己的需要。现在你只要告诉Vim你那一个tags文件在哪就行了:
        (ex command) :set tags=~/proj/tags

5、同名tag
当一个函数被多次重载(或者几个类里都定义了一些同名的函数),":tag"命令会跳转到第一个符合条件的。如果当前文件中就有一个匹配的,那又会优先使用它。当然还得有办法跳转到其它符合条件的tag去:       (ex command) :tnext 重复使用这个命令可以发现其余的同名tag。如果实在太多,还可以用下面的命令从中直接选取一个:       (ex command) :tselect tagname Vim会提供给你一个选择列表,例如:(Display)
#     pri     kind     tag               file 1      F        f      mch_init     os_amiga.c                         mch_init() 2      F        f      mch_init     os_mac.c                         mch_init() 3      F        f      mch_init     os_msdos.c                         mch_init(void) 4      F        f      mch_init     os_riscos.c                         mch_init() Enter nr of choice ( to abort):
   现在你只需键入相应的数字(位于第一栏的)。 其它栏中的信息是为了帮你作出决策的。在多个匹配的tag之间移动,可以使用下面这些命令:        (ex command):tfirst             go to first match                    :[count]tprevious   go to [count] previous match                    :[count]tnext       go to [count] next match                    :tlast              go to last match 如果没有指定[count],默认是1。
    6、tag的名字
    命令补齐真是避免键入一个长tag名的好办法。只要输入开头的几个字符然后按下制表符:        (ex command) :tag write_ Vim 会为你补全第一个符合的tag名。如果还不合你意,接着按制表符直到找到你要的。有时候你只记得一个tag名的片段,或者有几个tag开头相同。这里你可以用一个模式匹配来告诉Vim你要找的tag。
    假设你想跳转到一个包含"block"的tag。首先键入命令:(ex command) :tag /block。现在使用命令补齐:按。Vim会找到所有包含"block"的tag并先提供给你第一个符合的。"/"告诉Vim下面的名字不是一五一十的tag名,而是一个搜索模式。通常的搜索技巧都可以用在这里。比如你有一个tag以"write "开始:(ex command) :tselect / ^write_,"^"表示这个tag以"write_"开始。不然在半中间出现write的tag也会被搜索到。同样"$"可以用于告诉Vim要查找的tag如何结束。
    7、tags的浏览器
    CTRL+]可以直接跳转到以当前光标下的word为tag名的地方去,所以可以在一个tag列表中使用它。下面是一个例子。首先建立一个标识符的列表(这需要一个好的ctags):       (shell command) ctags --c-types=f -f functions *.c
    现在直接启动Vim, 以一个垂直分隔窗口的编辑命令打开生成的文件:        (shell command) vim:vsplit functions     这个窗口中包含所有函数名的列表。可能会有很多内容,但是你可以暂时忽略它。用一个":setlocal ts=99"命令清理一下显示。在该窗口中,定义这样的一个映射:         (ex command):nnoremap 0yew:tag "     现在把光标移到你想要查看其定义的函数名上,按下回车键,Vim就会在另一个窗口中打开相应的文件并定位到到该函数的定义上。

基本命令:

在vim中ctags的简单使用 1) 跳转到指定的函数进入vim后,用 “:tag func_name“ 跳到函数func_name处。使用tag 命令时,可以使用TAB键进行匹配查找,继续按TAB键向下切换。 某个函数有多个定义时
:tag 跳到第一个定义处,优先跳转到当前文件 :tnext 跳到第一个 :tfirst 跳到前count个:[count]tprevious
跳到后count个
:[count]tnext
跳到最后一个
:tlast
你也可以在所有tagname中选择:
:tselect tagname

如果想跳到包含block的标识符:“tag /block” 然后用TAB键来选择。这里‘/‘就是告诉vim
‘block‘是一个语句块标签。
2)用“CTRL + ]“快捷键,跳转到光标所在函数标识符的定义处。
3)使用“CTRL + T”退回上层。如果想在以write_开头的标识符中选择一下, :tselect /^
write_ 这里,‘^‘表示开头,同理,‘$‘表示末尾。多个同名的标识符

时间: 2024-10-21 08:09:36

ctags使用细节的相关文章

man ctags

ctags命令帮助 命令格式 ctags [options] [file(s)] 或 etags [options] [file(s)] 源文件参数 不同语言中对象的种类及定义方式等都有尽相同,ctags可根据文件名(及后缀)自动选择源文件所对应的语言(如.c->c; .cc/.cpp/.cxx->c++; .java->java ...) 详细的对应关系,执行命令ctags --list-maps可获取 如不能从文件名中获取所需要的信息将文件归类,ctags会尝试读取文件的首行内容,判

Linux中ctags、make以及进度条小程序(\r的应用)

一.ctags  查看函数定义的好工具 ctags -R 在当前目录建立tags文件 ctrl +]  + 回车 跳到函数定义处 ctrl + t 返回 二.make与Makefile make 是一条命令 Makefile 是一个文件 make的执行需要一个Makefile文件 Makefile 两个重要关系 依赖关系 依赖方法 touch Makefile/makefile 1 依赖方法前面要有Tab键 2 进行过程从上向下 向下时只要有一个可以执行就回退(向上走.退栈) 不再执行下面的(伪

关于SVM数学细节逻辑的个人理解(三) :SMO算法理解

第三部分:SMO算法的个人理解 接下来的这部分我觉得是最难理解的?而且计算也是最难得,就是SMO算法. SMO算法就是帮助我们求解: s.t.   这个优化问题的. 虽然这个优化问题只剩下了α这一个变量,但是别忘了α是一个向量,有m个αi等着我们去优化,所以还是很麻烦,所以大神提出了SMO算法来解决这个优化问题. 关于SMO最好的资料还是论文<Sequential Minimal Optimization A Fast Algorithm for Training Support Vector

使用TCP时序图解释BBR拥塞控制算法的几个细节

周六,由于要赶一个月底的Deadline,因此选择了在家VPN加班,大半夜就爬起来跑用例,抓数据...自然也就没有时间写文章和外出耍了...不过利用周日的午夜时间(不要问我为什么可以连续24小时不睡觉,因为我觉得吃饭睡觉是负担),我决定把工作上的事情先放下,还是要把每周至少一文补上,这已经成了习惯.由于上周实在太忙乱,所以自然根本没有更多的时间去思考一些"与工作无关且深入"的东西,我指的与工作无关并非意味着与IT,与互联网无关,只是意味着不是目前我在做的.比如在两年前,VPN,PKI这

细节彰显境界,境界成就未来

电视里直播着一场国际比赛.对手分别是中国乒乓球骁将刘国正和德国名将波尔.两强相遇,胜负难分,经过六局的艰苦打拼,仍然不分高低,这让观众的心都提到了嗓子眼儿.到了决定胜负的关键一局,刘国正以12∶13落后,如果再输一分就将被淘汰.观众心里都为他默默捏着一把汗. 在这关键时刻,刘国正的一个回球出界.波尔的教练见状后立即起身狂欢,并准备冲进场内拥抱自己的弟子. 戏剧性的一幕出现了,在这一瞬间,波尔立即举手示意,指向台边--这是一个擦边球,应该是刘国正得分! 教练很惊讶,观众也很惊讶,怎么可能呢?就这样

apache配置虚拟主机时需要注意到几个小细节

如今apache在web服务器这块市场占有率还是很高的,而配置虚拟主机现在也是用的非常多,不过在配置虚拟主机的时候一定要注意几个小细节. 首先要注意你的apache版本,注意是2.2还是2.4的. 配置2.2的时候,配置虚拟主机该这样写: NameVirtualHost ip:80   //注意此处与2.4不同 <VirtualHost ip:80> ServerName www1.myweb.com DocumentRoot "/myweb/vhost/www1" <

liunx中ctags 与makefile的使用

ctags 是vim下可以帮助阅读代码的一个的工具,它可以很方便的看到程序的源代码 使用ctags可以有两种方法:(1).可以在任意目录下建立文件,然后使用 ctags *.c,这个命令的意思是把当前目录下的所有文件生成标签文件(vim可以通过标签,跳转到标签文件处)例如: vim ctag.h vim ctag.c vim main.c 在main.c中把光标移至fun函数处,按Ctrl+[就会跳转到fun函数定义的地方,即ctag.c处,Ctrl+T回转到main.c函数 (2).输入cta

vim 中Ctags的安装和使用

『插件介绍』 Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号(tag/symbol),如变量名,函数名等.比如,tags文件就是Taglist和OmniCppComplete工作的基础. 『下载和安装』 一.我是使用apt-get安装的: sudo apt-get install ctags 二.下载源码安装(网上提供的方法) 1)从http://ctags.sourceforge.net/下载源代码包后,解压缩生成源代码目

Mongodb入门系列(4)——Mongodb体系结构与客户端基本操作及注意细节

说到Mongodb的体系结构,免不了与关系型数据库做个对比.这里以MySQL为例,我们进行一些比较: 从逻辑结构上对比: MySQL层次概念 MongoDB层次概念 数据库(database) 数据库(database) 表(table) 集合(collection) 记录(row) 文档(document) 在MongoDB中没有行.列.关系的概念,集合中的文档相当于一条记录,这体现了模式自由的特点. 从数据存储结构上对比: MySQL的每个数据库存放在一个与数据库同名的文件夹中,MySQL如