使用 VIM+Ctags+Cscope

本文介绍如何通过ctags和cscope提升Vim编辑器的代码导航效率,涵盖配置方法、插件使用及实用命令等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. ctags+cscope配合使用的原因:
    为什么要配合,因为,比如cscope能提供更多的查找功能等功能。但是ctags远比cscope支持更多的文件。比如要访问一个java工程文件,那么cscope是能力低下的,比如对类识别不行,但是我们仍然可以利用其一些功能,比如找到什么函数调用了这个函数。
    另外,还有点注意,ctags不能利用QuickFix窗口,而cscope可以利用,这也是cscope的好处。一般,如果仅仅有C/C++文件,用cscope更多,如果是其他文件,则用ctags更多。
    不管是用ctags还是cscope,都可以用WinManager和Taglist,来实现左边上面是文件列表,下面是Taglist,右边是文件浏览窗口的效果!但是Taglist依赖ctags,如果用cscope,ctags还是要用的。具体的让WinManager和Taglist配合的方法,见vim配置文件。

2. 生成数据库并让vim使用:
一般的做法是:在最上层目录,生成这些文件。然后vim在最上层打开,并利用下面提到的WinManager来导航到里面目录。
(1) ctags生成tags文件:
ctags -R . 可以搜索目录下所有的文件,并生成 tags 文件。
为了生成最多的tags:
C/C++这样:ctags --extra=+q --fields=+Saim --c++-kinds=+lpx --c-kinds=+lpx -R .
Java这样:ctags --java-kinds=+l -R .

(主要是--xx-kinds控制着要分析出哪些东西,如--java-kinds=+l表示要加上(+)local variable,默认的有哪些,没有哪些,用ctags --list-kinds 可以知道,off的都是默认不分析的,否则是分析的)
cscope只能分析C/C++/lex/yacc文件!

然后在vim里 :set tags=path/to/tags(用,分隔,可以多个)

(2) cscope生成cscope.in.out cscope.out cscope.po.out文件:
由于cscope默认不看非.c .yacc .lex外的文件,所以,假设你要找C和C++其他文件,要这样:
find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
(找java文件同理)
而,对于纯C文件,你可以:
cscope -Rbkq ./ 即可。

然后在vim里 :cs add path/to/cscope.out
如果要重新生成,用:!cscope -Rbkq,再用 :cs reset重新读入.

3. ctags 管理跳转栈:
ctags设计来找到各种希望找的东西,如类定义处,函数定义处。对各种语言都有支持,但原设计就是针对function定义的,所以,ctags对寻找functions定义特别有效,像函数原型是默认不做tag的。
(1) vim的支持tags的命令:(这些命令在编译时要加进ctags支持才能用)
vim靠内置的命令,来支持使用ctags得到的tags文件。
:tags 列出目前你跳转的栈,可以得知当前位置 (可惜不能用QuickFix窗口)
:tag 跳到:tags列表的顶部(栈底)
:tag tagname 跳到tagname的定义处
Ctrl+] 压栈(跳到标记定义处) Ctrl+W ] 在横着的新窗口打开(:stag tagname)
n Ctrl+t 出栈(后跳n次,会使你的:tags列出的表缩短) ── 跨文件时,用 Ctrl + o才能跳回去。

:tselect tagname 可以列出所有的相同的tagname,你按数字可以跳到对应条目。
:tnext 跳到下一个相同tagname处
:tprevious 同理
:tfirst    同理
:tlast     同理

匹配用/ /来括起来,让vim知道里面的是正则式
如 :tselect /^write_ 可以匹配以 write 开头的

:set ignorecase 可以在任何时候忽略大小写,比如在:tag tagname时。如果设置了这个,又想case有效,则在表达式后加\C
但如果想某次有效,则在表达式后面加\c
上面的表达式都用//包起来。


4. cscope看vim配置文件和以前的文档即可。

5. 使用Path:
有时,我们要定义额外的Path,以访问某些文件。且方便gf(goto file,在normal模式下,按gf,会打开光标下的文件,它会在Path下去搜),find(不支持正则式的搜索,用法 :find netrw.vim)等命令。

path选项定义了一个目录列表,在使用gf,find,以及CTRL-W f等命令时,如果使用的是相对路径,那么就会在path选项定义的目录列表中查找相应的文件。path选项以逗号分隔各目录名。我们依旧以VIM 7.0的源代码为例(源代码放在~/src/vim70/目录中)。

