博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[转载] vim+ctags+taglist+cscope+cppcomplete+global

Posted on 2011-12-13 13:49  舒方小院  阅读(457)  评论(0编辑  收藏  举报
转贴一篇关于vim扩展的文章(ctags, taglist,cppcomlete~~)

Entry vim+ctags+taglist+cscope+cppcomplete+global
     
(此文首先发表于LinuxSir.Org,在此仅做收录。
  http://www.linuxsir.org/bbs/showthread.php?t=241578


由于本人比较喜欢在终端状态下的vim,所以gvim下的扩展使用的不多。这里介绍的也是我简单的使用以上扩展的一点点体会。请大家指正。 emacs 不会用,也没有比较过拉。 biggrin.gif



1、大体感觉,(因为使用时间不长,不全面)
总体使用的感觉定位查找类型定义基本可以用,但自动补全类型方面由于ctags的功能有限,感觉在大工程时,不一定很好用。

大型程序一定要global的参与,它的分析比较全面,但在vim中的提示信息有限。

taglist 精干,需要ctags的支撑 ,直接可以在左边列出函数列表,全局参数列表。(可以排序)

cscope 比较强大,可以对函数以及部分类型定义进行跳转,但有些BUG,好像在某些条件下无法正确找到分析枚举的定义。

cppcomplete 需要ctags的支撑,可以补全类型或者函数名(可不是普通Ctrl+P/N的那种)

global新版本可以嵌入vim使用,提供比较完整解析和类型索引,和cscope比,稍微差些的就是对类型引用的打印列表中没有标识这个引用在什么函数中进行的。其实我的感觉global可能不是为vim所生,它的主要目的是用html的方式进行表达相关的关联关系和索引,使用起来感觉没有cscope的那么贴切。



2、相关的扩展的安装
代码
apt-get install  exuberant-ctags  cscope global

cppcomplete 和 taglist 要到www.vim.org的扩展列表中下载。

taglist 的下载地址:
http://www.vim.org/scripts/script.php?script_id=273
cppcomplete 的下载地址:
http://www.vim.org/scripts/script.php?script_id=527

然后在 建立目录
代码
$HOME/.vim/plugin


将下载的cppcomplete.vim 和 taglist.vim拷贝到$HOME/.vim/plugin中。
安装了global后,最新4.8.6 以上版本有带vim的扩展,将它也拷贝到 $HOME/.vim/plugin

debian sid 版本global安装后扩展文件在
代码
/usr/share/doc/global/examples/gtags.vim.gz

需要拷贝到$HOME/.vim/plugin后解压,解压方法:
代码
gzip -d  gtags.vim.gz



3、使用这些工具
1)准备工作,先修改一下$HOME/.vimrc文件

为了更好的使用cscope请添加如下内容,这样Ctrl-]的跳转将由cscope的tags进行分析。
代码

if has("cscope")
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
set cscopetag
set cscopequickfix=s-,g-,c-,d-,t-,e-,f-,i-
endif


2)使用cscope
cscope的tag生成最简单的方法是:
c中:cscope -Rbq
在你的开发工程的最上层目录执行cscope-indexer,它会遍历下面的所有目录,生成两个文件,一个是cscope.files,这个文件记录需要生成tags的文件名,可以手工修改,另一个是cscope格式的tags文件cscope.out。

c++中使用cscope
-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-k: 在生成索引文件时,不搜索/usr/include目录
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度

#!/bin/sh
find . -name "*.h" -o -name "*.c" -o -name "*.cc" -name "*.cpp" > cscope.files
cscope -bkq -i cscope.files
ctags -R

完成后,你在生成了cscope.out的目录打开工程的任意文件,就可以使用Ctrl-]跳转查找类型定义了。
代码
进入vim后第一件事是要把刚才生成的cscope文件导入到vim中来, 用下面的命令:
        :cs add /home/wooin/vim71/cscope.out /home/wooin/vim71 
        上面这条命令很重要, 必须写全, 不能只写前半句:
        :cs add /home/wooin/vim71/cscope.out

cs f s xxxx  查找xxxx出现的地方,它能详细列出哪些文件的哪行的哪个函数引用,以及该行的内容,比较不错

cscope find的用法:
    cs find c|d|e|f|g|i|s|t name
    0 或 s 查找本 C 符号(可以跳过注释) 
    1 或 g 查找本定义 
    2 或 d 查找本函数调用的函数 
    3 或 c 查找调用本函数的函数 
    4 或 t 查找本字符串 
    6 或 e 查找本 egrep 模式 
    7 或 f 查找本文件 
    8 或 i 查找包含本文件的文件 
