正所谓“工欲善其事,必先利其器”,要想当一个合格的码农,必须先把自己的开发环境搞好。Linux下的Vim已经用了两年多了,由最开始的愤怒加拍键盘到现在的爱不释手,Vim的强大只有去用时间去丈量。这里就把自己的Vim配置总结一下,同时也参考了网络上面其他同仁的文章。自己做个记录,也希望能帮到大家。
环境:Fedora 2(老掉牙了,没办法,我们做的东西就跑在这个上面), Vim7.3。
基本配置
在home目录下建立.vimrc文件,这是Vim的主配置文件。在这个文件中加入如下配置。
1 "Basic settings 2 set tabstop=2 3 set shiftwidth=2 4 set backspace=2 5 set autoindent 6 set nocompatible 7 syntax on 8 set hlsearch 9 set number 10 set ruler 11 set showcmd 12 set showmatch 13 set wrap 14 set hidden " Keep the unsaved changes in the buffer when you switch to another file 15 set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 " file encoding 16 filetype plugin indent on
具体的不解释了,大家可以搜索一下网络,或者查看一下vim的help文档,不过这些都是最基本的,估计不能再少了。Vim的文档时英文的,如果大家看的不爽的话,可以安装中文文档:
下载地址:http://vimcdoc.sourceforge.net/
下载最新版之后解压缩,之后用命令sudo ./vimcdoc.sh –i安装,貌似用root安装可以所有用户都可以用到。打开gvim输入:help就可以看到文档了。如果还是英文的,就在.vimrc中添加set helplang=cn。
插件配置
Vim的精髓就是插件。给Vim提供了非常丰富的额外功能。
1. 源码阅读 ctags+taglist+cscope
注:vim有可能不支持cscope,可以用命令vim –version | grep cscope查看。如果不支持,需要重新编译安装vim。Configure的时候加上-enable-cscope选项。
下载taglist最新版本,并安装:http://www.vim.org/scripts/script.php?script_id=273
接下来用通过如下命令生成tags:
ctags -R --c-kinds=+p --c++-kinds=+px --python-kinds=-i --extra=+q --fields=+ilaS $SRCDIRPATH
其中这其中的选项包含了对其他插件的支持,具体参数的意义可以参考man tags。
接下来生成cscope.out文件。可以事先通过脚本生成cscope所需的源文件列表。通过cscope生成cscope.out文件。如下:
生成文件列表:
1 if [ ! -f "$CSFILELIST" ]; then 2 find $SRCDIRPATH -regex ".*/.*\.\(c\|h\|cc\|cpp\|cxx\|C\|hh\|hpp\|H\|hxx\)" > $CSFILELIST 3 fi
构建cscope:
1 cscope -bkqc -i $CSFILELIST
最后就是.vimrc里面的配置了,加载ctag和cscope.out文件,以及设置快捷键:
1 " TagList and winmanager plugin settings 2 let Tlist_Auto_Open=1 3 let Tlist_Exit_OnlyWindow=1 4 let Tlist_File_Fold_Auto_Close=1 5 let Tlist_Show_One_File=0 6 set tags=/TAGS/PATH/tags 7 8 " cscope setting 9 cs add /CSCOPE/OUT/PATH/cscope.out 10 nmaps :cs find s =expand(" ") 11 nmap g :cs find g =expand(" ") 12 nmap c :cs find c =expand(" ") 13 nmap t :cs find t =expand(" ") 14 nmap e :cs find e =expand(" ") 15 nmap f :cs find f =expand(" ") 16 nmap i :cs find i ^ =expand(" ") $ 17 nmap d :cs find d =expand(" ")
使用方法:
s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文件
? gd 转到当前光标所指的局部变量的定义
? * 转到当前光标所指的单词下一次出现的地方
? # 转到当前光标所指的单词上一次出现的地方
? ctrl+] 转到函数定义的地方
? ctrl+t 回退到函数调用的地方
2. 编写代码——代码补全 neocomplcache+code_complete+omnicppcomplete
neocomplcache: 可以弹出提示框补全变量、类型,而且可以对当前文件进行缓存,补全精准。用于书写过程的关键词补全。
下载地址:http://www.vim.org/scripts/script.php?script_id=2620
code_complete: 可以用于代码块和常用语句模板补全,可以替代snipMate,最主要的是它可以用于函数参数补全。
下载地址:http://www.vim.org/scripts/script.php?script_id=1764
omnicppcomplete: 由于neocomplcache对结构体、类成员补全的支持不好,所以需要这个插件进行补充,在输入.或者->之后它会自动弹出提示框,进行补全。
下载地址:http://www.vim.org/scripts/script.php?script_id=1520
在.vimrc中进行如下配置:
1 " Neocomplcache settings 2 let g:neocomplcache_enable_at_startup = 1 3 let g:neocomplcache_enable_smart_case = 1 4 let g:neocomplcache_enable_camel_case_completion = 1 5 let g:neocomplcache_min_syntax_length = 3 6 "let g:neocomplcache_enable_underbar_completion = 1 7 ", 8 inoremap <expr>: close popup and delete backword char. neocomplcache#smart_close_popup()."\ " 9 inoremap <expr> neocomplcache#smart_close_popup()."\ " 10 inoremap <expr> neocomplcache#close_popup() 11 inoremap <expr> neocomplcache#cancel_popup() 12 13 " Omnicppcomplete settings ( Close the preview window automatically ) 14 autocmd CursorMovedI * if pumvisible() == 0|pclose|endif 15 autocmd InsertLeave * if pumvisible() == 0|pclose|endif
说明:neo的功能十分强大,支持缓存、驼峰匹配等功能。具体需要参考文档。在这里设置了从第三个字符开始自动匹配。还有退格键匹配太慢,所以禁用了退格键的自动匹配。omni的preview windows很烦人,上面的设置的意思是在匹配完成之后preview window会自动关闭。如果压根儿就不想让preview window出来,需要在.vimrc加上set completeopt=menu。
用法:在自动出现提示框之后,可以按CTRL+N和CTRL+P上下切换。在输入完成函数以及(的时候,可以按TAB键,就会自动补全函数参数,填写完毕之后继续按TAB键,知道完成。也可以输入if之后按TAB键补全if语句。
3. 辅助功能: echofunc、括号自动匹配等
echofunc在gvim下很好用,鼠标移到一个函数或者变量上面会有提示框出来列出他们的基本信息,同事在输入完成函数之后还可以在下边的状态栏上对参数进行提示。
下载地址:http://www.vim.org/scripts/script.php?script_id=1735
在.vimrc中进行如下配置:
1 " 括号匹配 2 ":inoremap ( ()i 3 ":inoremap )=ClosePair(')') 4 :inoremap { {}i 5 :inoremap } =ClosePair('}') 6 :inoremap [ [] i 7 :inoremap ] =ClosePair(']') 8 :inoremap < <> i 9 ":inoremap > =ClosePair('>') 10 11 " Echofunc (echofunc.vim) 12 let g:EchoFuncKeyNext='' 13 let g:EchoFuncKeyPrev=' ' 14 let g:EchoFuncAutoStartBalloonDeclaration = 1 15 16 """"""""""""""""""""""""""""""""""""""""""""""""""""""" 17 """"""""""""""""""" Functions """"""""""""""""""""""""" 18 """"""""""""""""""""""""""""""""""""""""""""""""""""""" 19 function ClosePair(char) 20 if getline('.')[col('.') - 1] == a:char 21 return "\ " 22 else 23 return a:char 24 endif 25 endf
用法:在输入完成函数的左括号,或者在输入函数参数的过程中,可以通过通过按SHIFT+N或者SHIFT+P来提示函数参数。提示信息会在下边状态栏显示。
4. 各种快捷键设置
在.vim中进行如下设置:
1 " Hotkeys 2 map:TlistToggle 3 map :set list 4 map :set nolist 5 map :w! 6 map :cs reset 7 map :w :call CompileRun() 8 map :w :call Debug() 9 10 map :tabnew :tabnext 11 map 1> :tabn 1 12 map 2> :tabn 2 13 map 3> :tabn 3 14 map 4> :tabn 4 15 map 5> :tabn 5 16 map 6> :tabn 6 17 map 7> :tabn 7 18 19 """"""""""""""""""""""""""""""""""""""""""""""""""""""" 20 """"""""""""""""""" Functions """"""""""""""""""""""""" 21 """"""""""""""""""""""""""""""""""""""""""""""""""""""" 22 func CompileRun() 23 if &filetype == 'c' 24 exec "!gcc % -g -o %<" 25 exec "!.\/%<" 26 elseif &filetype =='cpp' 27 exec "!g++ % -g -o %<" 28 exec "!.\/%<" 29 elseif &filetype == 'python' 30 exec "!python %" 31 endif 32 endfunc 33 34 func Debug() 35 if &filetype == 'c' 36 exec "!rm %<" 37 exec "!gcc % -g -o %<" 38 exec "!ddd %<" 39 elseif &filetype == 'cpp' 40 exec "!rm %<" 41 exec "!g++ % -g -o %<" 42 exec "!gdb %<" 43 exec "!rm %<.class" 44 elseif &filetype == 'java' 45 exec "!javac %" 46 exec "!jdb %<" 47 elseif &filetype == 'python' 48 exec "!pdb %" 49 endif 50 endfunc
用法:
F2:打开和关闭taglist
F3:显示文件结束符以及TAB符号
F4:隐藏文件结束符以及TAB符号
F5:强制保存
F6:重置cscope连接。因为我们在编写代码的同时,cscope会过时,所以可以用定时任务自动重建cscope,重建完成之后vim中的cscope连接会失效,可以按F6重置。
F12:自动编译运行当前文件。适合做实验。连续按两次F12会启动DDD调试当前文件。
最后:个别插件是需要cscope或者ctags设置指定参数之后生成支持文件之后才能使用的,如果想单独使用某个插件的花,最好仔细阅读以下vim.org上的说明。
参考文献:
http://www.vimer.cn
http://www.cnblogs.com/gnuhpc/archive/2012/01/13/2321400.html