img

在vscode等IDE中使用vim插件也已经很久了,最近发现了NeoVim的存在,之前也非常好奇国外的程序员为啥有许多,执着于编辑器之神(Vim) & 神的编辑器(Emacs),因此也尝试使用NeoVim配置了一套环境。

1、快速了解NeoVim

Bram Moolenaar 在写 Vim 时还是 90 年代初,至今已经 20 多年 过去了。其中,不仅包含了大量的遗留代码,而且程序的维护、Bug 的 修复、以及新特性的添加都变得越来越困难。为了解决这些问题,Neovim 项目应运而生。Neo 即“新”之意,它是 Vim 在这个新时代的重生。

根据 Neovim 的自述说明,在总体上,它将达到下列目的:

  • 通过简化维护以改进 Bug 修复及特性添加的速度;
  • 分派各个开发人员的工作;
  • 实现新的、现代化的用户界面,而不必修改核心源代码;
  • 利用新的、基于协同进程的新插件架构改善扩展性,并支持使用任何语言 编写插件

以上介绍来自linuxtoy

此外, 在最近的版本中, 还有非常值得注意的几点:

  • 实现了嵌入式终端模拟器, 可以跟各种REPL插件说再见了
  • 使用远程API(好像是socket), 不光能使用各种语言编写插件, 而且可以很方便的编写GUI版本, 甚至嵌入至IDE中
  • 由于内部优化了事件监听器还是什么的, 代码粘贴的时候, 可以自动识别, 不像vim里一样需要:set paste, 不然会出现蜜汁缩进和括号对
  • 直接支持剪贴板, 不需要重新编译

2、NeoVim基本配置

2.1、安装NeoVim

macOS/OS X 上使用Homebrew安装

1
brew install neovim

更多安装方式参考:Installing Neovim

2.2、插件管理器vim-plug

安装

1
2
sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'

基本使用

neovim继承自vim,基本支持vim的所有特性,可以直接使用vim的配置文件:

1
2
3
mkdir -p ${XDG_CONFIG_HOME:=$HOME/.config}
ln -s ~/.vim $XDG_CONFIG_HOME/nvim
ln -s ~/.vimrc $XDG_CONFIG_HOME/nvim/init.vim

也可以重新开始配置neovim

1
2
mkdir -p ~/.config/ ~/.config/nvim
touch  ~/.config/ ~/.config/nvim/init.vim

Plug插件,需要在 call plug#begin()call plug#end() 节点中,使用Plug命令进行声明,如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
call plug#begin()
" The default plugin directory will be as follows:
"   - Vim (Linux/macOS): '~/.vim/plugged'
"   - Vim (Windows): '~/vimfiles/plugged'
"   - Neovim (Linux/macOS/Windows): stdpath('data') . '/plugged'
" You can specify a custom plugin directory by passing it as the argument
"   - e.g. `call plug#begin('~/.vim/plugged')`
"   - Avoid using standard Vim directory names like 'plugin'

" Make sure you use single quotes

" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
Plug 'fatih/vim-go', { 'tag': '*' }

" Initialize plugin system
call plug#end()

配置好插件后,进行安装升级

1
2
3
:PlugInstall
:PlugUpdate
:PlugUpgrade

查看已经安装的插件状态

1
:PlugStatus

更多资料,参考vim-plug

3、插件安装

方便开发使用,需要对下面一些基本功能进行配置:

  1. 目录管理 - nerdtree
  2. 文件模糊搜索 - fzf
  3. 代码缩略图 - tagbar
  4. 主题配色 - molokai
  5. 状态栏 - airline
  6. 编程语言相关插件(vim-go)
  7. 自动补全- neocomplete.vim
  8. 其他(vim-stratify)

3.1、nerdtree

常用非常流行的目录管理插件nerdtree

1
2
3
4
5
6
Plug 'scrooloose/nerdtree'

nnoremap <leader>n :NERDTreeFocus<CR>
nnoremap <C-n> :NERDTree<CR>
nnoremap <C-t> :NERDTreeToggle<CR>
nnoremap <C-f> :NERDTreeFind<CR>

配置快捷键Ctr + n, Ctrl + t, Ctrl +f

3.2、 fzf

fzf 是一个非常高效实用且美观的命令行工具,并且配置有对应的 vim 插件 fzf.vim。比如下面这个效果图,我们可以让 fzf 在中间进行显示,有点类似于 IDEA 的搜索窗口。

image-20220118164902042

fzf.vim 依赖fzf,安装插件前需要先安装好fzf:

1
brew install fzf

使用插件:

1
2
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

NeoVim命令模式下输入:Files :Buffers即可弹出模糊搜索窗口进行搜索

更多信息参考:fzf.vimfzf

3.3、Tagbar

Tagbar是一个Vim插件,它提供了一种简单的方法来浏览当前文件的标记并获得其结构的概述。它通过创建一个侧边栏来显示当前文件的ctags-generated标记,并按其范围排序。

