1. 使用ctags—建立标签,用于程序跳转
"tags"文件中包括这些对象的列表:
用#define定义的宏
枚举型变量的值
函数的定义、原型和声明
名字空间(namespace)
类型定义(typedefs)
变量(包括定义和声明)(局部变量不行)
类(class)、结构(struct)、枚举类型(enum)和联合(union)
类、结构和联合中成员变量或函数
在源码目录创建tag文件,进入源码目录后输入ctags -R
"-R"表示递归创建,也就包括源代码根目录下的所有子目录下的源程序。(虽然目录下没有子目录,但不加-R居然不行,小写的r也不行)
若输入后提示错误,如:ctags: no input files specified. 最可能的原因就是ctags的版本太低了,
去http:8//ctags.sourceforge.net 下载最新版本(目前是5.8),解压并安装:
tar-zxvf ctags-5.8.tar.gz
cdctags-5.8
./configure
make
sduomake install(需root权限)
最方便的使用方法就是打开你的源文件,把光标移到变量名或函数名上,然后按下""就会跳转到对应的定义。用"Ctrl+t或。
注意:运行vim的时候,必须在"tags"文件所在的目录下运行。否则,运行vim的时候还要用":set tags="命令设定"tags"文件的路径,这样vim才能找到"tags"文件。
gd转到当前光标所指的局部变量的定义,经测试Ctrl+o可退回原来的地方,此外可通过n/N上下来回切换。
* 转到当前光标所指的单词下一次出现的地方(经测试,n就行,果断用这个)
# 转到当前光标所指的单词上一次出现的地方(同上,N就行,果断用这个)
不过还有一个小瑕疵, 你修改程序后, 比如增加了函数定义,删除了变量定义, tags文件不能自动rebuild, 你必须手动再运行一下命令:
$ctags -R
使tags文件更新一下, 不过让人感到欣慰的是vim不用重新启动, 你可以通过输入
:!ctags -R 即可。
正在编写的程序也不用退出, 马上就可以又正确使用Ctrl+]了.。
2. 使用taglist—浏览源码,估计类似于source insight
注意:taglist依赖于ctags,所以要先装ctags,否则taglist装了也没法用!
在http://www.vim.org/scripts/script.php?script_id=273 下载最新版本
(目前是45)
下载后,把该文件在~/.vim/目录中解压缩,解压命令:unzip taglist_45.zip
这会在你的~/.vim/plugin和~/.vim/doc目录中各放入一个文件:
plugin/taglist.vim– taglist插件
doc/taglist.txt - taglist帮助文件
使用下面的命令生成帮助标签(下面的操作在VIM中进行):
:helptags~/.vim/doc
生成帮助标签后,你就可以用下面的命令查看taglist的帮助了:
:helptaglist.txt
接着先在你的~/.vimrc文件中添加下面两句:
letTlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的
letTlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim
此时用vim打开一个c源文件,
进入vim后用下面的命令打开taglist窗口
:Tlist
自建快捷方式:
在~/.vimrc中输入:
nnoremap<silent> <F9> :Tlist<CR>
意思是按F9代替:Tlist。(这种方法真好用)
左边的窗口就是TagList窗口, 其中列出了xx.c文件中的tag, 并且按照"typedef","variable", "function"等进行了分类.
将光标移到上面,按下回车键后, 会自动跳转到其在源码的定义处.
然后按下的是空格键, 在下面的命令栏中, 会显示该tag在源码中完整的写法, 而不会跳转到源码处。
在taglist窗口中,可以使用下面的快捷键:
o 在一个新打开的窗口中显示光标下tag
<Space> 显示光标下tag的原型定义
回车键 跳到光标所在的标记的定义处(如将光标移到main函数,按回车键)
u 更新taglist窗口中的tag
(比如源文件新增了一个函数并在保存后,可在taglist窗口按u)
s 更改排序方式,在按名字排序和按出现顺序排序间切换
x taglist窗口放大和缩小,方便查看较长的tag
+ 打开一个折叠,同zo
- 将tag折叠起来,同zc
* 打开所有的折叠,同zR
= 将所有tag折叠起来,同zM
[[ 跳到前一个文件
]] 跳到后一个文件
q 关闭taglist窗口
3. a.vim—快速切换头文件/源文件
在http://www.vim.org/scripts/script.php?script_id=31 下载a.vim
将a.vim 放到 ~/.vim/plugin 文件夹中
安装好a.vim后常用命令如下:
:A 在新Buffer中切换到c/h文件
:AS 横向分割窗口并打开c/h文件
:AV 纵向分割窗口并打开c/h文件
:AT 新建一个标签页并打开c/h文件(不懂有什么用)
自建快捷方式:
在~/.vimrc中输入:
nnoremap<silent> <F12> :A<CR>
意思是按F12代替:A。
4. winmanager—文件浏览器和窗口管理器
我们通过WinManager来管理文件浏览器netrw和标签浏览器Taglist。
netrw是标准的vim插件, 已经随vim一起安装进系统里了, 不需要我们自行下载安装。
在http://www.vim.org/scripts/script.php?script_id=95 下载winmanager,
(目前版本2.3)
下载后,把该文件在~/.vim/目录中解压缩,解压命令:unzip winmanager.zip
这自动会在你的~/.vim/plugin和~/.vim/doc目录中放入相关文件。
帮助文件 :help winmanager
在~/.vimrc中输入:
g:winManagerWindowLayout='FileExplorer|TagList'
nnoremap<silent> <F3> :WMToggle<CR>
文件浏览器命令(在文件浏览器窗口中使用)
<enter>如果光标下是目录, 则进入该目录; 如果光标下是文件, 则打开该文件
<tab>如果光标下是目录, 则进入该目录; 如果光标下是文件, 则在新窗口打开该文件
<F5>刷新列表
- 返回上一层目录
c 使浏览目录成为vim当前工作目录(挺不错)
d 创建目录(无法创建,不知道为什么)
D 删除当前光标下的目录或文件(目录必须为空才能成功删除)
i 主要显示文件的大小和创建时间
R 文件或目录重命名
x 定制浏览方式, 使用你指定的程序打开该文件(目前估计用不到)
注:以下的s,z要在i关闭的情况下(即不显示文件的详细信息)使用,
以免提示错误。
s 选择排序方式(名字/创建日期/大小来回切换)
r 反向排序列表
winmanager帮助文档
:helpwinmanager
netrw帮助文档
:helpnetrw
5. Cscope
它被设计用来回答以下的问题:
*什么地方用到了这个符号?
*这是在什么地方定义的?
*这个变量在哪里被赋值?
*这个全局符号的定义在哪里?
*这个函数在源文件中的哪个地方?
*哪些函数调用了这个函数?
*这个函数调用了哪些函数?
*信息 "out of space" 从哪来?
*这个源文件在整个目录结构中处于什么位置?
*哪些文件包含这个头文件?
在http://cscope.sourceforge.net 下载一个源码包, 解压后编译安装:
tar-zxvf cscope-15.7a.tar.bz2
cdcscope-15.7a
./configure
make
sduomake install(需root权限)
我在安装过程中出现一些问题:
如果 make 时出现“curses.h not found”之类的错误,则需要先安装“libncurses-dev”包
apt-getinstall libncurses-dev
之后回到安装目录
makeclean &&./configure&&make&&make install
如果make出现`flex' is missing on your system.则需要安装flex包,余同上
如果make出现yacc: 未找到命令 则需要安装byacc包,余同上
擦,居然上面3个问题都出现了!真麻烦。
在~/vimrc中我的配置如下:
"--Cscope setting --
setcscopequickfix=s-,c-,d-,i-,t-,e-" 使用QuickFix窗口来显示cscope查找结果
"将:cs find c等Cscope查找命令映射为<C-_>c等快捷键
(按法是先按Ctrl+Shift+-, 然后很快再按下c)
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>
map <F2> :cs add./cscope.out<CR>:copen<CR>
cscope的用法很简单,首先需要为你的代码生成一个cscope数据库。
即进入vim后第一件事是要把刚才生成的cscope文件导入到vim中来,
在你的项目根目录运行下面的命令:
cscope-Rbq
这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本的符号索引,后两个文件是使用”-q “选项生成的,可以加快cscope的索引速度。
在缺省情况下,cscope在生成数据库后就会进入它自己的查询界面,一般不用这个界面,所以使用了”-b “选项。如果你已经进入了这个界面,按CTRL+D 退出。
cscope各个选项的含义:
-R:在生成索引文件时,搜索子目录树中的代码
-b:只生成索引文件,不进入cscope的界面
-q:生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
在VIM中使用cscope也很简单,首先调用“:cs add cscope.out ”命令添加一个cscope数据库,然后就可以调用“cscope find ”命令进行查找了。
"cscopefind"的用法:
csfind c|d|e|f|g|i|s|t name
下面列出find的一些选项:
s:查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g:查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d:查找本函数调用的函数
c:查找调用本函数的函数
t:查找指定的字符串
e:查找egrep模式,相当于egrep功能,但查找速度快多了
f:查找并打开文件,类似vim的find功能
i:查找包含本文件的文件
注:在查找时可以简单的输入":cs f s name "
输完命令后,按下回车后vim会自动跳转到第一个符合要求的地方, 并且在命令栏显示有多少符合要求的结果。
如果自动跳转的位置你不满意, 想看其他的结果,
可以用下面的命令打开QuickFix窗口:
:cw
这时你就可以慢慢挑选了。
如果每次查找都要输入一长串命令的话还真是件讨人厌的事情, Cscope的帮助手册中推荐了一些快捷键的用法, 下面是其中一组, 也是我用的, 将下面的内容添加到~/.vimrc中, 并重启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>
当光标停在某个你要查找的词上时, 按下<C-_>g, 就是查找该对象的定义, 其他的同理.
按这种组合键有一点技巧,按了<C-_>后要马上按下一个键,否则屏幕一闪就回到nomal状态了<C-_>g的按法是先按"Ctrl+Shift+-", 然后很快再按"g".
注:跳转后,经自己测试,ctrl+o可以返回远处。
reset: 重新初始化所有连接。
用法 : cs reset
6. QuickFix—用于调试
帮助文档
:helpusr_30
:helpquickfix
如果编译时
:make出现错误,
按 <Enter>,回到vim界面,看不到出错信息了!这时,可以运行以下命令
:cw或:copen
(:copen和:cclose不错,即使不在QuickFix窗口内,也可直接将其开启和关闭)
打开quickfix窗口来查看出错信息,它会自动跳到第一处出错的地方。
你还可以用下面的命令来跳转:
:cn 切换到下一个结果
:cp 切换到上一个结果
我在~/.vimrc中配置如下:
"-- QuickFix setting --
"按下F5,执行make clean
map <F5> :makeclean<CR><CR><CR>:copen<CR>
" 按下F6,执行make编译程序,并打开quickfix窗口,显示编译信息
map <F6>:make<CR><CR>:copen<CR><CR>
"按下F7,光标移到下一个错误所在的行
map <F7> :cn<CR>
"按下F8,光标移到上一个错误所在的行
map <F8> :cp<CR>
最后,编译顺利通过后,输入:!./xxx 就可以运行生成的可执行程序xxx了,不用退出vim。
7. MiniBufExplorer—快速浏览和操作Buffer
在http://www.vim.org/scripts/script.php?script_id=159 下载minibufexpl.vim。
(目前版本为6.3.2)
将下载的 minibufexpl.vim文件丢到 ~/.vim/plugin 文件夹中即可。
buffer管理器MiniBufferExplorer
MiniBufferExplorer用于浏览和管理buffer,如果只打开一个文件,是不会显示在屏幕上的,而打开多个文件之后,会自动出现在屏幕最上方。
vim也有自带的buffer管理工具,不过只有:ls, :bnext, :bdelete 等的命令, 既不好用, 又不直观.
关于vim缓冲区(buffer)和窗口的概念(详见:help windows)
"缓冲区" 是一块内存区域,里面存储着正在编辑的文件。如果没有把缓冲区里的文件存盘,那么原始文件不会被更改。
"窗口" 被用来查看缓冲区里的内容。你可以用多个窗口观察同一个缓冲区,也可以用多个窗口观察不同的缓冲区。
"屏幕" Vim 所用的整个工作区域,可以是一个终端模拟窗口,也被叫做"Vim 窗口"。一个屏幕包含一个或多个窗口,被状态行和屏幕底部的命令行分割。
+-------------------------------+
屏幕 | 窗口 1 | 窗口 2 |
| | |
| | |
|=== 状态行 ===|==== 状态行 ===|
| 窗口 3 |
| |
| |
|========== 状态行 =============|
|命令行 |
+-------------------------------+
屏幕最上方那个狭长的窗口就是MiniBufExplorer窗口, 其中列出了当前所有已经打开的buffer, 当你把光标置于这个窗口时, 有下面几个快捷键可以用:
常用命令
<Tab> 移到上一个buffer
<Shift-Tab> 移到下一个buffer
<Enter> 打开光标所在的buffer
d 删除光标所在的buffer
注:如果将文件改动后没保存时,buffer会变色,且在[xxx]后加个+,变为[xxx]+提醒用户。
配合 ctrl+^ 就可以轻松地在他们之间来回切换,比如现在同时打开了6个文件,则就有6个不同的缓冲区,比如现在在编辑文件1,想切换到文件5去,则需要先把本文件保存,然后再按5,就切换到文件5了。
注:如果就2个文件,可输入2, 再按ctrl+^,
然后就可以ctrl+^在2个文件间快速切换了。
:eXX 如果xx文件存在则打开,如果不存在则新建一个名为XX的文件。
e=edit。(很有用)
8. fold—代码折叠(不用下载插件)
折叠用于把缓冲区内某一范围内的文本行显示为屏幕上的一行。就像一张纸,要它缩短
些,可以把它折叠起来。
那些文本仍然在缓冲区内而没有改变。受到折叠影响的只是文本行显示的方式。
折叠的好处是,通过把多行的一节折叠成带有折叠提示的一行,
会使你更好地了解文本的宏观结构。
折叠方式foldmethod
vim提供以下6种方法来选定折叠方式:
manual手工定义折叠
indent更多的缩进表示更高级别的折叠
expr用表达式来定义折叠
syntax用语法高亮来定义折叠
diff 对没有更改的文本进行折叠
marker对文中的标志折叠
我们按照语法高亮来折叠代码, 其实就是按照代码中的一些括号来定义折叠位置, 比如: "{ }", "/* */". 现在练习一下,就在nomal模式下输入命令"za", 你会发现当前光标所在的最近的一层括号被折叠起来了, 再输入一遍"za"命令, 这个折叠又打开了, "za"命令就是打开/关闭当前折叠用。
常用命令(够用了):
za 打开/关闭在光标下的折叠
zM 关闭所有折叠
zR 打开所有的折叠
帮助文档
:helpusr_28.txt
:helpfold.txt
9. 在http://www.vim.org/scripts/script.php?script_id=1520 上下载omnicppcomplete
解压 unzip omnicppcomplete-0.41.zip -d ~/.vim
使用下面的命令生成帮助标签(下面的操作在VIM中进行):
:helptags~/.vim/doc
生成帮助标签后,你就可以用下面的命令查看taglist的帮助了:
:h omnicppcomplete。
omnicppcomplete主要依赖ctags生成的tags文件来判断补全的,所以首先应该生成一定的信息。也就是说应该先把类写好,然后再生成tags,以后出现对象的 ”.” 或 ”->”成员操作时它自动寻找成员函数。
onmicppcompete功能:
命名空间(namespace),类(class),结构(struct)和联合(union)补全
函数属性成员和返回值类型补全
"this"指针成员补全
C/C++类型转换(cast)对象补全
类型定义(typedef)和匿名类型(anonymous types)补全
OmniCppComplete是基于ctags数据库即tags文件实现的(基于ctags生成的索引信息来实现自动补全的).
对于C++代码, 在ctags -R生成tags时还需要一些额外的选项,这样生成的tags文件才能与OmniCppComplete配合运作。使用下列命令生成tags文件,就可以与OmniCppComplete配合运作:
ctags-R --c++-kinds=+p --fields=+iaS --extra=+q .
--c++-kinds=+p : 为C++文件增加函数原型的标签
--fields=+iaS : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
extra=+q : 为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全
10. echofunc提示函数原形
在http://www.vim.org/scripts/script.php?script_id=1735 上下载echofunc
(目前版本1.3)
把echofunc.vim 文件丢到 ~/.vim/plugin 文件夹就好了.
当编程调用一个函数时, 最可恶的是忘了这个函数参数列表的详细定义了, 然后要跳转到定义处看看, 再跳转回来继续写, 如果参数列表太长了, 还要来回跳转多次。
言归正传, 该插件的作用是当你在vim插入(insert)模式下紧接着函数名后输入一个"("的时候, 这个函数的声明就会自动显示在命令行中. 如果这个函数有多个声明, 则可以通过按键"Alt+-"和"Alt+="向前和向后翻页, 这个两个键可以通过设置EchoFuncKeyPrev和EchoFuncKeyNext参数来修改.
这个插件的功能需要tags文件的支持, 并且在创建tags文件的时候要加选项"--fields=+lS", 整个创建tags文件的命令如下:
$ctags -R --fields=+lS
还有一个小技巧告诉你, 当你把鼠标放在函数名上的时候会有一个tip窗口弹出, 该窗口中也会有函数的声明, 这个功能需要你在编译vim时编译"+balloon_eval"特性了.
11. Omni Completeion-全能补全
帮助文件 :help new-omni-completion
在~/.vimrc文件中增加下面两句:
filetypeplugin indent on 打开文件类型检测, 加了这句才可以用智能补全
setcompleteopt=longest,menu 关掉智能补全时的预览窗口
请确定你的Ctags已经安装好, 并且生成的tags文件已经可以用了。
打开源文件,随便找一个有成员变量的对象, 比如"parmp", 进入Insert模式, 将光标放在"->"或"."后面,
然后按下"Ctrl+X Ctrl+O", 在vin的状态行会显示“”,表明现在进行的是全能补全,同时会弹出一个下拉菜单,显示所有匹配的标签。
你可以使用Ctrl+N/Ctrl+P来上下选择(果断推荐),在选择的同时,所选中的项就被放在光标位置,不需要再按回车来把它放在光标位置。
当然你也可以使用上、下光标键来选择项目(不推荐),然后按回车把选中的项目放到光标位置。不过这样一来,你的手指就会离开主编辑区,并且需要多输入一个回车键。
常用的快捷方式:
Ctrl+N 向后切换成员
Ctrl+P 向前切换成员
Ctrl+E 表示退出下拉窗口, 并退回到原来录入的文字
Ctrl+Y 表示退出下拉窗口, 并接受当前选项
如果你增加了一些成员变量, 全能补全还不能马上将新成员补全, 需要你重新生成一下tags文件, 但是你不用重启vim, 只是重新生成一下tags文件就行了, 这时全能补全已经可以自动补全了, 还真够"全能"吧.
vim中的其他补全方式还有:
Ctrl+XCtrl+L
整行补全
Ctrl+XCtrl+N 根据当前文件里关键字补全
Ctrl+XCtrl+K 根据字典补全
Ctrl+XCtrl+T 根据同义词字典补全
Ctrl+XCtrl+I 根据头文件内关键字补全
Ctrl+XCtrl+] 根据标签补全
Ctrl+XCtrl+F 补全文件名
Ctrl+XCtrl+D 补全宏定义
Ctrl+XCtrl+V 补全vim命令
Ctrl+XCtrl+U 用户自定义补全方式
Ctrl+XCtrl+S 拼写建议
12. supertab-加速你的补全
在http://www.vim.org/scripts/script.php?script_id=1643 上下载supertab.vba
(目前版本1.6)
install details
Downloadsupertab.vba to any directory.
Openthe file in vim ($ vim supertab.vba).
Sourcethe file (:so %).
帮助文档: :help supertab
在你的~/.vimrc文件中加上这两句:
letg:SuperTabRetainCompletionType=2
letg:SuperTabDefaultCompletionType="<C-X><C-O>"
以后当你准备按"Ctrl+X Ctrl+O"的时候直接按<Tab>就好了。
(前提当然时得在插入模式下)
出现下拉表时,按tab向下选择,shift+tab向上选择。
其中
letg:SuperTabRetainCompletionType=2
"0 - 不记录上次的补全方式
"1 - 记住上次的补全方式,直到用其他的补全命令改变它
"2 - 记住上次的补全方式,直到按ESC退出插入模式为止
问题:
<Tab>键不好用了, 如果前面有字符按下<Tab>键后就会进行补全, 而不是缩进功能。
13. c.vim
利用c.vim插件,你可以实现
添加文件头
添加注释
插入一些代码片段
语法检查
读函数文档
注释代码块
安装很简单,将cvim.zip拷贝到~/.vim目录下,然后unzip就可以了。
还要在~/.vimrc中添加filetype plugin on。
常用快捷键(在n,i模式均可以):
\im main( );
\if function( );
\ip printf( );
\isc scanf( );
\ifp fprintf( );
\ifs fscanf( );
\ica p=calloc( );
\ima p=malloc( );
\ire p=realloc( );
\is struct + typedef
\iu union + typedef
\ie enum + typedef
\cfu 插入函数头,即函数说明
\cfr 插入一个注释框架,可以用来写变量说明
注:以下几个命令组合配合强大,好记,推荐。
\si if( )
\se else{ }
\sif if(){ }
\sife if( ){ } else { }
\sw while( )
\sd do{ } while( )
\sf for( )
\ss switch (默认case3个)
\sc case: break;(增加case个数)
{<CR> { (此命令得在i模式下)
|
}
\p< #include<...>
\p" #include"..."
\pd #define;
\pind #ifndef #define ... #endif
\rc save and compile
\rl link
\rr run
\rm run make
\rmc run make clean
\nr 可以在~/.vim/c-support/codesnippets中编写一些预编译代码或者代码块
通过此命令使用。
以下命令只能在i模式下运行:
/* /* */
/*<CR> /*
*
*/
{<CR> {
|
}
c-support还有很多快捷键,可以参见文件~/.vim/c-support/doc/c-hotkeys.pdf。
如果记不住就打印一份,编写程序的时候看着用就好啦.
如果用gvim的话,有菜单可以用,也可以不用记那么多的快捷键。