前言##
由于 Vim 的广泛流行,在网络上关于 Vim 的自定义配置汗牛充栋。既有高手 Tim Pope 的极简配置 tpope/vim-sensible(这个配置一个插件都没有),也有 spf13/spf13-vim 和 SpaceVim 这样大而全的配置。而对我来说,我喜欢简洁而优雅,一大堆 Plugin 堆砌起来的东西我固然不喜欢,但是一个插件都没有的极简配置那用起来也不太顺手。所以我必须得自己配。
自己配 Vim,必然涉及到 Plugin 的选型的问题。说到选型,那就有很多话要说了。首先是 Vim 自身版本的进步和功能的进步,目前 Vim 已经进入到 Vim 8 的时代,增加了不少新功能,比如异步啊、比如内置 Terminal 啊之类的。而且还有 NeoVim 和它抢饭碗。其次就是 Vim 插件的作者的理念发生了变化,他们逐渐瞧不上纯粹 VimScript 写的插件,毕竟纯 VimScript 写的插件功能比较有限,速度也不够快。目前的 Vim 插件有几个发展趋势:一是要充分利用异步的支持,二是往往使用某些后端提供更强大的功能支持,三是喜欢搞大而全的框架。下面我来逐一举例说明。
例如管理插件的插件,我以前一直都是用 Vundle,我觉得挺好用的。但是这几年又雨后春笋般的冒出了几种新的管理插件的插件,像 junegunn/vim-plug
和 Shougo/dein.vim,看一下它们的说明,无一例外都是说使用了并发技术,加快了插件的下载速度。
再例如 Vim 中的自动补全。其实 Vim 自身就支持补全功能,不过使用起来一点都不自动,需要使用 Ctrl+P
或者 Ctrl+X Ctrl+O
这样的快捷键才会调出补全功能。Vim 自身的补全功能支持 buffers 中的单词,也支持 dictionary 和 tags 中的条目。但是不管怎么说,都只是基于字面意义上的补全,不支持深层次的对编程语言的语义分析。但是可以用后端解决这个问题啊。像 Valloric/YouCompleteMe,在网络上的名声就是典型的难安装难配置,因为它需要使用 Clang 作为后端提供对 C/C++ 语义的支持,使用 Jedi 提供对 Python 的支持,使用 OmniSharp 提供对 C# 的支持,等等……。正是如此,使得我们若是想使用某些插件,还不得不在系统上安装 Clang、Python、Lua 这样的一些程序,比较复杂。
自动补全中还有大名鼎鼎的 Shougo/neocomplete.vim。但是我到 github 上一看,好家伙,居然说在 Vim 8 上建议就不要用了,要用就用 Shougo/deoplete.nvim。这也算是 Vim 版本的升级推动插件的升级吧,虽然怎么看怎么像这些插件倾向于 NeoVim 更多一点。而 deoplete 也只是一个自动补全的框架,它还是需要很多后端对编程语言的语义分析提供支持。看下面这个截图,这些都是 deoplete 所需要的后端:
再来一个例子,关于 Vim 中文件管理的,老牌的 NerdTree 不用说了吧,我用的挺舒服的。但现在流行的趋势是 vimfiler。然后我在 github 上一看,马上发现两个难题。一是 vimfiler 需要 unite.vim 支持,二是这个插件也不更新了,在 Vim 8 或者 NeoVim 的时代,请使用 Shougo/defx.nvim ,而且在 Defx 的文档中,赤裸裸地写明了,需要 Python 3.6.1+ 的支持。哦对了,必须提一下,Defx 我试用了,根本没配成功。
通过前面的介绍,发现这个 Shougo 还真是有点高产。前面提到的 unite.vim 也是他写的,而且又升级了。在 Vim 8 或 NeoVim 中建议使用 Shougo/denite.nvim。这里的 unite 和 denite 就是我前面说的大而全的框架,框架之下,需要别的更多的插件作为 source 来提供更多的功能,而这个框架,负责把控 Vim 的界面。
还有一个网红插件 Yggdroot/LeaderF,主要是为了取代经典的 ctrlp,而且其功能比 ctrlp 强大不少。这个倒是没有要求 Vim 8,不过还是要求 Python。值得一用。
鉴于以上提到的错综复杂的关系,以及我自身的强迫症,我决定还是回归经典。Vim 7 就能用多好,纯 VimScript 多好,不想整那后端这后端的。所以我还是使用 Vundle 管理插件,并选择了 5 到 6 个最常用的插件,其中一个还是 scheme,算不得真正的插件。唯一的升级,可能算是把 taglist 升级为 tagbar 了吧。另外,我还是选择了 ctrlp,没有选择 LeaderF。我觉得功能够用了。至于 tpope/vim-surround 、nerdcommenter 之类的,那就不要了吧,不要它们也多敲不了几下键盘,还可以省下学习成本。
必须得说明一下:怎么为 Vim 配插件还得看自己的需求。我主要是看文档和看代码,偶尔改改配置文件,有时还要在非 GUI 环境下改配置文件。就算写代码也只用 Vim 写非常简单的。所以我这个经典配置完全够用了,而且开箱即用,超级方便。至于需求比较复杂的,建议玩玩我前面提到的 SpaceVim 。
准备工作##
为了使用 Vim 自带的 tag 功能和按 tag 跳转功能,至少要安装 ctags。如果要阅读 Linux 的 Kernel 源代码,还得安装这个包,并解压缩。然后在 /usr/include
和 /usr/src/linux-source-4.15.0
目录中执行 ctags
命令生成 tags 文件。命令如下:
sudo apt install exuberant-ctags linux-source
cd /usr/src/
sudo tar jxvf linux-source-4.15.0.tar.bz2
cd linux-source-4.15.0
sudo ctags -R --c++-kinds=+p --fields=+ias --extra=+q
cd /usr/include
sudo ctags -R --c++-kinds=+p --fields=+ias --extra=+q
ctags 可不仅仅只支持 C/C++ 语言哦。使用如下命令,可以看到 ctags 支持很多语言的:
ctags --list-languages
我的 Vim 配置##
配置文件是 ~/.vimrc
。我的思路是使用 Vundle 管理插件,而且只选择了少量几个最常用的插件。加上空行,代码也只有 75 行,非常简洁。其内容如下:
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'majutsushi/tagbar'
Plugin 'kien/ctrlp.vim'
Plugin 'scrooloose/nerdtree'
Plugin 'vim-scripts/AutoComplPop'
Plugin 'vim-scripts/OmniCppComplete'
Plugin 'altercation/vim-colors-solarized'
call vundle#end()
filetype plugin indent on
set history=1000
set ruler
set number
set showcmd
set showmode
set laststatus=2
set cmdheight=2
set scrolloff=3
set fillchars=stl:\ ,stlnc:\ ,vert:\
set noerrorbells
set novisualbell
set t_vb=
syntax on
colorscheme desert
set background=dark
set cursorline
hi CursorLine term=NONE cterm=NONE ctermbg=0 guibg=Gray40
set backspace=2
set whichwrap+=<,>,h,l
set expandtab
set smarttab
set shiftwidth=4
set tabstop=4
set autoindent
set cindent
set nobackup
set noswapfile
set autoread
set autowrite
set autochdir
set fileencodings=utf-8
set fileformats=unix,dos,mac
set showmatch
set matchtime=2
set hlsearch
set incsearch
set ignorecase
set smartcase
set magic
set lazyredraw
set nowrapscan
set iskeyword+=_,$,@,%,#,-,.
if has("gui_running")
colorscheme solarized
set guifont=monospace\ 12
endif
set tags+=/usr/include/tags
map <F2> :NERDTreeToggle<CR>
map <F3> :TagbarToggle<CR>
map <F4> :CtrlPMixed<CR>
map <F12> :!ctags -R --c++-kinds=+p --fields=+ias --extra=+q -I<CR>
使用 Vundle 管理插件##
我选择的插件管理器是 Vundle。首先在主目录下建立 .vim/bundle
目录,然后进入该目录,使用 git
下载 Vundle。
mkdir ~/.vim
mkdir ~/.vim/bundle
cd ~/.vim/bundle
git clone https://github.com/VundleVim/Vundle.vim.git
配置方法见上面的第 3 到 14 行。然后启动 Vim,在其中输入 :PluginInstall
安装插件。
运行效果##
在使用过程中,按 F2 键调出 NerdTree,按 F3 键调出 Tagbar,按 F4 键调出 CtrlP。如果查看某个项目的代码,只需要进入该项目的目录后,按 F12 键,则自动生成该项目的 tags 文件。控制台下运行,是这个效果:
用 GVim 运行,是这个效果: