ctags的使用
在windows上进行软件开发,有很多的IDE可供选择,像是source insight、vs等,非常方便好用。习惯于windows上的软件开发,当转到linux上后,没有与windows环境类似、好用的IDE可用非常不便。其实在linux上,很多人使用vim加上一些插件进行软件开发,比如:vim+ctags、vim+cscope或vim+ctags+cscope。本文主要记录下ctags的使用方法和常用命令。
使用ctags插件,可以很方便的进行函数、变量、宏的查看与跳转。ctags主要功能是,扫描指定的源文件,找出其中所包含的语法元素,并将找到的相关内容存储在tags文件中,用于在vim中查找。
ctags的安装:
sudo apt-get install ctags(ubuntu)
sudo yum -y install ctags(centos)
生成tags文件:
安装成功后,需要为源文件生成tags文件,使用命令:
$ ctags -R #递归的为当前目录及子目录下的所有代码文件生成tags文件 (推荐使用此命令)
$ ctags filename.c filename1.c file.h #为当前目录某些源码生成tags文件
$ ctags *.c *.h #为当前目录所有.c, .h源码生成tags文件
为了使得字段补全有效,在生成tags时需要一些额外的参数,推荐的c++参数主要是:ctags -R --c++-kinds=+px --fields=+iaS --extra=+q
其中:
选项c++-kinds 用于指定C++语言的 tags记录类型, --c-kinds用于指定c语言的, 通用格式是 --{language}-kinds
选项 fileds 用于指定每条标记的扩展字段域
extra 选项用于增加额外的条目: f表示为每个文件增加一个条目, q为每个类增加一个条目
注意:如果新定义或修改了函数、宏、变量,需要使用以上命令更新ctag以后才能查找到
配置:
第一种方法,直接指定tags路径:
用vim打开某个工程文件,在命令行模式设置tags源,即: set tags=/home/d/code/tags
或者
在~/.vimrc配置文件中添加一行:set tags=/home/d/code/tags
直接指定了tags文件的路径,vim直接从这个路径的tags文件查找函数或变量。不建议使用。
第二种方法,通用配置:
在~/.vimrc文件中添加下面两行:
set tags=tags;
set autochdir
这两个命令的作用:vim首先在当前目录里寻找tags文件,如果没有找到tags文件,或者没有找到对应的目标,就到父目录中查找,一直向上递归。因为tags文件中记录的路径总是相对于tags文件所在的路径,所以要使用第二个设置项来改变vim的当前目录。需要注意的是,第一个命令里的分号是必不可少的。
建议使用第二种方法,可以避免一些路径冲突或不存在导致的问题。使用第二种方法,只在代码工作目录生成一个tags文件就可以了。如果逐层多个目录生成了tags文件,使用Ctrl + ]查找时会显示多个相同项目。
常用命令:
Ctrl + ] // 跳转到光标所在变量、宏、函数的定义处
Ctrl + T // 返回到跳转前的位置
Ctrl + W + ] // 分割当前窗口,并在新窗口中显示跳转到的定义
Ctrl + O // 返回之前的位置
:ts // 列出所有匹配的标签
使用中可能遇到的问题:
1. ctags已经安装并且tags文件也已经生成,通过 ctrl + ] 查找某个函数、宏、结构体的定义的时候,报错:“E257: cstag: tag not found”,为什么?
可能原因有三个:
(1)查找的函数、宏、结构体可能是新定义的或者有修改,tags文件还没有相应的的数据,如果确定是这种情况,需要重新执行ctags -R命令,更新tags数据,就可以找到了。
(2)如果没有在~/.vimrc配置文件(或其他类似的配置文件)中添加 set tags=tags;set autochdir 这两个配置,只能从tags所在目录指定路径直接打开代码文件才管用。举个栗子:代码目录为: ~/code,某个代码文件的路径是:a/b/c.c,并且在目录~/code下执行ctags -R命令生成tags文件。这种情况下,在~/code目录使用命令:vim a/b/c.c打开文件,是可以使用Ctrl + ]找到函数定义的,但是,如果先进入目录~/code/a/b,再打开文件vim c.c,这样就会找不到tag。使用上文第二种配置方法,当前目录找不到tags时候会递归向上一级目录查找,可以避免这个问题。
(3)还有一种可能是tags配置路径不对应导致,如果指定了固定的tags路径,需要确保路径存在并且此路径下存在tags文件
检查每个vim相关的配置文件(比如/etc/vim/vimrc和~/.vimrc等)中的set tags配置项,确保路径不冲突
比如:~/.vimrc下有这样的配置:set tags=/data/nginx/tags,而自己的tags文件在 ~/code目录下,路径不一致,找不到就会报错:“E257: cstag: tag not found”,
还有比如,存在两个配置:set tags=/home/test1/tags set tags=/home/test2/tags,而/home/test2没有tags,也会报错。
总之,如果set tags配置了固定的路径,一定要与tags文件路径保持一致。如果每个人都是在不同主机开发或者是同一主机但不同用户下开发,不会有这种情况出现,但如果是多人共用一个开发环境使用同一用户,只是代码所在路径不同就可能发生,亲身经历过的。
2. 使用Ctrl + ]查找某个标签时,第一次查找时列出了所有匹配项选择一个后,但在第二次查找时却直接跳转到之前选择过的项而不是列出所有的匹配项,或者使用Ctrl + ]查找标签时总是直接跳转到第一个匹配的标签,但这可能并不是你想要的,这时候使用:ts命令就可以列出所有匹配项供自己选择,或者在配置文件中添加如下配置:map <c-]> g<c-]>。