Vim 是一款主要流行于 Unix\Linux 以及 类 Linux 系统上的强大的编辑器,另外一款可以称之为强大的编辑器是 Emacs,这两款编辑器广泛流行于程序员群体,关于谁是编辑器之王的争论经久不息。Vim 的功能虽然强大,但是作为一款古老的编辑器1,也不是没有缺点,随着 Vim 代码量的增加,维护起来也非常困难,不利于快速增加新功能,它的主要开发者目前只有一个,Bram Moolenaar,不符合当今开源社区的操作习惯。为了克服 Vim 的这些缺点,保留 Vim 的优点(兼容 Vim),让 Vim 的开发能有更快的迭代速度,Neovim 项目诞生了。本文介绍如何安装 Neovim 并配置 Python 开发环境(在以下叙述中,Neovim 和 Nvim 含义相同)。

安装 Nvim

Neovim 有针对 Linux 系统统一的 appimage 格式的可执行文件,可以直接从 Neovim GitHub 主页下载。

下载以后,先赋予文件可执行权限,

chmod u+x nvim.appimage

为了方便使用,可以在 Neovim 的目录下建立软链接,用 nvim 来作为该可执行文件的外部名称:

ln -s nvim.appimage nvim

接下来,我们需要将 Neovim 的安装目录加入到系统的 $PATH 变量,编辑 .bash_profile 文件,把 Neovim 的安装目录(假设为 /home/haojiedong/tools/nvim)加入到$PATH变量:

export PATH=$HOME/tools/nvim:$PATH

保存文件,然后 source .bash_profile,使得更改生效。

至此,Neovim 的安装完成。这样设置以后,在命令行使用 nvim 即可打开 Neovim。

Nvim 的配置文件

Neovim 使用的配置文件和 Vim 不同。需要在 ~/.config/nvim/ 目录下创建文件 init.vim ,该文件就是 Neovim 的配置文件,Neovim 所有的配置都可以放入其中。

Neovim 和 Vim 的很多配置都是相同的,如果之前使用过 Vim,可以把之前的配置的大部分拷贝过来使用,关于 Neovim 和 Vim 的不同,可以参见这里

使用插件管理器 vim-plug

Vim 之所以强大,一个很重要的原因是有很多插件,这些插件可以实现各种各样的功能。如果安装插件很多,插件管理成为一个麻烦的问题。Neovim 和 Vim 一样,并没有自带插件管理器,我们需要自己安装插件管理器。经过搜索和比较,发现有两款比较有名的插件管理器在 Nvim 用户中流行,分别是 deinvim-plug. Vim-plug 的 user base 更大,最后我决定安装 vim-plug,以下为 vim-plug 安装以及简单的使用说明。

vim-plug 安装

  1. 安装 vim-plug 这个插件本身,运行以下命令安装:
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

安装 vim-plug 以后,可能需要退出 Nvim 重新进入。

  1. 编辑 init.vim 文件,在该文件中加入 vim-plug 配置部分,以下为一个示例配置(改编自 vim-plug GitHub 主页,见这里):
call plug#begin('~/.local/share/nvim/plugged')

call plug#end()

之后所有其它插件的安装都要放在两个 call 命令之间,下面不再赘述。

vim-plug 使用

以下命令均在 Nvim 命令模式下使用

  • 安装插件::PlugInstall
  • 更新插件::PlugUpdate
  • 查看插件状态::PlugStatus
  • 升级 vim-plug::PlugUpgrade

删除插件

首先在 init.vim 中,注释掉该插件,然后打开 Nvim,使用 :PlugClean 命令清除该插件。

暂时禁用某个插件

如果想暂时禁用某个插件,但是不删除它,有两种方式。

  1. 在 inti.vim 中注释掉该插件,重新打开 Nvim 即可
  2. 参考这里给出的解决方法,如果要禁用插件 foo/bar,使用如下设置 bash Plug 'foo/bar', { 'on': [] }

常用插件安装与配置

自动补全插件 deoplete 安装

deoplete 是一款自动补全插件,官方对它的描述为:

Deoplete is the abbreviation of “dark powered neo-completion”. It provides an extensible and asynchronous completion framework for neovim/Vim8.

准确来说,它是一款自动补全的引擎,具体对某种编程语言的的支持,要加入对应的 source 才能真正工作.

deoplete 安装相对简单,在 vim-plug 的设置里加入以下配置(也就是两个 call 语句之间):

