那些离了就活不了的 VIM 插件

两年前,我写了 一篇 blog 推荐了不少自己常用的 VIM 插件。现在回头看看,文章中的一些插件我自己现在 都已经没在用了。有些插件比如 pathogen、ack.vim 已经找到了更好的替代品。同时又找到了一些 YouCompleteMe 之类的优秀新欢。

抱着分享的目的,我决定重新整理一下自己常用的 VIM 插件简介,这些插件基本上都是我每天工作用到的,基本上 离了就活不了 。不求介绍的多详细,只希望它们能够成为屏幕前的你日常编码不可或缺的好帮手。

插件管理:Vundle

项目地址:https://github.com/VundleVim/Vundle.vim

pathogen 出来之前,使用 VIM 插件简直就是一场噩梦。你找到一个牛X的插件,下载 zip 包,把它 倒腾到你的 ~/.vim 里。慢慢的你装的插件越来越多,到最后你的 .vim 文件夹便堆满了各种各样的插件文件, 成了一个无法管理的垃圾堆。

pathogen 横空出世后,插件安装过程变得清晰自然,似乎 vim 插件的安装使用本来就应该是这样。 而 Vundle 则在 pathogen 的基础上更进了一步。它利用在 .vimrc 文件中添加配置行的方式来管理插件。

常用操作

单独使用 pathogen 时,想要临时关闭某个插件很麻烦。你需要把它从 bundle 移动到某一个临时目录中, 而在 Vundle 中,你只要简单的注释掉那一行插件配置即可:

plugin 'scrooloose/nerdtree' 
" 注释掉对应行来关闭插件 
" plugin 'scrooloose/syntastic' 

对于我这种装了一大堆插件的人,在 pathogen 时代想要升级插件是比较痛苦的。我得挨个进入到插件目录中执行 git pull。使用 vundle 后,用 :PluginUpdate 命令就可以一键升级所有插件,懒人福音。

文件跳转:ctrlp.vim

项目地址:https://github.com/kien/ctrlp.vim

在 VIM 世界里,有人是分窗口编辑文件的忠实拥护者,有人则是多文件 tab 页的死忠骨灰粉。但无论哪种人, 在一些大项目内进行编辑工作时,如果要快速打开 './lib/foo/bar/comm/base_utils.py' 这类藏在大山深处的文件,都需像剥粽子一样,一层一层往下找,让人头疼。

ctrlp.vim 则完美帮你解决了这个痛点,当你想打开某个文件时,只要按下 Ctrl + p 快捷键,输入文件名。 所有和这个文件名匹配的文件都会被按照优先级列出来,按下 enter 或者 Ctrl + t 就可以在当前 buffer 或者新 tab 页打开你要的文件了。

必要的配置:

let g:ctrlp_map = '<c-p>' 
let g:ctrlp_cmd = 'CtrlP'
" 设置过滤不进行查找的后缀名 
let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn|pyc)$' 

自动补全:YouCompleteMe(YCM)

项目地址:https://github.com/Valloric/YouCompleteMe

我入行不久时,在一篇忘了出处的文章里看到一句话:『 过渡依赖 IDE的代码补全功能不利于编码能力的成长』。 从此便生怕 IDE 邪恶的自动补全会阻碍我在成为优秀码农的道路上快速前进。于是在之后长达两年多的时间里,我一直都没有 使用过任何自动补全相关的插件。

好处是有的,很多常用模块的函数名、方法名我基本能够一次正确的打出来。坏处就是我的键盘磨损的比别人的都快 :(

一次偶然的机会,我接触到了当时已经大火的插件 YouCompleteMe(YCM) 。经过简单配置使用后,简直让人无法自拔。 比如,代码中难免会有一些较长的变量名,像 pages_of_books 这类。有了 YCM 后,按下 pag , 整个变量名就补全出来了。

YCM 对我来说,更多的是一个减少按键次数,提升效率的帮手。对于常用模块、函数的名字和功能, 还是直接查文档或者使用 dash 之类的工具更方便一些。

YCM 还有一个我常用的功能是快速跳转。通过按下设置好的快捷键,可以跳转到某一个函数或者类的定义代码处, 对快速查看源码非常有帮助。

必要的配置:

" 设置跳转到方法/函数定义的快捷键 
nnoremap <leader>j :YcmCompleter GoToDefinitionElseDeclaration<CR> 
" 触发补全快捷键 
let g:ycm_key_list_select_completion = ['<TAB>', '<c-n>', '<Down>'] 
let g:ycm_key_list_previous_completion = ['<S-TAB>', '<c-p>', '<Up>'] 
let g:ycm_auto_trigger = 1 
" 最小自动触发补全的字符大小设置为 3 
let g:ycm_min_num_of_chars_for_completion = 3 
" YCM的previw窗口比较恼人,还是关闭比较好 
set completeopt-=preview 

内容搜索:ag.vim

项目地址:https://github.com/rking/ag.vim

在我之前写的文章里,推荐过使用 ack.vim 来进行内容查找。现在我建议换成 ag.vim。ag.vim 主要是基于 ag(https://github.com/ggreer/the_silver_searcher) 进行的 VIM 集成封装,而 ag 这个工具查找速度是 异乎寻常的快。比 ack 快上几个数量级,强烈推荐。

状态条加强:vim-airline

项目地址:https://github.com/bling/vim-airline

vim-airline 其实已经非常流行了,几乎是人手必备。身为(编辑器)外貌协会会员的我自然也不会错过。对我来说, 它的最大好处就是 好看 。附带功能可以一目了然的区分各种编辑状态,还有就是配合 syntastic 在状态栏提示语法错误。

默认情况下,airline 使用 ASCII 字符来作为状态条的分隔符,如果要弄出那些效果图中 fancy 的样子,需要 安装并设置终端字体为 powerline 专用的 patch 过的字体 。并在 .vimrc 中设置:

let g:airline_powerline_fonts = 1 

代码分析:tagbar

项目地址:https://github.com/majutsushi/tagbar

阅读复杂的源码文件是一件让人痛苦的事情,你得花上大量的时间理清各个类、方法之间的关系。 在这时使用 vim-tagbar 插件可以帮你快速了解当前文件的结构,并让你可以在各个内容之间快速跳转。

安装插件后,需要在 .vimrc 中设置好快捷键,之后按下 F8 就可以打开当前文件的预览窗口了。

nmap <F8> :TagbarToggle<CR> 

结语

今天的分享就到这里吧,作为给看到文章最后的人福利,特送上一大堆漂亮的 VIM themes: base16-vim , Enjoy VIM and have fun!