您的位置:首页 > 编程语言 > C语言/C++

vim工具介绍-----用ctags处理c++文件

2008-06-10 23:54 661 查看
    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路径,如果没有当前目录,可以通过" :settags+=./tags "将刚生成的tags文件加到tags路径中。
           e)在将光标移动到main函数中的test_tags上,按Ctrl+],可以跳转到test_tags的定义中,同样,在test_tags()函数中的g_tag上按Ctrl+],可以跳转到g_tag的定义。
    上面所述的虽然能体现出ctags的能力,但是,对于一些大的项目,仅仅使用来生成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一下效果



 

    4 对VC进行tags处理,其实vc7也能用到tags,但是因为VC7比较庞大,所有需要用ctags处理的地方很多,比如%VCINSTALLDIR%/include;%VCINSTALLDIR%/altmfc等等,这些在vc7的选项中的环境选项卡里面应该可以找到
对它们一一进行ctags处理,然后通过脚本将这些tags自动保存到tags路径中,就可以解决在vc下利用vim的问题了。如果是vc6的工程,更可以很方便的把vc文件导出成.mak文件,这样就能直接在vim中make了,呵呵,不过不能调试。
    至于将tags自动添加,可以通过autocm事件,也能通过Project插件的一些小技巧,就我而言,我把这个脚本的处理放在ftplugin里面,这个在omnicppcomplete插件介绍里面再进一步详叙吧。
    

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vim c++ 工具 tags 脚本 c