if has('nvim')
  Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
  Plug 'Shougo/deoplete.nvim'
  Plug 'roxma/nvim-yarp'
  Plug 'roxma/vim-hug-neovim-rpc'
endif

关于 deoplete 的配置,官方并未在 GitHub 主页多说,只给出了一个配置选项:

let g:deoplete#enable_at_startup = 1

更多选项以及它们的含义,可以在 Nvim 中输入 :h deoplete-options 查看。

如前面所说,deoplete 对不同编程语言的支持需要安装不同的 source,下面给出 Python 语言的 source 配置,供参考。

安装 deoplete-jedi

Deoplete-jedi 是和 deoplete 配合使用的 Python source。安装以及配置步骤如下:

  1. 需要安装的其他库 首先,我们需要安装 python-client
pip install neovim

接着,安装 jedi. 如果你安装了最新的 Anaconda Python 发行版,jedi 已经安装了。否则,采用 pip 安装即可,

pip install jedi
  1. 安装与配置 deoplete-jedi 插件

编辑 Nvim 的配置文件 init.vim,在 vim-plugin 部分,加入以下命令:

Plug 'zchee/deoplete-jedi'

然后安装 deoplete-jedi,如果没有问题,现在你已经可以使用自动补全了!使用 Nvim 打开一个 Python 源文件,试着编辑一下,你会看到类似下图的自动补全菜单:

Deoplete 的使用

  1. 如何在自动补全给出的函数或者类的列表中上下移动选择? 参考这里 的答案,可以使用 Ctrl + N 以及 Ctrl + P 在列表项目中进行切换。

  2. 函数方法 Preview 的窗口如何自动关闭? 在自动补全给出的列表中移动的时候,Nvim 的上半部分会出现一个很小的窗口,提示当前方法的参数,但是该窗口在自动补全完成后并不能自动消失,参考 https://goo.gl/Bn5n39,可以使用下面的设置使得窗口自动消失:

autocmd InsertLeave,CompleteDone * if pumvisible() == 0 | pclose | endif
  1. preview 窗口的可以设为在当前窗口下面打开吗? 默认 preview 窗口在上面打开,可以通过 set splitbelow 使新建立的窗口位于当前窗口下面,参见这里

  2. 如何设定为使用 Tab 键在自动补全的列表跳转? 在 Nvim 的配置中,加入如下设置即可:

inoremap <expr><tab> pumvisible() ? "\<c-n>" : "\<tab>" 

状态栏插件 vim-airline

原生的 Nvim 状态栏比较简单,不像 Sublime Text 那样,状态栏可以显示很多信息。有一款不错的插件 vim-airline 可以实现类似 Sublime Text 的功能。在 vim-plugin 安装区加入以下命令:

Plug 'vim-airline/vim-airline'

然后运行 PlugInstall 即可安装该插件,重启 Nvim 可以看到更新后的状态栏。

切换 vim-airline 主题

vim-airline 提供了很多主题,来个性化状态栏,不同主题的样子可以参见这里的截图。更改 vim-airline 主题方式很简单首先安装插件 vim-airlinetheme:

Plug 'vim-airline/vim-airline-themes'

然后,在 Nvim 配置文件中,加入以下设置,

let g:airline_theme='<theme>' " <theme> 代表某个主题的名称

自动引号&括号补全

输入引号,括号时,经常希望能够自动输入一对,原始的 Nvim 不支持这样的功能,可以使用 vim-surround 插件帮助我们实现这样的功能。插件安装:

Plug 'tpope/vim-surround'

使用方法

以引号输入为例,说明如何使用这个插件。按下 ",会自动变成双引号"",此时光标位于双引号的中间,等待插入文本,文本插入结束以后,通常我们希望把光标置于右边引号的后面,此时,再按一次 ",光标就会跳转到右边引号的后面,等待我们继续输入文本。

如果想要删除包含文本的一对引号/括号,可以使用 ds<delimiter> 来删除<delimiter> 代表具体要删除的符号)。

注释插件

不同编程语言中注释的表示都不尽相同,如果能够根据当前编辑文件对应的编程语言自动选择合适的注释符号,将是极好的。nerdcommenter 就是这样一款插件。安装插件:

Plug 'scrooloose/nerdcommenter'

