你看的懂的vim定制指南

前几天突然心血来潮,想把经常用的vim弄的漂亮一些,之前就经常看到有把vim作为IDE来用的文章,但是大多是复制别人的配置,也不解释如何做到,让人很没有安全感。于是我从最基本的需求开始,一步一步定制了具备我喜欢的风格,常用功能的快捷键,以及python和javascipt的补全和错误检查,基本满足了日常的需求。这里把改造过程记录下来,供有需求的同学借鉴。

我这里的环境是Ubuntu 16.04, vim 8.0。

基本设置

建议大家不要直接使用别人配置好的版本,因为很多东西都是你不需要的,而且要它设置的快捷键可能并不是你最喜欢的。所以这里我们从白板的vim8.0开始。

vim8.0是去年出的新版本,可能是受了neovim的刺激,vim才有了十年内的第一个Major release.果然竞争有利于创新啊。

可以通过添加下面的源来下载最新版本的vim:

1
2
3
sudo add-apt-repository ppa:jonathonf/vim
sudo update
sudo apt-get install vim

下载之后,我们要做的第一件事情就是做基本设置。我分成了几个小部分。

  • 背景颜色和字体
  • 空格和Tab
  • 搜索
  • Leader键及常用快捷键
  • 其他

所有的设置都是在写在~/.vimrc里面,这是vim启动会自动读取的配置文件。如果你的机器上没有这个文件,可以自己创建一个。

很多人喜欢把终端的颜色弄成黑色或者深色,但是作为喜欢性冷淡风的我,首先就把背景弄成白色,然后把字体调成我喜欢的Source Code Pro, 窃以为这是最适合代码编辑的字体,中文显示也不错。然后字体宽度设置成semibold,也就是中等粗体,字体大小调成10号,最后显示出来就是前面截图中的样子了。这个调整是通过终端的设置选项完成的。

具体操作是:terminal–>preferences–>profiles–>edit–>general–>custom font>>Source Code Pro Semibold 10

color and font

1
2
set softtabstop=4  " number of spaces in tab when editing
set expandtab " tabs are spaces

在编码的习惯中,有一个话题是经常被拿出来讨论,那就缩进的时候到底是用空格还是Tab键,当在我看来,这没什么所谓,反正我是习惯用tab,因为实在懒得按那么多此空格键,但是为了在不同的及其和编辑器中你的代码不会出现缩进乱掉的情况,我们还是把vim中的Tab换成四个空格比较好(如果你喜欢两个或者八个也请按自己的习惯)。

对于python代码,有更详细一点的设置:

1
2
3
4
5
6
7
8
au BufNewFile,BufRead *.py
\ set tabstop=4 |
\ set softtabstop=4 |
\ set shiftwidth=4 |
\ set textwidth=79 |
\ set expandtab |
\ set autoindent |
\ set fileformat=unix

tabstop的意思是制表符等价于四个空格,vim默认的好像是8个空格,softtabstop的意思是,当我们按下Tab健的时候插入对应个数的空格,但是会按照tabstop的数值转换哼制表符和剩余个数的空格。比如如果我们这里设置softtabstop是6,那么当我们按下Tab时,就会插入一个制表符和两个空格。shiftwidth是表示自动缩进时所使用的空白长度。expandtab表示把所有的制表符都转变成空格,这样我们每次按下tab,都是插入的四个空格。

textwidth=79表示一行最多79个字符,autoindent表示程序自动缩进,fileformat=unix表示按照unix的文件格式存储。

1
2
3
set showmatch           " highlight matching [{()}]
set incsearch " search as characters are entered
set hlsearch " highlight matches

showmatch表示如果光标移动到了成对出现的括号会将对应的另一半也高亮,这对于经常因为少了一个括号debug半天的童鞋来说还是很实在的。incsearch表示搜索的时候根据你键入的字符实时更新搜索结果,因为有时候只需要输入部分字符自己想要的单词就出来了。hlsearch表示高亮搜索结果,这里有一个问题是,搜索结束之后高亮会一直存在,如何关闭高亮会在后面急那个到。

vim中有一些常用的功能快捷键是不太方便的,我们可以定义一个leader键来统一那些不太方便的快捷键或者命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
let mapleader=","       " leader is comma
" keymap settings
" jo is escape
inoremap jo <esc>
" move to beginning/end of line
nnoremap B ^
nnoremap E $
nnoremap ,<space> :nohlsearch<CR> " ,<space> to close search hilight
nnoremap j gj
nnoremap k gk
nnoremap <leader>ev :vsp $MYVIMRC<CR>
nnoremap <leader>ez :vsp ~/.zshrc<CR>
nnoremap <leader>sv :source $MYVIMRC<CR>
nnoremap <leader>w <C-W><C-K>
nnoremap <leader>s <C-W><C-J>
nnoremap <leader>a <C-W><C-h>
nnoremap <leader>d <C-W><C-l>
nnoremap <leader>v :sp<CR>
nnoremap <leader>h :vs<CR>
nnoremap <leader>q <C-W>q
nnoremap <leader>e :e

