为什么写这篇文章
配置了两天的Vim,折腾到深夜,最后终于调整得比较满意。
效果图如下所示:
启动页:
工作时:
目录树:
主要功能有:
- vundle管理插件
- airline状态栏
- bufferline显示
- nerdtree文件树显示
- ctrlp快捷打开文档
- neocomplcache自动补全
- tagbar显示函数,变量列表
- ultisnips快捷方式
- vimshell vim下的shell
- vim-multiple-cursors 类似sublime的多位置同时编辑
我的Vim配置
vimrc文件可以看这里:
下面主要介绍一下几个主要的plugin的折腾过程。
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
这是一个什么插件呢?简单地说,就是让某些插件可以在后台干活(例如生成缓存,扫描文件夹),不会卡住vim的界面。另外,VimShell这个插件也依赖于这个包。
最麻烦的是vimproc要手动编译库文件,如果在windows下进行,要安装MinGW或者Cygwin,具体看plugin的README文件。
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
这个插件如果不做任何修改的话,还是可以一用的,但是会有很多不便之处,特别是在多tab同步工作的时候。
这个插件:vim-nerdtree-tabs可以令多tab的情况下nredtree同步显示同一个目录树。
ctrlp
就像sublime text中的ctrl-p一样,可以fuzzy地查找文件,神器。不过第一次打开时会有点慢,应该是正在生成索引的原因吧。
我的配置如下:
""""""""""""""""""""""""""""""
" Ctrlp setting
""""""""""""""""""""""""""""""
nnoremap <silent> <leader>h :CtrlPMRU<cr>
nnoremap <silent> <leader>p :CtrlP<cr>
推荐加入历史查找功能,这样子可以替代其他与history有关的plugin了
neocomplcache
尝试了好几个自动补全的插件,但是都太重了,依赖了很多其他的库。这个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
这是一个静态语法检查的插件,每次保存的时候它就会检查你的语法是否有错误,比较轻型,推荐。
我的配置如下:
""""""""""""""""""""""""""""""
" Syntastic setting
""""""""""""""""""""""""""""""
let g:syntastic_check_on_open=1
注意的是,如果没有安装vimproc,那么开启了上面的选项以后,打开大一点的源代码时会卡住一阵子。
tagbar
网上很多地方推荐用taglist,但是taglist太久没更新了。于是看到了这个后继者tagbar。感觉还可以。
我的配置如下:
""""""""""""""""""""""""""""""
" Tagbar setting
""""""""""""""""""""""""""""""
nmap <F4> :TagbarToggle<CR>
ultisnips
一开始用的是snipsMate,但是跟其他插件有冲突,所以换了这个。sinppets的插件有几个,这里有一个选取说明。这里有一个简单的使用简介。
vim-startify
这个插件可以让你的vim启动的时候显示一个启动画面。十分方便。
vimshell.vim
这是一个由vimscript编写成的shell壳。我一般用来将控制台的显示信息拷贝出来。另外也让你在windows下有一个比较好的shell体验。
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折腾的过程挺有趣的,折腾完以后总想着要用它来打点什么代码来玩玩。这就是“当你手上有一把锤子的时候,看所有的东西都是钉子;当你手上有个钉子的时候,看所有的东西都是锤子 ”么?