iTimothy

从Vim到NeoVim

前言

自从去年开始,我日常的工作环境基本都是在iTerm2+Tmux+Vim+Zsh中,这几大神器结合使用起来,能极大提升工作效率。从写代码,编译,debug,部署,维护服务器,都能在终端里面实现了,从此摆脱了对图形化IDE的依赖。为此,还专门写了一篇blog,分享如何使用这几个工具搭配,搭建属于自己的IDE:打造Go的IDE

唯一美中不足的是Vim是运行在终端里面,感觉性能还是比不上MacVim,在代码文件较多的工程,会有一些卡顿,另外,也是因为我装了一堆插件的原因,各种的语法检查,自动补全,格式化代码等过程也会降低一些速度。直到关注到一个新的”坑”: NeoVim

NeoVim

NeoVim,作者称它是Vim在这个新时代的重生,因为Vim的年纪确实有点大了,还是上个世纪90年代的作品。虽然这么多年过去,Vim仍然被许多开发者使用,但Vim本身已经由于自身包含大量遗留代码,程序的维护更新,bug的修复都已经变得越来越困难。NeoVim的作者也是因为当初向Vim提交了两大补丁,包含了大量改动,不幸被Vim的作者拒绝,认为风险太大。所以,NeoVim的作者干脆另起炉灶,开始开发NeoVim。

相比Vim,NeoVim的目标有几点:

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

迁移到NeoVim

从去年开始,我就关注到了NeoVim,不过一直没机会在工作环境中来使用,起初是担心NeoVim还在开发阶段,会有各种bug和不稳定,因为到现在NeoVim的版本都还是V0.1.X。其次是担心现在正在使用的各种Vim插件会有跟NeoVim不兼容的情况,因此迟迟没有把开发的主力编辑器从Vim迁移到NeoVim的打算。直到最近,终于大胆折腾了一下NeoVim,发现迁移的过程并不是那么“痛苦”,Vim的配置文件搬到NeoVim几乎没有太大改动就能用,而且插件也没发现不兼容的地方,于是乎,正式的把开发编辑器从Vim转到了NeoVim。

从迁移的结果来看,NeoVim用起来几乎跟之前的Vim差别不大,但是速度比Vim更快一些。此外,还在这次迁移过程中进行了一些调整,替换掉一些插件,让使用体验比之前更流畅了。

这里小记一下迁移过后的改动:

用YouCompleteMe替换掉了NeoComplete

Vim自带的补全工具是OnmiComplete,功能较弱。之前一直用NeoComplete,补全效果非常不错,唯一的缺点就是在项目文件比较多的情况下,容易出现卡顿,使用NeoComplete本身也需要Vim在编译的时候,打开lua的选项。这次在迁移的时候转向用YouCompleteMe,速度很快,基本不会出现卡顿。更方便的是,YouCompleteMe还支持Go,在安装的时候,添加–gocode-completer选项即可。替换之后,自动补全体验了有了很大的提升。

插件管理从Vundle换到了Vim-Plug

Vundle是之前Vim插件管理比较流行的工具。转向使用Vim-Plug,最大的原因还在于相比Vundle,所有的插件更新和安装都是并行的,这样比Vundle效率提升了不是一点半点。

此外,最令人心动的,是Vim-Plug的杀手级特性:按需加载控件,可以让你根据不同的需求,决定某些插件在什么时机开始加载,从而大大提升Vim/NeoVim的启动速度。例如:

1
2
3
4
5
" 让NERDTree插件,在第一次被触发的时候才加载
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
" 让YCM插件在打开go源代码文件时才被加载
Plug 'Valloric/YouCompleteMe', { 'for': 'go' }

最后

其他之前在Vim用的插件,都能无缝迁移到NeoVim,体验非常棒。NeoVim现在已经能完全应用到日常的开发环境中来替代Vim了。于是,我开始干了这样一件事情:

1
2
brew uninstall vim --force
rm -rf ~/.vim

然后,在.zshrc文件中,这样干:

1
2
alias vi="nvim"
alias vim="nvim"

嗯,算是彻底的弃Vim,入坑NeoVim了……

最后,更新了一下GitHub上的mydotfiles项目,把NeoVim的配置也放上去了,欢迎体验。

坚持原创技术分享,您的支持将鼓励我继续创作!