我这里是把leader键设置成了逗号键,也可以设置成空格键,都在比较好按的位置,inoremap jo <esc>的意思是用jo代替esc键,因为一般键盘上esc都是在比较远的位置,不适合作为这么常用的键,有一个问题是党你真的想要输入jo这样的字符组合的时候,你要放慢速度依次按下j和o,不过这样的情况很少见。

另外,^$也是两个位置极其不好按的键,我们把他们改成BE

接下来的一行就是将,<space>映射成取消高亮搜索结果。

再下来的两行nnoremap j gjnnremap k gk的作用是当某一行太长显示成多行的时候,我们希望上下移动时是以显示的行为单位。

接下在的三行是简化了平常经常用的编辑vim配置文件和zsh配置文件的按键操作。

再下来的四行是用<leader>w, <leader>s, <leader>a, <leader>d,来在窗口之间进行上下左右的移动。

<leader>v<leader>h分别是竖直和水平分屏。

最后两行是关闭当前窗口和编辑文件。

最后是一些我不知道归到哪一类的配置,我们就叫其他配置好了。

1
2
3
4
5
6
7
8
" basic config
set nocompatible " close compatible mode
filetype plugin on " load filetype-specific plugin
filetype indent on " load filetype-specific indent files
set relativenumber " show relative line number
set cursorline " highlight current line
set wildmenu " visual autocomplete for command menu
set lazyredraw " redraw only when we need to.

这些配置的基本含义我已经写在注释里,有几项还要具体解释一下。

set nocompatible是为了关闭vim处于历史兼容型的考虑而设置的vi模式。而我们一般是不需要的。
set relativenumber是显示相对行号,对于复制和删除等操作比较方便。
set wildmenu是在命令烂补全的时候显示所有可补全项,比如我们在:e <TAB>的时候,就会显示出所有文件或目录。
lazyredraw是出于性能考虑,避免能不必要的重绘。

插件安装和配置

vim要好用还依赖于大量的插件,我这里只提到了我会有需求用到的,如果大家还知道不错的插件,可以留言给我。

第一步我们要安装vim的插件管理器vim-plug,vim的插件管理器很多,我选择目前比较流行的一个,如果你用其他的也没关系,熟手就好。

安装命令如下

1
2
3
mkdir ~/.vim
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

安装完之后,我们在根目录创建一个.vim.plug文件,用来放插件相关的代码。然后在~/.vimrc中加入下面的代码:

1
2
3
4
" use vim plug vim file
if filereadable(expand("~/.vimrc.plug"))
source ~/.vimrc.plug
endif

然后在.vim-plug中加入下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
call plug#begin('~/.vim/plugged')

" List of plugins
Plug 'ctrlpvim/ctrlp.vim'
Plug 'itchyny/lightline.vim'
Plug 'flazz/vim-colorschemes'
Plug 'mbbill/undotree'
Plug 'rking/ag.vim'
Plug 'scrooloose/nerdtree'
Plug 'scrooloose/nerdcommenter'
# Plug 'vim-syntastic/syntastic'
Plug 'w0rp/ale'
Plug 'pangloss/vim-javascript'
Plug 'Valloric/YouCompleteMe'
Plug 'ternjs/tern_for_vim'
Plug 'nvie/vim-flake8'

call plug#end()

保存该文件 并source一下~/.vimrc。然后用:PlugInstall下载所有插件。

下面依次简要介绍一下我用的插件。

Ctrlp

ctrlp 是vim中必不可少的一个插件,特别是如果你之前用过sublime的话。这个插件可以用来模糊搜索项目中的文件,或者已经打开的buffer。下面是针对ctrlp的配置。

1
2
3
4
5
nnoremap <leader>p  :CtrlP<CR>
nnoremap <leader>b :CtrlPBuffer<CR>
let g:ctrlp_match_window = 'bottom,order:ttb'
let g:ctrlp_switch_buffer = 0
let g:ctrlp_working_path_mode = ''

前两行是表示用,p来快速搜索文件,,b来快速搜索buffer。

第三行的意思是将匹配结果在最下方按从上到下的顺序显示。
第四行的意思是在当前panel中打开选中的文件。
最后一行的意思是,只在当前目录中搜索。