cscope find得快捷方式:
添加到~/.vimrc中, 并重启vim:
nmap <C-c><C-k> :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-c><C-g> :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-c><C-l> :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-c><C-t> :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-c><C-e> :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-c><C-f> :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-c><C-i> :cs find i ^<C-R>=expand("<cfile>")<CR><CR>
nmap <C-c><C-d> :cs find d <C-R>=expand("<cword>")<CR><CR>


它的所有命令的使用请参考:
代码

help cscope


3)使用taglist
taglist的功能是即时生成当前文件的函数列表和全局变量列表,便于索引。
在vim中命令模式下使用
Tlist 打开或者关闭当前文件的索引;
TlistSync 立即在打开的索引窗口中定位当前的光标所在位置属于哪个函数或者结构定义中。
还有其他命令,请参考它的帮助文件。

4)ctags的使用
其实cscope是用来替代ctags功能的,ctags的应用广泛,还有其他很多的软件依赖它。

例如要生成cppcomplete需要的tags文件的话,需要运行下面的命令:
代码

ctags -n -f cppcomplete.tags --fields=+ai --C++-types=+p * -L cscope.files

注意,我在最后使用了参数"-L cscope.files" 这仅仅是借用拉cscope生成的文件索引来帮助ctags去查询相关工程文件生成tags。

5)使用cppcomplete
cppcomplete的使用我只是简单的发现它可以根据上述方法生成的tags文件来自动补全类型成员。
使用很简单,就是在你需要补全类型成员时,按F8键就可以拉。它一般第一次使用时,需要让你确认是使用已有的tags文件还是再生成一次。一般我们自己控制生成tags文件的时机,它就使用就行拉。
但它也受到ctags的分析能力比较差的限制,可能不是每次都能帮到你。

6)使用global
在工程的最上层目录执行命令:
gtags
等待它完成所有需要的global自己格式的tags的生成
生成完后,需要的就是在生成tags的目录打开你的工程的任意文件,用如下命令查询相关类型引用和关联关系:
代码

Gtags xxxx      查找xxxx的定义
Gtags -r xxxx   查找xxxx的引用
Gtags -s xxxx   查找xxxx出现的地方


它的提示信息很有显,不如cscope更直观,但对大型分析的比较完整。
有时它无法正常分析的类型 可以试试用带-s 的参数的方式找找类型定义。再不行,我就不清楚拉 smile.gif


indent -kr -nut -ts2 -i3 -l-1 *.c
valgrind --leak-check=full --leak-resolution=high --show-reachable=yes

在你的开发工程的最上层目录执行cscope-indexer
ctags -n -f cppcomplete.tags --fields=+ai --C++-types=+p * -L cscope.files

:!ctags -R
Tlist 打开或者关闭当前文件的索引;
TlistSync 立即在打开的索引窗口中定位当前的光标所在位置属于哪个函数或者结构定义中。
u             更新taglist窗口中的tag
s             更改排序方式,在按名字排序和按出现顺序排序间切换
[[            跳到前一个文件
]]            跳到后一个文件

将光标停放在函数或者变量的位置,gd会高亮出当前文件中所有的函数或者变量,按n查看下一个
 gg光标返回到文件的顶部 

ctrl + p  : 自动匹配 补齐
ctrl +] :跳转   ctrl + T : 返回跳转
把光标移到"stdio.h"的任一字符上,键入"gf",则Vim会自动打开/usr/include/stdio.h文件。使用"Ctrl-O"  可返回到原先的文件中。

"cscope find"的用法:
cs find c|d|e|f|g|i|s|t name
0 或 s     查找本 C 符号(可以跳过注释)
1 或 g     查找本定义
2 或 d     查找本函数调用的函数
3 或 c     查找调用本函数的函数
4 或 t     查找本字符串
6 或 e     查找本 egrep 模式
7 或 f     查找本文件
8 或 i     查找包含本文件的文件
:cw  在窗口中显示

vim :
复制5行: y5y , p
光标在单词间移动 w  b
行移动: 0(行首) $(行尾)
分割窗口:   :split   切换 ctrl + w
向下滚屏:  ctrl +D ctrl +u    
替换 : %s/four/4/g
删除多行 n dd

参考:http://blog.csdn.net/easwy/archive/2007/04/03/1550585.aspx