注释单行,使用 <leader>cc,其中 leader 是在 Nvim 中设置的前导按键(Nvim 中默认为 /);如果要反注释,使用 <leader>cu。更多具体使用方法可以参考插件的文档

代码自动 format 插件

neoformat 可以对源代码自动 format。安装:

Plug 'sbdchd/neoformat'

对于 Python 代码,neoformat 需要配合 Python 的自动格式化工具(称为 formatter)来使用,这里以 yapf 为例说明,首先安装该格式化工具:

pip install yapf

然后,neoformat 在格式化 Python 代码的时候就可以使用 yapf formatter 了。

如何格式化代码?命令模式下,输入 :Neoformat,该插件会对源代码进行自动 format。还有一款vim-autoformat,也可以尝试一下。

如果 neoformat 没有检测到文件类型,或者没有插件,也可以设置以下命令,让 neoformat 对文件做简单的 format:

" Enable alignment
let g:neoformat_basic_format_align = 1

" Enable tab to spaces conversion
let g:neoformat_basic_format_retab = 1

" Enable trimmming of trailing whitespace
let g:neoformat_basic_format_trim = 1

代码跳转(go-to)插件

我们经常需要跳转到类,方法等的定义,查看实现细节,可以使用 jedi-vim 实现,实际上,jedi-vim 还可以进行 Python 代码的自动补全,但是由于我们已经安装了 deoplete 和 deoplete-jedi 进行自动补全,所以将 jedi-vim 的自动补全功能关闭,只使用代码跳转功能。

安装:

Plug 'davidhalter/jedi-vim'

jedi-vim 配置如下,

" disable autocompletion, cause we use deoplete for completion
let g:jedi#completions_enabled = 0

" open the go-to function in split, not another buffer 
let g:jedi#use_splits_not_buffers = "right" 

使用

  • <leader>d: go to definition
  • K: check documentation of class or method
  • <leader>n: show the usage of a name in current file
  • <leader>r: rename a name

文件浏览插件 nerdtree

使用过 GUI 代码编辑器的人都知道,编辑器左边一般是项目文件浏览窗口,在 Nvim 中如何实现这一功能呢?可以安装 nerdtree 来实现。安装:

Plug 'scrooloose/nerdtree' 

简单使用

  1. 如何打开 nerdtree 文件浏览窗口? 直接在命令模式输入:NERDTree 即可打开当前编辑文件所在的目录。

  2. 如何在文件窗口与 file explorer 窗口切换? 按住 Ctrl, 双击 w 可以在两个窗口之间切换。

  3. 如何打开 file explorer 中某个文件? 把光标移动到该文件,然后按 o,即可在右边窗口打开该文件。

  4. 如何退出 file explorer 窗口? 在该窗口直接按 q 即可退出。

更多个性化设置,可以参考这篇

代码检查工具

Neomake 是为 Nvim 做的一款代码语法检查和 自动化 make 工具。安装:

Plug 'neomake/neomake'

Neomake 对不同编程语言的检查依赖各种 linter,安装 Neomake 以后,针对要使用的编程语言,我们还需要安装对应的 linter。各种编程语言支持的 linter 列表见这里

对于 Python,我们可以使用 pylint 作为 linter。直接使用 pip 或 conda 安装 pylint:

conda install pylint

安装 pylint 以后,在 init.vim 中指定使用它作为 Pyhton 代码检查器

let g:neomake_python_enabled_makers = ['pylint']

代码检查

命令模式下,使用 :Neomake 命令检查代码正确性。或者也可以设置自动检查,在 Nvim 配置文件中,加入以下设置:

call neomake#configure#automake('nrwi', 500)

多点编辑插件 vim-multiple-cursors

使用过 Sublime Text 的人应该都对 Sublime Text 中多点编辑功能爱不释手,这个功能对于代码重构非常实用,如何在 Nvim 中使用类似的功能呢?可以借助于 vim-multiple-cursors 插件。安装:

Plug 'terryma/vim-multiple-cursors'

简单使用

命令模式下,首先把光标移动到要重命名的变量处,然后开始按 Ctrl + N,可以看到变量被高亮,继续按 Ctrl + N,变量下一个出现的地方被高亮显示,如果要跳过某个位置该变量的出现(例如,字符串中也可能包含与该变量名相同的子字符串),在该处被高亮以后,再按 Ctrl + X 取消即可,不断选中变量的出现位置,直到所有想要选中的位置均选中完毕。