对于这个项目,我们的path选项设置如下:
set path=.,/usr/include,,~/src/vim70/**

稍微解释一下各项的含义,更详细的信息,请查看path选项的帮助页:
.                在当前文件所在目录中搜索 
/usr/include     在/usr/include目录中搜索 
,,               在当前工作路径中搜索 
~/src/vim70/**   在~/src/vim70的所有子目录树中进行搜索!!

6. 多文件浏览采用 MiniBufExplorer:
因为使用了WinManager和Taglist,所以tabe显得不好用了,用buffer会更方便。
但是vim自带的buffer管理工具只有:ls, :bnext, :bdelete 等的命令,这里用MiniBufExplorer.好处是在顶上可视化列出了各个buffer。仍然用:bnext等命令。
然后,在vim中设置了,用shift+Tab来切换buffer,挺方便。
关闭一个buffer,而不退出窗口,在标签上按d,这是MiniBufExplorer的命令。个

7. Taglist
提醒用 s 来切换按名字排序(大写,再小写,每个里面按首字母)还是出现次序排序
用 u 来更新list(默认可以再次调用ctags)
另外,在vimrc中设置了单击来打开对应位置

8. WinManager
s来切换按xx排序,r做反排序
另外,在各个窗口间切换,用 Ctrl+方向键 更快~~~

9. vimgrep查找文本 或 Grep插件查找文本:
ctags找到了--list-kinds中指示的东西,你可以用:tag tagname找出这些tags,cscope也找了它可以找的东西,可以用:cs find g/d/c/t/e tagname找到相应的东西,其中t表示找那个文本,尤其是e表示用egrep查找。单都是在cscope的数据库中查找。
但是,很多时候,仍需要对文件本身搜索,或者想到某个特定子目录搜索,并支持正则式。
(1) 可以用 :vimgrep命令:
:vimgrep是vim内置的grep,如果你用:grep等,则是让vim调用外部的系统的grep。用:vimgrep的好处是,不依赖于系统的,使得各个系统上都可以用。但是会慢点,因为它会把每个文件,放入buffer,再分析。
用法简单:
:vimgrep /pattern/ path
其中 pattern为正则式,如 \<main\>表示main单词
path 为shell元字符式,如 ./SSF/**/*.java 表示搜索SSF目录下,所有子目录,及所有嵌套子目录的 java文件。
(2) 也可以用Grep插件,下面命令都支持正则式:
:Grep 在指定的文件查找
:Rgrep 递归查找
:Bgrep 在打开的缓冲区中查找
他会问你更多信息,比如哪些文件中查找,在哪个目录中查找,很方便。
如:
Search for pattern: 时可以填 \<get_real_path\> (匹配单词,而不是字符串)
Search in files: 时可以填 *.java

10. 高亮文本:
:colorscheme 可以选择某个主题。
在.vim里,自己创建colors doc plugin syntax 四个目录,doc和plugin用户放plugin的文件和doc文件,syntax用于放置指导语法加亮的文件,而colors就用于放置高亮主题。目前我用的是desert主题。

11. 目前用到的插件:
a.vim              
color_sample_pack.vim 
minibufexpl.vim     
taglist.vim          
winmanager.vim (winfileexplorer.vim wintagexplorer.vim)
code_complete.vim   #这个好好看看它的代码体吧,很简单,却很高效的用tab补全很多东西,如调用函数时,在(后按tab,就可补出各个参数的类型。比如很方便自动生成main,for,while,#define等。
grep.vim               
NERD_commenter.vim 


12. 颜色相关:
首先,在vim中输入 :runtime syntax/colortest.vim 可打印出目前你可以使用的颜色。只有那么几种。包括粗体。所以,这就是终端里使用vim没有gvim颜色多,或者没有gvim颜色正常的原因。但是,你好好调整一下,还是能够满足自己要求的。
另外,各种颜色主题,是不能让,如函数,单独高亮的,因为这需要语法帮助。这需要你单独找语法文件,就是什么东西是函数,并应该高亮为什么颜色。把语法文件放到 ~/.vim/syntax中。
我是从官网下了cpp.vim放到~/.vim/syntax目录中,于是.cpp文件可以有更多的高亮了。
但是,c.vim是我从别的地方找的,官网上找的c.vim不起作用,我又不好改。目前用的c.vim如下,主要加亮了函数名和C关键字。而cpp.vim是使用c.vim的,所以默认也就让cpp.vim支持同样的效果了。

要读懂和改这个简单文件,需要知识如下:
:hi 命令时一直都是以图形介面(gui)为例设置前景和背景色。由于命令终端对颜色显示的限制,Vim在命令行下可以使用的颜色相对gui 要少得多,所以使用:hi命令时图形介面和命令行介面的颜色是分开设置的。对于黑白终端来说就无所谓颜色了,而彩色终端用cterm来表示,前景色就是 “ctermfg”,而背景色是“ctermbg”。下面是一个表格:

终端类型 前景色      背景色      注释
term           -              -              黑白终端
cterm     ctermfg    ctermgb       彩色终端
gui          guifg        guibg          图形介面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值