自从2015年11月neovim横空出世,让沉寂很久的编辑器之战掀起波澜,只是这次是vim内部之间的战争,那就是从vim内部分裂出去的neovim。随着neovim的一个又一个新特性推出,比如,内嵌终端,悬浮窗口,多线程异步IO,立刻将一大部分原来的vim用户吸引过去,而代表老一派的vim作者也不放弃,立马跟进,neovim有的,我vim也有而且做得更好,更稳定。
这段时间,两者特性更新都很快,随着新特性而来的是如雨后春笋般出现的新插件们,插件作者们看到让vim接近emacs的机会,都说emacs是操作系统,现在vim & neovim有了这么多牛逼特性,vim可以多线程异步执行任务了,vim可以内嵌终端了,vim可以悬浮窗口,vim & neovim可以玩游戏了......这让vim & neovim看起来更像一个现代的编辑器,但是依旧保留了它的优点。
这段时间,有些脸皮厚像我,也开始晒配置了。还出现了space-vim和SpaceVim这样的配置之争,两者几乎同时出现(前者早几个星期),他们都想模仿著名的emacs配置框架Spacemacs。
也几乎在同时,我也产生了同样的想法,希望我的配置是可方便裁剪,集成尽可能多功能,快捷键也是以Space开始,不一样的是,我希望界面上尽可能低调,功能牛逼.....
我是一个vim支持者,同样情况下vim能兼容更多环境,而且vim该有的功能都有,neovim刚起步比vim不稳定些。好在两者在大部分情况下,一份配置是能互相兼容的,偶尔想玩下新特性就切换到neovim。
往事不提也罢....
逐渐vim和neovim的开发速度放下来了,从我的角度来看,两者都向着一个大方向前进,那就是内嵌速度更快更灵活的编程语言来配置vim & neovim。所以两个项目都进入漫长的开发期。
以前的我,几乎隔几天就更新一下vim,现在我停止更新了,因为会带来各种兼容性问题和不稳定。由于neovim也陷入了长期新特性的开发,所以我有好一段时间没有更新编辑器也没有更新我的配置,而是专心代码了。
这段时间大概维持了有接近两年。
vim朝着vim9的方向出发,目标是开发一种更快的vim 脚本。目前的进度根据bram本人说可能还需要“a few month"。
neovim这段时间朝着下面三个方向前进:
neovim再次掀起了编辑器之战的波澜,neovim 0.5率先发布,实现了上面三个特性。这个版本的发布带起一阵学习lua的旋风,也让更多的人第一次知道了LSP和Treesitter。
用普通人能听懂的话来总结这次更新就是:
作为使用者,我们其实也没必要为了neovim的新特性将配置全部改成lua,neovim的兼容性还是很好的。我想保持兼容性的前提又用上neovim的新特性,只需要在原来的配置上做一些小小的区分,以及知道lua的基本语法就行。
第一步根据neovim版本来区别配置:
function! te#env#IsNvim() abort if has('nvim') let v = api_info().version return v.major + v.minor/10.0 + v.patch / 100.0 endif return 0 endfunction
如上面函数,该函数返回neovim的版本或者0(表示不是neovim)。
当版本号大于等于0.5时,我们就可以在vim脚本里面(我们的配置)加上一些必要的lua插件及其配置,当然我们加载插件还是用我们喜欢的插件管理器:
Plug 'hrsh7th/nvim-cmp', {'branch': 'main' } lua << EOF require('nvim_cmp') EOF
现在neovim的用lua写的插件只支持用lua配置,我们可以通过上面这样的语法将lua代码嵌入到vim脚本里面,当然在vim脚本里面插入太多lua代码不是一件明智的做法,所以我们这里只是简单的进行require,而把所有细节都放在lua/nvim_cmp.lua文件中。这里要说明的是neovim会自动在lua文件夹下找对应的lua模块,在你的init.vim所在目录下创建一个lua文件夹即可,下面是我的配置的目录结构。
. ├── after │ └── ftplugin ├── autoload │ └── te │ ├── ctrlp │ ├── fzf │ └── leaderf ├── bin ├── bundle ├── lua ├── rc ├── init.vim └── vimrc
首先基于LSP特性的补全插件,这里首推nvim-cmp,及其众多source插件。其中nvim-lspconfig是官方的lsp接口插件是nvim-cmp依赖的。
Plug 'hrsh7th/cmp-nvim-lsp', {'branch': 'main' } Plug 'hrsh7th/cmp-buffer', {'branch': 'main' } Plug 'hrsh7th/nvim-cmp', {'branch': 'main' } Plug 'hrsh7th/cmp-path', {'branch': 'main' } Plug 'hrsh7th/cmp-nvim-lua',{'branch': 'main'} Plug 'quangnguyen30192/cmp-nvim-ultisnips', {'branch': 'main' } Plug 'octaltree/cmp-look' Plug 'neovim/nvim-lspconfig'
lsp服务端下载插件:
nvim-lspinstall或者nvim-lsp-installer,它们可以帮助我快速安装对应编程语言的LSP服务端程序。
最后就是treesitter插件了:nvim-treesitter
还有许多看起来很炫目的插件实际上不是必要的,旧插件早就实现了相同功能。