image-20220118170918463

安装插件,并配置快捷键F8:

1
2
3
" tagbar
 Plug 'majutsushi/tagbar'
 nnoremap <F8> :TagbarToggle<cr>

如果您这样做,F8键将切换Tagbar窗口,当然也可以配置任何其他自己想要的快捷键。

更多资料参考:tagbar

3.4、主题配色

主题的话根据个人喜好选择。

1
2
3
4
5
6
7
Plug 'fatih/molokai'

syntax enable
set t_Co=256
let g:rehash256 = 1
let g:molokai_original = 1
colorscheme molokai

3.5、更好的状态栏

1
2
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'

或者

1
2
3
4
Plug 'morhetz/gruvbox'

" 使用配色方案gruvbox
colorscheme gruvbox

更多主题样式配置,常见:vim-airline gruvbox

3.6、vim-go

使用vim/neogim进行go语言的开发需要vim-go

1
2
3
4
" go 主要插件
Plug 'fatih/vim-go', { 'tag': '*' }
" go 中的代码追踪,输入 gd 就可以自动跳转
Plug 'dgryski/vim-godef'

更多配置参考:vim-go

3.7、deoplete.nvim

代码自动补全,需要使用deoplete.nvim

安装依赖:

1
2
pip3 install pynvim
pip3 install msgpack

安装配置插件

1
2
Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
let g:deoplete#enable_at_startup = 1

配置TAB快捷键完成自动提示输入:

1
2
" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"

至此重启NeoVim后,自动补全会根据当前文件中已有的名字进行猜测并补全。为了根据不同的语言特性提供更加完善的补全效果,需要安装相应的。 如对于Python可以再安装deoplete-jedi 依赖安装

1
pip3 install --user jedi --upgrade

插件安装:

1
Plug 'deoplete-plugins/deoplete-jedi'

修改配置后,使用:PlugInstall命令进行安装完成后重启NeoVim,此时就可以基于jedi在NeoVim上对Python提供完美的自动补全功能。

更多配置参考:deoplete.nvim

3.8、vim-startify

vim-startify 为Vim/NeoVim开屏页美化插件,可以记录最近编辑的文件,使用对应数字编号就可以快速打开文件,使用起来非常方便。

image-20220118172551047

安装:

1
Plug 'mhinz/vim-startify'

4、附件

完整的配置init.vim

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
call plug#begin()
" The default plugin directory will be as follows:
"   - Vim (Linux/macOS): '~/.vim/plugged'
"   - Vim (Windows): '~/vimfiles/plugged'
"   - Neovim (Linux/macOS/Windows): stdpath('data') . '/plugged'
" You can specify a custom plugin directory by passing it as the argument
"   - e.g. `call plug#begin('~/.vim/plugged')`
"   - Avoid using standard Vim directory names like 'plugin'

" Make sure you use single quotes

" The NERDTree is a file system explorer for the Vim editor. 
Plug 'preservim/nerdtree'

" indentation guides to all lines
Plug 'lukas-reineke/indent-blankline.nvim'

" fzf
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

" 状态栏美化
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'

" tagbar
Plug 'majutsushi/tagbar'
nnoremap <F8> :TagbarToggle<cr>

" vim开屏页美化插件,可以记录最近编辑的文件,使用对应数字编号就可以快速打开文件,使用起来非常方便。
Plug 'mhinz/vim-startify'

" AutoComplete
Plug 'Shougo/deoplete.nvim'
" Python AutoComplete
Plug 'deoplete-plugins/deoplete-jedi'
let g:deoplete#enable_at_startup = 1

" Insert or delete brackets, parens, quotes in pair.
Plug 'jiangmiao/auto-pairs'

" 配色方案
Plug 'morhetz/gruvbox'

call plug#end()

set encoding=utf-8
set tabstop=4
set softtabstop=4
set shiftwidth=4
" 表示Tab自动转换成空格
set expandtab 
" 表示换行后自动缩进
set autoindent

" 智能对齐
set smartindent

" 当文件在外部被修改时,自动重新读取
set autoread

" 显示行号、 显示当前行行号,其它行的行号都是以当前行为基准从 1 开始增加(即相对行号)
set number relativenumber

" 设置配色方案
colorscheme gruvbox
let g:airline_theme='gruvbox'

" 启用语法高亮
syntax enable
" 使用黑色主题-light dark 
set bg=dark
" vim记住的历史操作的数量,默认的是20
set history=40 

" NERDTree
nnoremap <leader>n :NERDTreeFocus<CR>
nnoremap <C-n> :NERDTree<CR>
nnoremap <C-t> :NERDTreeToggle<CR>
nnoremap <C-f> :NERDTreeFind<CR>

" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"

更多资料

  1. 维基百科-Vim
  2. 精通 VIM ,此文就够了
  3. nerdtree
  4. fzf
  5. him-startify
  6. tagbar
  7. vim-airline
  8. vim-go
  9. neocomplete.vim
  10. programming-go-in-neovim