其他选项可以通过:h ctrlp-options查看。

一般的工作流是,用:cd [DIR]切换到我们要工作的项目目录,然后在使用ctrlp打开相应的文件,如果直接使用的话,默认目录是根目录,如果你的机器上文件很多,vim就会卡死。

参考效果图:

ctrlp.png

lightline

lightline作用就是在vim底部放一个显示文件名啊,编辑模式啊等等信息的状态栏,其实主要是为了美化作用。

我的配置是:

1
2
3
4
5
6
7
8
9
10
11
12
let g:lightline = {
\ 'colorscheme': 'wombat',
\ 'active': {
\ 'left': [ [ 'mode', 'paste' ],
\ [ 'readonly', 'filename', 'modified', 'helloworld' ] ]
\ },
\ 'component': {
\ 'helloworld': 'I am writing shit...'
\ },
\ }

set laststatus=2

设置的选项参考项目主页,我这里主要设置了一个配色方案是wombat,依然走的是性冷淡风。然后添加了一个组件,写了一行文字,效果可以参见下图。至于为什么set laststatus=2,项目主页上有。

lightline.png

vim-colorschemas

默认的配色其实也挺好看的,但是看多了也就有点腻,vim-colorschemas自带N种配色方案供你选择,不过去我觉得符合我审美的的并不多,目前在用的是hemisu,效果在之前的截图可以看到。要设置配色方案,只需要加上下面一句即可:

1
colorscheme hemisu

undotree

很多时候我们会误操作导致删除了什么重要的东西,但是又还没来得及提交到git,这个时候就可以用undotree来动态回滚到之前的每一个操作。

下面是效果图:

undotree.png

ag.vim

用linux的童鞋大概都用过grep来查找特定的单词,在编码的过程中,我们经常会需要查找某个函数后者某个变量的位置,但是大多数时候我们都不会记得是在哪个文件,这个时候,就需要一个插件能够在项目文件中查找你想要的单词。

Ag.vim就是用来完成这个工作的,搜索的命令是::Ag [options] {pattern} [{directory}],大多数时候我们都不需要用正则表达式,而只是需要搜索一个简单的单词,比如我们现在有一个叫xweb项目,我们想要在里面搜索import关键字,只需要用命令:Ag import。结果如下图:

Ag.png

另外,我们可以用快捷键简化操作:

1
nnoremap <leader>g  :Ag<space>

Nerdtree

一般编辑器左侧都会有一个文件目录,切换文件也是用鼠标点击对应文件,在vim中其实我们是不需要目录树的,因为根本用不到鼠标…但是出于美观的考虑,我们可以Nerdtree添加这个功能。

效果如下:

nerdtree

Nerdcommenter

如果你把vim作为很多语言的编辑器,那么注释就成了一个麻烦,因为不同语言有不同的注释语法,而nerdcommenter插件就能帮助我们一键轻松注释任何语言的代码片段。

最常用的两个快捷键是:[count]<leader>cc, [count]<leader>c<space>,命令中的count是指从光标所在行之后的行数,,也可以用visual模式选中,不提供count这个参数。

python补全和错误检查

平时我最常用的语言就是Python和javascript,因此我这里就介绍一下如何在vim中对python补全和错误检查。

补全的话就要安装可以和IDE的补全效果匹敌的YouCompleteMe了,前面已经安装过,我们只需要做一些配置即可。

1
2
3
4
let g:ycm_python_binary_path = 'python'
nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>
nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>

第一行配置的意思是指定python的位置,这里写python的目的是在使用虚环境的时候python版本也是对应版本。

后面三行是跳转到声明,跳转到定义,跳转到定义或者声明的快捷键。

下面是补全的效果图,至于跳转需要Gif展示,我这里就不放出来了。

complete.png

接下来是语法检查,首先安装插件Syntastic,该插件为多种语言提供语法检查前端,然后安装python的语法检查后端插件,你可以根据自己的需求安装多种后端,我这里安装的是vim-flake8

安装好之后,打开python文件就会弹出不符合规范的错误列表。效果图如下:

flake.png

如果你的屏幕比较小,不希望localtion list总是出现,你可以定义快捷键调节其显示和关闭状态。

1
2
nnoremap <leader>l  :lclose<CR>
nnoremap <leader>L :Errors<CR>

Javascript补全和语法检查

前面我们已经安装了YCM,要对javascript补全, 只需要安装tern_for_vim插件即可,(用tern作为补全引擎)。

我们可以打开vuejs的源代码试一试,效果图如下:

tern.png

语法检查的话类似于python,我们需要配置使用哪一种javascript语法检查的后端,不同于python的是,我们的后端不需要下载,因为现在集合每个项目都会在node_modules中下载语法检查的包,我们直接使用即可。在配置文件中,我们需要声明使用哪种检查器,你可以根据你的实际情况来,我这里使用的是比较流行的eslint

~~然后增加一个开始检查的命令。即配置如下:

1
2
let g:syntastic_javascript_checkers=['eslint']
let $PATH .= ':/home/liadbiz/.nvm/versions/node/v8.1.3/bin:/usr/local/bin:/opt/node-v6.9.2-linux-x64/bin'

第二行是因为vim中的$PATH变量里面没有我的Eslint所在路径,所以在这里加上。

~~
我们可以在vue项目源码中测试一下,效果图如下:

eslint.png

最后

到这里我们的vim就差不多是一个功能比较齐全的IDE了,而且重点是,可以完全不用鼠标操作,既避免了鼠标手,又提高了效率。

如果有什么疑问,欢迎留言~~

更新日志

将syntastic替换为ale. 2018-4-22

使用systastic为python做错误检查的时候发现每次保存文件都很慢,google发现了另一个类似的插件ale,支持vim8的异步特性,使用该插件只需要在~/.vimrc.plug中加入:

1
Plug 'w0rp/ale'

然后在~/.vimrc中增加配置:

1
2
3
4
5
6
7
8
9
" ale settings
"let g:ale_set_loclist = 0
let g:ale_set_quickfix = 1
let g:ale_open_list = 1
" python checker
let g:ale_fixers = {
\ 'javascript': ['standard'],
\ 'python': ['pylint']
\}

使用效果如下图,个人感觉体验要比syntastic好很多。

ale.gif

重新换了一个配色, 估计不久又会换。

将ctrlp换成LeaderF。 新添加了几个小插件。 2018-6-4

这一段时间加上了几个提高效率的小插件然后将Ctrlp换成了LeaderF,渐渐发现配置文件中的代码已经变得很多了,为了更好的扩展,我加上了代码折叠的设置。即在~/.vimrc中添加:

1
2
3
4
5
6
" {{{
augroup filetype_vim
autocmd!
autocmd FileType vim setlocal foldmethod=marker
augroup END
" }}}

然后在同一个插件或者同一类型的配置前后加上上面类似的注释,这样再按za就可以把这部分配置折叠起来。这样结构就会变得很清晰。

下面在讲一下我具体更新了什么内容。

逛知乎从韦易笑的答案发现一个看上去比ctrlp好用搜索文件的插件,于是试了试,发现确实不错。

安装的话直接在~/.vim.plug里添加一行

1
Plug 'Yggdroot/LeaderF', { 'do': './install.sh' }

然后:PlugInstall。根据自己的需要设置快捷键如下:

1
2
noremap <leader>r :LeaderfMru<cr>
noremap <leader>m :LeaderfFunction!<cr>

第一个是搜索最近打开的文件,这个对我来说很有用,因为我经常不止在一个项目目录编辑文件。第二个是显示所有函数,这个也还有点用处,一般我如果记得函数名是什么的话就直接搜索了,如果不记得函数名的话这个还是挺有用的。然后默认的两个快捷键<leader>f<leader>b分别是搜索项目内文件和打开过的buffer。

添加了一个myusuf3/numbers.vim插件,作用是在命令模式下显示当前行绝对行号,当然,相对行号也不影响,处在编辑模式下就显示绝对行号,还是有点用,有时候需要看当前行的行号。

添加了一个Valloric/ListToggle插件,作用是togglequickfix window或者location list,因为装了语法检查的插件,但是有时候并不想看到错误列表,因此安装了这个插件来随时隐藏或者调出错误列表。

添加了airblade/vim-gitgutter插件,作用是显示git状态,这个可以说是比较有用了,我经常会忘了我改了什么东西。

添加了jiangmiao/auto-pair插件,作用是自动闭合括号,在写代码的时候,不管是什么语言,括号都是成对出现的,所以自动闭合括号可以说是很贴心了。

添加了几个插件。 2019-2-20

无意间看到一个视频,讲到几个实用的插件。

分别是:

  • tpope/vim-repeat
  • vim-scripts/ReplaceWithRegister
  • christoomey/vim-titlecase
  • kana/vim-textobj-user
  • kana/vim-textobj-indent
  • kana/vim-textobj-entire
  • kana/vim-textobj-line

具体作用大家可以去github上相应的项目主页上去看。

有钱的捧个钱场,没钱的捧个人场