1. ctags工具简介及使用
ctags工具根据源码文件生成一个tag文件,在tag文件中可以搜索函数、变量、类成员、宏等符号,文本编辑器或其他工具可以根据tag文件很容易且快速的定位符号定义位置。它支持C、C++、Java、Python等多达41种语言,是代码搜索利器。Ubuntu安装exuberant-ctags的命令:
sudo apt install exuberant-ctags
a. 生成符号文件
进入源码根目录,执行"ctags -R *"。
b. tag符号搜索
2. cscope插件介绍及使用
cscope是一个代码浏览工具。通过它生成的符号数据库,可以搜索符号的声明、定义、函数调用关系、文件、字符串等。它囊括了ctags的功能,要比ctags强大很多。Ubuntu下安装cscope的命令:
sudo apt-get install cscope
a. 生成符号文件
进入源码根目录,执行"cscope -bqR"
b. 符号搜索
c. 在vimrc文件中配置cscope
if has(“cscope")
"设置cscope二进制可执行文件的绝对路径
set csprg=/usr/local/bin/cscope
"优先搜索cscope的符号文件
set csto=0
"使用:cstag命令代替:tag/ctrl - ]/vim -t等命令,如果vim加载了cscope的数据库
":cstag命令实际执行的是”cs find g”
set cst
"不打印cscope所产生的额外信息,也就是在加载cscope数据库时不打印冗余的log
set nocsverb
"加载当前路径的cscope数据库文件
if filereadable("cscope.out")
cs add cscope.out
"如果cscope.out不存在于当前路径,加载环境变量CSCOPE_DB指定路径的cscope符号数
"据库
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
"恢复csverb的初始值
set csverb
endif
d. 用quickfix显示cscope的搜索结果
‘cscopequickfix’选项用于控制是否把cscope的输出结果显示在quickfix窗口。’cscopequickfix’包含多个控制子选项,它们是a,c,d,e,f,g,i,s,t,分别对应cscope find的a,c,d,e,f,g,i,s,t等选项。所以可以把下面命令添加到vimrc文件中:
:set cscopequickfix=s-,c-,d-,i-,t-,e-,a-
每个选项后的’-’表示字cscope有新的输出结果时清除旧的搜索结果。’+’表示新的搜索结果追加到已有的搜索结果后面。’0’表示该子功能不使用quickfix。
e. 给cscope命令定义快捷键
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>
nmap <C->S :cs find t struct <C-R>=expand("<cword>")<CR> {<CR>
可以把这些映射放在vimrc文件。他们的用法是先将插入符移动到要查找的符号上,然后同时按住CTRL和键后松开,马上再按a,c,d,e,f,g,i,s,t序列中的一个字母实现相应的搜索功能。
3. Vim中的grep使用
Vim可以使用内部和外部的grep进行字符串搜索,内部为命令为:vimgrep,外部为:grep。在执行:vimgrep或:grep命令时,Vim会把查询结果默认输出到在quickfix窗口,可以很方便的浏览搜索结果。quickfix的用法请参考3.22节 quickfix。通过如下命令:grep实现对某个目录的递归搜索:
:grep[!] -r ‘pattern’ *
默认情况下,在grep执行完成后,Vim自动跳转到匹配的第一个条目,如果你不需要自动跳转,需要在grep后加一个’!’。
vimgrep的用法不同于:grep,格式如下:
:vimgrep /pattern/[g][j] **
所以vimgrep的样式放在两个斜杠之间,后面紧跟控制字符。’g’表示获取同一行的多个匹配字符串,否则只获取一个匹配。’j’表示默认不跳到第一个匹配的位置,否则自动跳转。两个**表示递归查找。
vimgrep和grep的区别主要在于,vimgrep在不同平台的兼容性更好,而外部grep在于速度上的优势,对两个命令的更详细的描述请查询:help grep。
经过实验,vimgrep速度太慢不建议使用。
4. taglist插件的使用
taglist插件是一款代码浏览插件,它主要的功能有:
- 列出buffer中的变量、宏、函数、类等符号
- 自动更新列表
- 选择符号时自动定位到符号定义的位置
- 支持当前符号高亮
- 支持多种语言
还有其他一下有用的但不常用的功能,详细信息请参考taglist的帮助文档。
使用taglist需要注意一下几个方面:
- 依赖于exuberant-ctags工具动态生成符号列表,GNU ctags不被支持。
- 依赖于Vim的filtype检测功能,可以在vimrc文件中添加”filetype on”命令。
- 如果Vim在初始化时使用-Z参数,则taglist不能工作。
- taglist使用system()函数实现对exuberant-ctags的调用,所以需要系统对system()函数的支持,有些linux发行版出于安全原因禁用了system()函数导致对taglist的不兼容。
它提供很多全局变量可以很方便的进行定制,下面是我的vimrc中对taglist的配置:
let Tlist_Ctags_Cmd ='/usr/bin/ctags'
let Tlist_Exit_OnlyWindow = 1
let Tlist_File_Fold_Auto_Close= 1
let Tlist_Inc_Winwidth = 0
Tlist_Ctags_Cmd配置该插件所依赖的ctags程序的路径。
Tlist_Exit_OnlyWindow配置为1,如果taglist是唯一的窗口则退出Vim。
Tlist_File_Fold_Auto_Close配置为1,在切换buffer的时候折叠之前的符号列表。
Tlist_Inc_Winwidth设置为0表示不增加Taglist窗口的默认宽度。
:TlistToggle/:Tlist命令控制taglist窗口的打开和关闭。
Taglist插件的链接https://www.vim.org/scripts/script.php?script_id=273。