我的Vim配置

为什么写这篇文章

配置了两天的Vim,折腾到深夜,最后终于调整得比较满意。

效果图如下所示:

启动页:

效果图

工作时:

效果图

目录树:

效果图

主要功能有:

  1. vundle管理插件
  2. airline状态栏
  3. bufferline显示
  4. nerdtree文件树显示
  5. ctrlp快捷打开文档
  6. neocomplcache自动补全
  7. tagbar显示函数,变量列表
  8. ultisnips快捷方式
  9. vimshell vim下的shell
  10. vim-multiple-cursors 类似sublime的多位置同时编辑

我的Vim配置

vimrc文件可以看这里:

https://github.com/legendmohe/vimfiles/blob/master/vimrc

下面主要介绍一下几个主要的plugin的折腾过程。

vundle

https://github.com/gmarik/vundle

一开始用plugin的时候,没有用类似vundle的包管理工具,只是将autoload等文件夹拷贝到vimfiles下了事,后来由于感觉安装和删除plugin时十分麻烦,要一个个文件夹点进去删除文件,所以找到了这个插件。

安装的方法按照教程来做即可,值得注意的是,如果你要将vim配置(包括vimfile和vimrc)上传到Github来多平台同步,那么要用git的submodule来做,具体可以参考这里

与上面教程中不同的是,我在.gitignore文件中加入:

#############
## vundle
#############