此时,按下 cc 在 Nvim 中代表 *change*),进入编辑模式,输入变量新的名称,保存即可。更多使用方法,请参考该插件的文档。

参考

高亮显示复制区域

Nvim 中,使用 y 复制文本以后,不会提示复制了哪些文本,除非使用者非常熟悉 Nvim 按键,否则可能会复制错误。vim-highlightedyank 这款插件可以在复制(yank)文本以后高亮提示哪些文本被复制了,非常实用。安装:

Plug 'machakann/vim-highlightedyank'

通常情况下,安装插件以后不需要做任何设置即可使用,但是对于某些主题,高亮的颜色可能看不清楚,可以在 Nvim 设置中加入以下命令:

hi HighlightedyankRegion cterm=reverse gui=reverse

如果觉得高亮显示的时间太短,可以设置增加高亮显示的时间(单位为毫秒):

let g:highlightedyank_highlight_duration = 1000 " 高亮持续时间为 1000 毫秒

代码折叠插件

对于很长的代码,折叠代码有助于理清代码整体结构。SimplyFold 是一款不错代码折叠插件。安装:

Plug 'tmhedberg/SimpylFold'

安装以后不用进行设置,开箱即用。

简单使用

  • zo: 打开光标处的 fold
  • zO: 递归打开光标处所有 fold
  • zc: 关闭光标处 fold
  • zC: 关闭光标处所有 fold

主题安装与配置

Before we begin

Neovim 自带了几款主题(colorscheme),你可能不喜欢,想要安装个性化主题。安装主题相对比较简单,但是,某些 SSH 程序对颜色的支持似乎有问题,导致主题安装以后,并不能很好工作。经过试用多款 Windows 系统下的 SSH 软件,最终发现 ZOC 最好用。更多的 SSH 软件,可以参考这里给出的支持 true color 的 SSH 客户端。

主题安装介绍

gruvbox 是一款 Vim 主题。在 vim-plug 安装插件部分,加入以下指令:

Plug 'morhetz/gruvbox'

运行 :PlugInstall 安装该主题。

在 Nvim 配置文件中加入

colorscheme gruvbox

即可启用该主题,主题有两个模式,分别为 darklight,可以使用下面的命令进行切换:

set background=dark " 或者 set background=light

重启 Nvim,你将会看到主题的变化。

更改显示字体(font)

Nvim 会自动使用 ssh 客户端设置的字体,所以在客户端设置字体即可。一些比较不错的编程字体有:

内置 terminal

Neovim 原生支持 terminal,内置了 terminal emulator,可以直接在 Neovim 内运行 shell,对于一些临时的 shell 操作非常方便。打开的方式为在命令模式下输入 :terminal 或者输入 vnew term://bash(表示在水平方向再打开一个 bash shell) 或者 new term://bash(在垂直方向打开一个 bash shell)。

进入 terminal 后,默认是命令状态,不能输入文字,按 i 开始输入命令。如何退出 terminal window 的插入状态?按 <Ctrl+\><Ctrl+N>

要退出 terminal 窗口,输入 exit 即可,此时 terminal 的窗口将关闭。

Neovim 与 Vim 的不同

支持 bracketed paste mode

Neovim 官方文档指出 Neovim 支持 bracketed paste mode,因此 Vim 中的 paste 选项已经过时了,在 Neovim 中 使用 h: paste,可以看到如下的说明:

This option is obsolete; bracketed-paste-mode is built-in.

Neovim is all nocompatible

在 Neovim 界面,使用 :h compatible,给出的信息可以看到,

Nvim is always “nocompatible”

Trouble shooting

Nvim colorscheme does not look normal inside Tmux

If your terminal supports true color, first install the latest version of tmux, add the following config to ~/.tmux.conf (extracted from here)

set -g default-terminal "screen-256color"  

Then the color should be fine.

Otherwise, in the Nvim config file init.vim, use the following setting instead:

set notermguicolors

Also, there are some discussions here.

How do I get a log file when starting Neovim

Use nvim -VNUMnvim.log. NUM is used to indicate verbose level, for example:

nvim -V10nvim.log

will create a log file nvim.log with verbose level 10.

More reference here. See also nvim --help.

至此,Neovim 就算配置完成了2,终于可以愉快码代码了。


  1. Vim 最初于 1991 年发布,它的前身 Vi 诞生于 1978 年。
  2. 我的完整 Neovim 配置文件见这里