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插件介绍里面再进一步详叙吧。
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工具介绍-----ctags
- vim工具介绍-----ctags
- DOS中长文件名称处理工具介绍
- 文件处理工具类
- 介绍几个C++开发人员常使用的小工具
- gsoap开发c/c++ Web Service的注意事项和工具的介绍
- eigen:C++矩阵处理工具
- Python open()文件处理使用介绍
- 介绍一个轻量级的C++开发工具——Relo
- C++代码文件名标准化处理工具
- C++矩阵处理工具——Eigen[zhuangzi Rachel zhang]
- c++文件打包工具实现
- 《C++第十七周实验报告1-1》---学生成绩处理:保存为二进制文件
- linux的vim工具简单应用介绍
- Linux 查看磁盘分区、文件系统、磁盘的使用情况相关的命令和工具介绍
- C++实现的ORM映射工具主要类介绍(一)
- 学生成绩处理:保存为二进制文件 ASCII 文件score.dat 中保存的是100 名学生的姓名和C++课、高 数和英语成绩。
- vim文本编辑工具—修改文件内容
- Linux 内核阅读工具vim+ctags+cscope+taglist
- linux上很方便的上传下载文件工具rz和sz使用介绍