现在的位置: 首页 > 工具配置 > 正文

将Vim改造为强大的IDE(2)—Vim集成Ctags/Taglist/Cscope

2013年11月16日 工具配置 ⁄ 共 6312字 ⁄ 字号 将Vim改造为强大的IDE(2)—Vim集成Ctags/Taglist/Cscope已关闭评论 ⁄ 阅读 1,935 次

接上篇 将Vim改造为强大的IDE(1)

9、buffer管理器MiniBufferExplorer
MiniBufferExplorer用于浏览和管理buffer,如果只打开一个文件,是不会显示在屏幕上的,而打开多个文件之后,会自动出现在屏幕上。vim也有自带的buffer管理工具,不过只有:ls, :bnext, :bdelete 等的命令, 既不好用, 又不直观.
关于vim缓冲区(buffer)和窗口的概念(详见:help windows)
"缓冲区" 是一块内存区域,里面存储着正在编辑的文件。如果没有把缓冲区里的文件存盘,那么原始文件不会被更改。
"窗口" 被用来查看缓冲区里的内容。你可以用多个窗口观察同一个缓冲区,也可以用多个窗口观察不同的缓冲区。
"屏幕" Vim 所用的整个工作区域,可以是一个终端模拟窗口,也被叫做 "Vim 窗口"。一个屏幕包含一个或多个窗口,被状态行和屏幕底部的命令行分割。
+-------------------------------+
屏幕 | 窗口 1 | 窗口 2 |
| | |
| | |
|=== 状态行 ===|==== 状态行 ===|
| 窗口 3 |
| |
| |
|========== 状态行 =============|
|命令行 |
+-------------------------------+
安装MiniBufferExplorer
lingd@ubuntu:~$ vim-addons install minibufexplorer
配置MiniBufferExplorer
在vim配置文件/home/user/.vimrc中加入如下的配置:

" -- MiniBufferExplorer --
let g:miniBufExplMapWindowNavVim = 1 " 按下Ctrl+h/j/k/l,可以切换到当前窗口的上下左右窗口
let g:miniBufExplMapWindowNavArrows = 1 " 按下Ctrl+箭头,可以切换到当前窗口的上下左右窗口
let g:miniBufExplMapCTabSwitchBufs = 1 " 启用以下两个功能:Ctrl+tab移到下一个buffer并在当前窗口打开;Ctrl+Shift+tab移到上一个buffer并在当前窗口打开;ubuntu好像不支持
"let g:miniBufExplMapCTabSwitchWindows = 1 " 启用以下两个功能:Ctrl+tab移到下一个窗口;Ctrl+Shift+tab移到上一个窗口;ubuntu好像不支持
let g:miniBufExplModSelTarget = 1 " 不要在不可编辑内容的窗口(如TagList窗口)中打开选中的buffer

常用命令
<Tab> 移到上一个buffer
<Shift-Tab> 移到下一个buffer
<Enter> 打开光标所在的buffer
d 删除光标所在的buffer

vim配置6

vim配置6

10、代码折叠fold
折叠用于把缓冲区内某一范围内的文本行显示为屏幕上的一行。就像一张纸,要它缩短
些,可以把它折叠起来:
+------------------------+
| 行 1 |
| 行 2 |
| 行 3 |
|_______________________ |
\ \
\________________________\
/ 被折叠的行 /
/________________________/
| 行 12 |
| 行 13 |
| 行 14 |
+------------------------+
那些文本仍然在缓冲区内而没有改变。受到折叠影响的只是文本行显示的方式。
折叠的好处是,通过把多行的一节折叠成带有折叠提示的一行,会使你更好地了解对文本
的宏观结构。
折叠方式foldmethod
vim提供以下6种方法来选定折叠方式:
manual 手工定义折叠
indent 更多的缩进表示更高级别的折叠
expr 用表达式来定义折叠
syntax 用语法高亮来定义折叠
diff 对没有更改的文本进行折叠
marker 对文中的标志折叠
折叠级别foldlevel
'foldlevel' 是个数值选项:数字越大则打开的折叠更多。
当 'foldlevel' 为 0 时,所有的折叠关闭。
当 'foldlevel' 为正数时,一些折叠关闭。
当 'foldlevel' 很大时,所有的折叠打开。
折叠栏foldcolumn
'foldcolumn' 是个数字,它设定了在窗口的边上表示折叠的栏的宽度。当为0时,没有折叠栏。最大是12。
一个打开的折叠由一栏来表示,顶端是 '-',其下方是 '|'。这栏在折叠结束的地方结束。当折叠嵌套时,嵌套的折叠出现在被包含的折叠右方一个字符位置。
一个关闭的折叠由 '+' 表示。
当折叠栏太窄而不能显示所有折叠时,显示一数字来表示嵌套的级别。
在折叠栏点击鼠标,可以打开和关闭折叠:
- 点击 '+' 打开在这行的关闭折叠
- 在任何其他非空字符上点击,关闭这行上的打开折叠
在vim配置文件/home/user/.vimrc中加入如下的配置:

"--fold setting--
set foldmethod=syntax " 用语法高亮来定义折叠
set foldlevel=100 " 启动vim时不要自动折叠代码
set foldcolumn=5 " 设置折叠栏宽度

常用命令
za 打开/关闭在光标下的折叠
zA 循环地打开/关闭光标下的折叠
zo 打开 (open) 在光标下的折叠
zO 循环打开 (Open) 光标下的折叠
zc 关闭 (close) 在光标下的折叠
zC 循环关闭 (Close) 在光标下的所有折叠
zM 关闭所有折叠
zR 打开所有的折叠
帮助文档
:help usr_28.txt
:help fold.txt

vim配置7

vim配置7

11、项目目录数管理器Project
Project插件是用来显示项目的目录树的,这个目录树是默认保存在~/.vimprojects文件中。
安装Project
lingd@ubuntu:~$ vim-addons install project
Project目录树可以通过下面的步骤生成:
1) 打开vim在命令模式下输入 :Project,在屏幕的最左边就会出现一个project框。不过因为没有初始化暂时是空的
2)在命令模式下(不是插入模式)输入\C (大写的C),会出现下面这些信息:
Enter the Name of the Entry: xxxx (输入项目名称)
Enter the Absolute Directory to Load: /xxx/xxx/xxx (输入项目根目录的绝对路径)
Enter the CD parameter: . (“.”为当前目录)或者和项目根目录一致
Enter the File Filter: *.* (符合条件的源文件,可以是*.cpp/*.h等)
PS:项目目录可以嵌套。而且更改之后在~/.vimprojects文件中就能看到内容,你可以手动进行更改。

12、quickfix命令集
通过quickfix命令集,你可在 Vim 内编译程序并直接跳转到出错位置进行修正。你可以接着重新编译并做修正,直到不再出错为止。
在vim配置文件/home/user/.vimrc中加入如下的配置:

"-- QuickFix setting --
" 按下F6,执行make clean
map <F6> :make clean<CR><CR><CR>
" 按下F7,执行make编译程序,并打开quickfix窗口,显示编译信息
map <F7> :make<CR><CR><CR> :copen<CR><CR>
" 按下F8,光标移到上一个错误所在的行
map <F8> :cp<CR>
" 按下F9,光标移到下一个错误所在的行
map <F9> :cn<CR>
" 以上的映射是使上面的快捷键在插入模式下也能用
imap <F6> <ESC>:make clean<CR><CR><CR>
imap <F7> <ESC>:make<CR><CR><CR> :copen<CR><CR>
imap <F8> <ESC>:cp<CR>
imap <F9> <ESC>:cn<CR>

帮助文档
:help usr_30
:help quickfix
下面的命令运行 "make" (包括你所给出的参数) 程序并捕捉其运行结果: >
:make {arguments}
如果编译时出现错误,按 <Enter>,回到vim界面,看不到出错信息了!这时,可以运行以下命令
:cw[indow]
打开quickfix窗口来查看出错信息,它会自动跳到第一处出错的地方。然后,你可以双击出错某一条出错信息,vim就会自动跳转到相应的出错位置
:cn[ext] 光标移到下一个错误所在的行
:cp[revious] 光标移到上一个错误所在的行
:cfirst 到第一处错误
:clast 到最后一处错误
:cc 空间不够时,Vim 会缩短出错信息。如果你想查看详细信息,可以使用此命令
:cl[ist] 列出所有出错信息的概览(只有那些含有文件名或行数的错误信息会被显示,需要查看那些并不含文件名或行数的信息可用“:cl[ist]!”命令)

vim配置8

vim配置8

13、Cscope
Cscope是一个类似于ctags的工具,不过其功能比ctags强大很多。
安装Cscope
lingd@ubuntu:~$ sudo apt-get install cscope
在vim配置文件/home/user/.vimrc中加入如下的配置:

"-- Cscope setting --
if has("cscope")
set csprg=/usr/bin/cscope " 指定用来执行cscope的命令
set csto=0 " 设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标签文件再找cscope数据库
set cst " 同时搜索cscope数据库和标签文件
set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用QuickFix窗口来显示cscope查找结果
set nocsverb
if filereadable("cscope.out") " 若当前目录下存在cscope数据库,添加该数据库到vim
cs add cscope.out
elseif $CSCOPE_DB != "" " 否则只要环境变量CSCOPE_DB不为空,则添加其指定的数据库到vim
cs add $CSCOPE_DB
endif
set csverb
endif
map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
" 将:cs find c等Cscope查找命令映射为<C-_>c等快捷键(按法是先按Ctrl+Shift+-, 然后很快再按下c)
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<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> :copen<CR><CR>

cscope的主要功能是通过其"find"子命令来实现的
"cscope find"的用法:
cs find c|d|e|f|g|i|s|t name
或 s 查找这个 C 符号(可以跳过注释)
或 g 查找这个定义
或 d 查找这个函数调用的函数
或 c 查找调用过这个函数的函数
或 t 查找这个字符串
或 e 查找这个 egrep 模式
或 f 查找这个文件
或 i 查找包含这个文件的文件
用法:
<1>、为源码建立一个cscope数据库
lingd@ubuntu:~/arm/linux-2.6.28.7$ cscope -Rbq
lingd@ubuntu:~/arm/linux-2.6.28.7$ ls cscope.*
cscope.in.out cscope.out cscope.po.out
<2>、用vim打开某个源码文件,末行模式下,输入“:cs add cscope.out"(该命令已被我们映射为快捷键F4),添加cscope数据库到vim。因为我们已将vim配置为启动时,自动添加当前目录下的cscope数据库,所以你再添加该cscope数据库时,vim会提示“重复cscope数据库 未被加入“
<3>、完成前两步后,现在就可以用“cs find c”等Cscope查找命令查找关键字了。我们已在.vimrc中将“cs find c”等Cscope查找命令映射为<C-_>c等快捷键(按法是先按Ctrl+Shift+-, 然后很快按下c)

帮助文档
:help if_cscop
注意:帮助文档if_cscop中,快捷键映射nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>是有误的!
比如光标“header.h”上按下<C-_>i,也就是查找包含“header.h“的文件。但是按照这个映射规则,则是将<C-_>i映射为cs find i ^header.h$,也就是查找包含“^header.h$“的文件,这显然不是我们想要的结果。该映射规则应该改成nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR>

vim配置9

vim配置9

14、vim常用快捷键
%  跳转到配对的括号去
[[  跳转到当前或者上一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行)
][  跳转到当前代码块(函数定义、类定义等)的结尾去(但要求代码块中'{'必须单独占一行)
]]  跳转到下一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行)
[/  跳到注释开头(只对/* */注释有效)
]/ 跳到注释结尾(只对/* */注释有效)
gD  跳转到当前文件内标识符首次出现的位置,可用于跳转到全部变量的定义处;查找局部变量时,要是多个函数中定义了该局部变量,使用gD进行查找,找到的变量定义可能不是你需要的
gd 跳转到当前函数内标识符首次出现的位置,可用于跳转到局部变量的定义处
''  跳转到光标上次停靠的地方, 是两个', 而不是一个"
mx  设置书签,x只能是a-z的26个字母
`x  跳转到书签处("`"是1左边的键)
>  增加缩进,"x>"表示增加以下x行的缩进
<  减少缩进,"x<"表示减少以下x行的缩进

×