VIM + CSCOPE

在Windows下有很多好用的IDE,比如Visual Studio(加上Visual Assist 简直好用到没朋友),或商业软件source insight,他们都使得看代码时,可以轻松的查找符号(变量,函数名,宏等)的定义与引用。

Linux下也有不少免费且强大的IDE,诸如Eclipse,Code::Blocks,他们都需要额外的安装,过程可能很繁琐。幸运的是,Linux上自带了CSCOPE,让我们轻松浏览代码,查找符号的定义与引用。

CSCOPE是可以独立运行的,而由于VIM是主流编辑器,将他们结合在一起更方便,以下讲述的方法是将CSCOPE作为VIM的插件运行。

 

Pathogen

由于要用到VIM插件,这里先推荐一个插件管理工具pathogen: https://github.com/tpope/vim-pathogen

 从GitHub下载来,只要放到~/.vim/里即可。这样pathogen.vim就存在于: ~/.vim/autoload/pathogen.vim

当有其它插件时,在~/.vim/bundle/下创建一个目录,并将插件放入该目录即能运行。

比如cscope的插件cscope_maps.vim,创建一个目录~/.vim/bundle/cscope_maps/并将cscope_maps.vim放入:~/.vim/bundle/cscope_maps/plugin/中:

~/.vim/bundle/cscope_maps/plugin/cscope_maps.vim

 

CSCOPE

查看一下本机是否已安装cscope工具,在RHEL上可看到:

# rpm -qa|grep"cscope"

cscope-15.8-7.el7.x86_64

 

先看看CSCOPE的单独使用:

cd 到某个目录,执行:

# Cscope -R


cscope即递归子目录中的文件,生成一个符号库文件cscope.out,并且还自动进入cscope的交互页面,如图显示了cscope的命令集:

VIM + CSCOPE_第1张图片

可输入要查找的符号定义或引用,用tab上下切换结果集和命令集。按 CTRL+d 退出该界面。

 

生成符号库相关命令有:

-R 递归所有子目录中的文件。

-q 生成倒排索引,使得符号查找更快,用这个命令后会多生成两个文件:cscope.in.out, cscope.po.out。

-b 生成符号库,但不自动进入交互界面。

-i 从文件列表中生成符号库 (重要)。

对于C代码工程,可用:cscope -Rqb 生成符号索引库。

 

从文件列表生成符号库:

CSCOPE默认只认 *.h, *.c 文件,那要是其它诸如C++或JAVA工程难道就不能用了?如果是这样,那它也不值得被这么广泛推荐了。幸好它提供了–i 选项,支持从文件列表生成符号库。我们先来生成一个文件列表。比如对C++工程,这个列表包含文件类型为 *.h, *.c, *.cpp, *.hpp:

# find . -name "*.c" -o -name "*.cpp" -o -name "*.hpp" -o -name "*.h" > cscope.files

注意:上述生成的文件路径是相对路径,建议将它们换成绝对路径,这样更通用。

 

然后用指定的文件列表生成符号库:

# cscope -q -b -i cscope.files

 

和VIM集成:

前面说过CSCOPE可以单独使用,它和VIM集成不外乎在VIM里用快捷键或命令完成符号的查找,即上述交互界面的功能。

 

步骤:

(1)      下载cscope插件:http://cscope.sourceforge.net/cscope_maps.vim

(2)      按pathogen的要求加入相应目录。最终路径为:~/.vim/bundle/cscope_maps/plugin/cscope_maps.vim

(3)      当用VIM打开某一代码文件时,那么,在VIM怎么知道符号库文件cscope.out在哪呢?查看cscope_maps.vim,可看到一段脚本:

" add any cscope database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add the database pointed to by environment variable
elseif $CSCOPE_DB  != ""
    cs add $CSCOPE_DB
endif

 

可见CSCOPE会自动加载文件所在目录下的符号库,如果没有,则尝试环境变量$CSCOPE_DB 所定义的符号库。我们可以选一种方法。

如果希望集中管理多个项目的符号库,可以设置环境变量$CSCOPE_DB ,为了使该变量永久有效,将其加入/etc/profile里:

export CSCOPE_DB="/cscope_symbols/project_1/cscope.out"


保存退出后重载一下配置:

# source /etc/profile

 

(4) 这时,打开VIM,查看已加载的符号库:

:cs show

 

用add还可添加其它库:

:cs add [symbol_path]

 

(5) 这时,可以用命令或快捷键完成符号查找了,比如命令查找my_variable:

:cs f s my_variable

 

其中: f 表示find;s表示符号,g表示查找定义,c查找函数调用者,更多请 :help cscope.

另外,改 :cs 为 :scs 则切分窗口显示将跳转到的查找。


快捷键:

打开~/.vim/bundle/cscope_maps/plugin/cscope_maps.vim,可看到它定义了一系列快捷键来实现上述的符号查找:

    nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR>          
    nmap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR>          
    nmap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR>                                                      
    nmap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR>                                                      
    nmap <C-\>e :cs find e <C-R>=expand("<cword>")<CR><CR>          
    nmap <C-\>f :cs find f <C-R>=expand("<cfile>")<CR><CR>          
    nmap <C-\>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
    nmap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR>


在VIM中,当光标停在某符号上,按:

CTRL+\, 然后按‘s’,即为对应的命令:cs f s [symbol]

CTRL+\, g, 即为 :cs f g [symbol]

CTRL+\, c, 即为 :cs f c [symbol]

...

将 ‘\’换成空格,则对应了:scs,比如:

CTRL+空格,s,即为 :scsf s [symbol]



Tips:

(1) 如果进入了VIM发现符号查找没有结果,检查一下符号库是否正确加载了 :cs show

(2) VIM启动时可能会警告:找到多个符号库:

line 45:E568: duplicate cscope database not added

想要屏蔽该警告,修改~/.vim/bundle/cscope_maps/plugin/cscope_maps.vim:

将:

set cscopeverbose

改为:

set nocscopeverbose


 

参考文献:

(1)    The Vim/Cscope tutorial: http://cscope.sourceforge.net/cscope_vim_tutorial.html

(2)    Cscope – A developer’s tool forbrowsing source code): http://mylinuxbook.com/cscope/

(3)    Avoiding duplicate cscope databaseerror within VIM:

https://blogs.oracle.com/natarajan/entry/avoiding_duplicate_cscope_database_error


你可能感兴趣的:(VIM + CSCOPE)