vim工具介绍-----ctags

    ctags是用来生成标记的程序,在vim中可以方便的用tags标记进行代码之间的跳转,更高级的是,利用ctags进行自动补全的功能,就跟VC的virtual assitant 一样,很酷吧。

     ctags可以方便的生成tags,进行函数和变量的跳转,见下例:
     1.ctags的简单应用
            a) 通过vim test.cpp 建立cpp文件
            b) 插入代码

#include 
  
  
using namespace std;

int g_tag;

void test_tags()
{
    printf("gtags is %d/n",g_tag);
}


int main()
{
    test_tags();
}
     c)建立tags文件,通过 ":!ctags -R .",可以对本目录下的文件进行tags索引
d)查看当前tags路径,通过":set tags" 可以看到当前的tags路径,如果没有当前目录,可以通过":set tags+=./tags"将刚生成的tags文件加到tags路径中。
e)在将光标移动到main函数中的test_tags上,按Ctrl+],可以跳转到test_tags的定义中,同样,在test_tags()函数中的g_tag上按Ctrl+],可以跳转到g_tag的定义。
    上面所述的虽然能体现出ctags的能力,但是,对于一些大的项目,仅仅使用ctags -R . 来生成tags文件,是远远不够的,比如ACE的项目里面,包含了很多的inl文件,这些都是定义的inline的函数,这些文件ctags -R . 是没有办法解析的,再比如说std库,甚至有些文件没有后缀,比如map,vecotr,而且由于其中namespace std使用宏来代替的,如果直接ctags ,没有办法对它们生成tags,这些都是很简单但是需要注意细节的问题。在下面的例子中都会讨论到。
    2.对ACE代码生成tags
ACE是一个很棒的c++网络库,我刚开始用vim的时候就用ctags -R . 简单对ACE库进行处理过,但是后来在使用的过程中,我发现有些函数居然跳转tags,后来发现有些函数它放在.inl文件中,而ctags,则自动忽略了对.inl文件的检测,我用了--langmap选项以后,这个问题就解决了。
ctags -R --langmap=c++:+.inl .
这个选项是说,除了普通的c++文件(如cpp等)以外,把inl文件也当作c++文件处理。
实际上我用的是:
ctags -R --kinds-c++=+p --fields=+iaS --extra=+q --langmap=c++:+.inl .
多余的这些选项是用来生成类成员函数tags,以及用于自动补全的(omnicppcomplete)
需要提一下的是,虽然ctags 可以通过-f 制定生成tags的位置,但是我觉得在代码当前目录生成tags比较方便,至于因此可能要设置多个tags路径,因为tags路径设置可以写在脚本中自动执行,所以也不是很麻烦的事情,这个是后话了。
    3.对std代码生成tags
std代码,以我的计算机为例,std代码在/usr/include/c++/4.1.2里面。
很多文件的namespace是这样定义的 namespace _GLIBCXX_STD
在VC7下面的好像是 STD_BEGIN吧,但是他们其实都代表 namespace std{ (注意这里的花括号),
因此在生成tags之前,最好把这些文件的宏都替换掉,步骤如下:
    a) 备份文件,cp -R /usr/include/c++/4.1.2 /usr/include/c++/4.1.2.bak

a) 进到 /usr/include/c++/4.1.2目录 cd /usr/include/c++/4.1.2
b) 运行vim
c) 读取所有文件
:args **
这里** 表示递归读取文件
d) 然后将namespace _GLIBCXX_STD替换成 namespace std{
:argdo %s/^namespace _GLIBCXX_STD$/namespace std{/g
对于VC7而言,可能还要处理STD_END,将它们替换成}
e) 通过ctags生成tags
:!ctags -R --kinds-c++=+p --fields=+iaS --extra=+q --language-force=c++ .
注意这个--languague-force,因为有些文件没有后缀,而且我看std目录里面也挺干净的,就直接当成c++文件都处理了。这里可以show一下效果
omnicppcomplete_sdt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值