在Vim中使用ctags
2016-05-11 13:31
225 查看
如何在Vim中使用ctags?之前在《把Vim打造成真正的IDE》系列里已经讲过大致的ctags在vim中的使用,这篇文章我们就详细的讲一下。
首先要明白,ctags是什么?
官方的解释是:
产生标记文件以帮助在源文件中定位对象。
其生成的标记文件tags中包括这些对象的列表:
用#define定义的宏
枚举型变量的值
函数的定义、原型和声明
名字空间(namespace)
类型定义(typedefs)
变量(包括定义和声明)
类(class)、结构(struct)、枚举类型(enum)和联合(union)
类、结构和联合中成员变量或函数
那么我们用怎样的参数来使ctags正常的生成我们需要的tags文件呢?在这里我们就不去挨个学习那些枯燥的参数了,直接参看 omnicppcomplete 提供的ctags生成语句:
ctags -R –c++-kinds=+px –fields=+iaS –extra=+q .
每个参数解释如下:
-R:ctags循环生成子目录的tags
–c++-kinds=+px :ctags记录c++文件中的函数声明和各种外部和前向声明
–fields=+iaS :ctags要求描述的信息,其中i表示如果有继承,则标识出父类;a表示如果元素是类成员的话,要标明其调用权限(即是public还是private);S表示如果是函数,则标识函数的signature。
–extra=+q:强制要求ctags做如下操作—如果某个语法元素是类的一个成员,ctags默认会给其记录一行,可以要求ctags对同一个语法元素再记一行,这样可以保证在VIM中多个同名函数可以通过路径不同来区分。
OK,那么tags文件就生成好啦,利用这个文件我们可以做很多强大的事情,包括前面用过的插件,omnicppcomplete、taglist、showfunc之类的,都是依赖于它的。
那么除了插件上的作用外,我们用户在vim里面怎么使用他呢?
其实最简单的就是:
把光标移动到某个元素上,CTRL+],就会跳转到对应的定义啦。CTRL+o可以回退到原来的地方。
还有一个操作经常被人忽略,就是,如果当前光标下是个局部变量,在VIM里输入gd的话,就会跳到这个局部变量的定义处,也是非常方便滴~~
另外,tags必须在vim运行的当前目录,才能在vim里面正确跳转,当然也不是没有办法解决:
set tags+=tags的文件路径
不过如果像我前面文章说的那样定义了F12来快速生成tags的话( 快速连接 ),也不会经常用到更改路径吧,哈哈。
顺便说一句,tags生成路径最好不要包含中文哦~~
OK,在Vim中使用ctags就到这里,下次我们会一起看看据说ctags的升级替代品,cscope~
另附 ctags官方下载地址 ,目前最新版本为5.8
后记:
在用-R直接生成的tags的时候,如果无关的文件太多,tags生成的会非常而且慢,比如cocos2d-x的项目。
解决的方法比较简单,参考了cscope生成 cscope.files的思路:
这样生成的速度就会快很多啦
首先要明白,ctags是什么?
官方的解释是:
产生标记文件以帮助在源文件中定位对象。
其生成的标记文件tags中包括这些对象的列表:
用#define定义的宏
枚举型变量的值
函数的定义、原型和声明
名字空间(namespace)
类型定义(typedefs)
变量(包括定义和声明)
类(class)、结构(struct)、枚举类型(enum)和联合(union)
类、结构和联合中成员变量或函数
那么我们用怎样的参数来使ctags正常的生成我们需要的tags文件呢?在这里我们就不去挨个学习那些枯燥的参数了,直接参看 omnicppcomplete 提供的ctags生成语句:
ctags -R –c++-kinds=+px –fields=+iaS –extra=+q .
每个参数解释如下:
-R:ctags循环生成子目录的tags
–c++-kinds=+px :ctags记录c++文件中的函数声明和各种外部和前向声明
–fields=+iaS :ctags要求描述的信息,其中i表示如果有继承,则标识出父类;a表示如果元素是类成员的话,要标明其调用权限(即是public还是private);S表示如果是函数,则标识函数的signature。
–extra=+q:强制要求ctags做如下操作—如果某个语法元素是类的一个成员,ctags默认会给其记录一行,可以要求ctags对同一个语法元素再记一行,这样可以保证在VIM中多个同名函数可以通过路径不同来区分。
OK,那么tags文件就生成好啦,利用这个文件我们可以做很多强大的事情,包括前面用过的插件,omnicppcomplete、taglist、showfunc之类的,都是依赖于它的。
那么除了插件上的作用外,我们用户在vim里面怎么使用他呢?
其实最简单的就是:
把光标移动到某个元素上,CTRL+],就会跳转到对应的定义啦。CTRL+o可以回退到原来的地方。
还有一个操作经常被人忽略,就是,如果当前光标下是个局部变量,在VIM里输入gd的话,就会跳到这个局部变量的定义处,也是非常方便滴~~
另外,tags必须在vim运行的当前目录,才能在vim里面正确跳转,当然也不是没有办法解决:
set tags+=tags的文件路径
不过如果像我前面文章说的那样定义了F12来快速生成tags的话( 快速连接 ),也不会经常用到更改路径吧,哈哈。
顺便说一句,tags生成路径最好不要包含中文哦~~
OK,在Vim中使用ctags就到这里,下次我们会一起看看据说ctags的升级替代品,cscope~
另附 ctags官方下载地址 ,目前最新版本为5.8
后记:
在用-R直接生成的tags的时候,如果无关的文件太多,tags生成的会非常而且慢,比如cocos2d-x的项目。
解决的方法比较简单,参考了cscope生成 cscope.files的思路:
find . -name "*.h" -o -name "*.c" -o -name "*.cpp" -o -name "*.m" -o -name "*.mm" -o -name "*.java" -o -name "*.py" > src.files ctags -R --c++-kinds=+px --fields=+iaS --extra=+q -L src.files
这样生成的速度就会快很多啦
相关文章推荐
- c++序列化库cereal使用介绍
- js防止表单重复提交
- Xml序列化自引用/循环引用问题1
- SQL truncate 、delete与drop区别
- perl内置警告信息
- CDISC SDTM EC/EX domain 学习笔记 - 4
- markdown
- Android开发如何保证Service不被杀掉
- linux修改默认时区
- 栈的应用--简单四则运算
- 依然是谋财害命之星热身赛1002密码题
- 【转】Android Fragment中使用SurfaceView切换时闪一下黑屏的解决办法
- 上传文件获取Stream的方法
- IIS7.5站点配置
- android studio 使用github完整保存
- hdu 4009 Transfer water(最小树形图模板)
- python全栈开发day1
- FileZilla 服务器端win server2008以上的配置
- noi2010超级钢琴
- iOS中富文本NSMutableAttributedString的用法