.netrwhist 
bundle/*
*.swp

将bunde加入ignore文件是为了避免一系列的submodule的问题。

将vundle安装在vimfiles下,plugin都放在bundle里。最后目录结构如下所示:

./
../
.git/
.gitattributes*
.gitignore*
.gitmodules*
bundle/
README.markdown*
vimrc*
vundle/

修改完配置后正常commit-sync即可。

在另一台电脑上,只要将vimfiles clone到本地,然后在vim中执行

:BundleInstall

即可同步所有配置。另外,vundle的配置最好写在vimrc的最上部分,最好写上:

if has('win32') || has('win64')
  set rtp+=$HOME/vimfiles/vundle/
  call vundle#rc('$HOME/vimfiles/bundle/')
else
  " Usual quickstart instructions
  set rtp+=~/.vim/vundle/
  call vundle#rc()
endi

来根据不同os来更改plugin的路径。

vimproc

https://github.com/Shougo/vimproc.vim

这是一个什么插件呢?简单地说,就是让某些插件可以在后台干活(例如生成缓存,扫描文件夹),不会卡住vim的界面。另外,VimShell这个插件也依赖于这个包。

最麻烦的是vimproc要手动编译库文件,如果在windows下进行,要安装MinGW或者Cygwin,具体看plugin的README文件。

airline

https://github.com/bling/vim-airline

这是一个状态栏插件,让你的Vim瞬间变得高大上。

我的设置如下:

""""""""""""""""""""""""""""""
" airline setting
""""""""""""""""""""""""""""""
set laststatus=2
let g:airline_detect_whitespace          = 0 "关闭空白符检测
let g:airline#extensions#tabline#enabled = 1 "顶部tab栏显示
let g:airline_theme                      = "bubblegum" "设定主题

NERDTree

https://github.com/scrooloose/nerdtree

这个插件如果不做任何修改的话,还是可以一用的,但是会有很多不便之处,特别是在多tab同步工作的时候。

这个插件:vim-nerdtree-tabs可以令多tab的情况下nredtree同步显示同一个目录树。

ctrlp

https://github.com/kien/ctrlp.vim

就像sublime text中的ctrl-p一样,可以fuzzy地查找文件,神器。不过第一次打开时会有点慢,应该是正在生成索引的原因吧。

我的配置如下:

""""""""""""""""""""""""""""""
" Ctrlp setting
""""""""""""""""""""""""""""""
nnoremap <silent> <leader>h :CtrlPMRU<cr>
nnoremap <silent> <leader>p :CtrlP<cr>

推荐加入历史查找功能,这样子可以替代其他与history有关的plugin了

neocomplcache

https://github.com/Shougo/neocomplcache.vim

尝试了好几个自动补全的插件,但是都太重了,依赖了很多其他的库。这个plugin速度还可以,如果有lua环境的吧,还可以用neocomplete升级版,听说会更快。

我的配置如下:

“””””””””””””””””””””””””””””” ” neocomplcache setting “”””””””””””””””””””””””””””””

let g:acp_enableAtStartup             = 0
" Use neocomplcache.
let g:neocomplcache_enable_at_startup = 0 "最好关闭,要不提示太频繁
" Use smartcase.
let g:neocomplcache_enable_smart_case = 1
" Set minimum syntax keyword length.
let g:neocomplcache_min_syntax_length = 2
" AutoComplPop like behavior.
"let g:neocomplcache_enable_auto_select = 1

inoremap <expr><space>  pumvisible() ? neocomplcache#close_popup() . "\<SPACE>" : "\<SPACE>"

Syntastic

https://github.com/scrooloose/syntastic

这是一个静态语法检查的插件,每次保存的时候它就会检查你的语法是否有错误,比较轻型,推荐。

我的配置如下:

""""""""""""""""""""""""""""""
" Syntastic setting
""""""""""""""""""""""""""""""
let g:syntastic_check_on_open=1

注意的是,如果没有安装vimproc,那么开启了上面的选项以后,打开大一点的源代码时会卡住一阵子。

tagbar

https://github.com/majutsushi/tagbar

网上很多地方推荐用taglist,但是taglist太久没更新了。于是看到了这个后继者tagbar。感觉还可以。

我的配置如下:

""""""""""""""""""""""""""""""
" Tagbar setting
""""""""""""""""""""""""""""""
nmap <F4> :TagbarToggle<CR>

ultisnips

https://github.com/SirVer/ultisnips

一开始用的是snipsMate,但是跟其他插件有冲突,所以换了这个。sinppets的插件有几个,这里有一个选取说明。这里有一个简单的使用简介。

vim-startify

https://github.com/mhinz/vim-startify

这个插件可以让你的vim启动的时候显示一个启动画面。十分方便。

vimshell.vim

https://github.com/Shougo/vimshell.vim

这是一个由vimscript编写成的shell壳。我一般用来将控制台的显示信息拷贝出来。另外也让你在windows下有一个比较好的shell体验。

vim-multiple-cursors

https://github.com/terryma/vim-multiple-cursors

让你的vim拥有类似sublime-text中的多位置同时编辑功能。我主要是用来重构代码,例如批量多出改变量名。

其他

其他的一些配置有:

快捷方式类:

"switch buffer
map <F1> :bp!<cr>
map <F2> :bn!<cr>
"switch tabs
nnoremap <leader>=  :tabnext<CR>
nnoremap <leader>-  :tabprev<CR>

"搜索时把当前结果置于屏幕中央并打开折叠
nnoremap n nzzzv
nnoremap N Nzzzv

"map ESC with jj
imap jj <ESC>

"Fast reloading of the .vimrc
nmap <silent> <leader>ss :source $MYVIMRC<cr>
"Fast editing of .vimrc
nmap <silent> <leader>ee :e $MYVIMRC<cr>
"When .vimrc is edited  , reload it
autocmd BufEnter * silent! lcd %:p:h

nnoremap ,cd :cd %:p:h<CR>:pwd<CR>
autocmd! bufwritepost .vimrc source ~/.vimrc

功能类

" insert word of the line above
inoremap <C-Y> <C-C>:let @z = @"<CR>mz
           \:exec 'normal!' (col('.')==1 && col('$')==1 ? 'k' : 'kl')<CR>
           \:exec (col('.')==col('$') - 1 ? 'let @" = @_' : 'normal! yw')<CR>
           \`zp:let @" = @z<CR>a

这个功能值得一提。出处在这里,当我们写多行很类似的代码时这个功能很有用。

最后

vim折腾的过程挺有趣的,折腾完以后总想着要用它来打点什么代码来玩玩。这就是“当你手上有一把锤子的时候,看所有的东西都是钉子;当你手上有个钉子的时候,看所有的东西都是锤子 ”么?