之前一直用 VSCode 写 Go 代码, 最近使用 VSCode 的时候频繁出现卡顿的情况, 而且一出现要等很长时间才能恢复, 实在忍无可忍了决定用其他 IDE 替换 VSCode。 找了几款常见的 Go IDE,发现都不尽如人意。 例如 Eclipse,这个其实也卡,除了写 Java 基本上是不想碰 Eclipse 的; 周围同事用的似乎都是 GoLand 这个 IDE,但这个是收费了,也不考虑了; LiteIDE 下载过来后发现因为 C++ 库依赖的原因,程序根本起不来,懒得解决了,弃; 其他类似 Atom 之类的编辑器估计比 VSCode 还卡,连试都不想试了。 最后决定自己折腾一个 vim IDE 环境。

1. 升级 vim 到 8.0

vim 7 上一些插件没法用,例如 vim-go, 所以需要先升级 vim 到版本 8。 CentOS、Ubuntu 上的 vim 似乎都是 7 的版本, 添加源安装的方式比较麻烦,反正我没搞成功过, 然后发现源码安装其实很简单, 代码下载下来后一条指令就装好了:

$ ./configure && make -j 16 && sudo make install

2. 安装 NERDTree

NERDTree 插件提供大部分 IDE 都会提供的文件浏览功能。 vim 8 的插件安装极为简单, 只要把插件代码放到目录 ~/.vim/pack/plugins/start/ 即可:

$ git clone git@github.com:scrooloose/nerdtree.git ~/.vim/pack/plugins/start/nerdtree

NERDTree 常用的快捷键配置:

  1. 开启/关闭 NERDTree

    map :NERDTreeToggle

  2. 展开当前文件

    map :NERDTreeFind

  3. 在当前文件夹下新建文件

    press key m and then press key a

  4. 去掉 ^G 符号

    • 刚装好 NERDTree 时目录的左边都一个诡异的 ^G 符号,后来根据这篇文章 设置了 NERDTreeNodeDelimiter 后限制正常了
    • let g:NERDTreeNodeDelimiter = “\u00a0”

3. 安装 CtrlP 插件

CtrlP 插件提供文件索索功能, 类似 VSCode 或者 Sublime 中的 ctrl+p 快捷键。 CtrlP 插件安装方式如下:

$ git clone https://github.com/ctrlpvim/ctrlp.vim ~/.vim/pack/plugins/start/ctrlp

在 vimrc 中添加配置 let g:ctrlp_map = '<c-p>', 按 ctrl+p可以直接搜索文件。 新建的文件会出现搜索不到的情况, 这时候按 F5 刷新下搜索的缓存,在次搜索就能找到新文件了。 CtrlP 插件还有一个比较诡异的问题: 执行具体搜索时发现好多文件都不在检索结果里, 查看文档最终确认是ctrlp_match_window配置的原因, 默认的 results 值是 10,调整成 0 后变成无限制 (文档没明确说明,但测试结果像是这个效果), 但是这样有个问题,如果文件数量非常多的话搜索结果会超级慢, 最后调成一个可接受的值 128,整个配置如下:

let g:ctrlp_match_window = 'bottom,order:btt,min:1,max:10,results:128'

4. 安装 vim-go 插件

如上所述,vim-go 插件安装也只要一条 git clone 命令即可:

$ git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go

根据作者介绍 master 分支的代码可能不太稳定, 所以切换到 1.19 的最新稳定版。

插件下完后需要安装依赖, 插件的依赖主要是一些诸如 gocode、errcheck 之类的 go 工具, 在 vim 中执行 :GoInstallBinaries 来安装插件依赖。 一开始使用时发下代码提示、GoBuild 指令的指令都没法使用, 后来找到 github 中的这个 issue, 其中有一段回复:

When there is no vimrc, Vim will load $VIMRUNTIME/defaults.vim, which sets some more modern defaults. But when there’s a vimrc present (empty or otherwise) it will use the old vi-compatible settings. Specifically, filetype detection won’t be enabled. Adding filetype plugin indent on should fix that. It’s kinda confusing how this works :-/ See :help defaults.vim for more info.

大概是说~/.vimrc会覆盖$VIMRUNTIME/defaults.vim的配置, $VIMRUNTIME/defaults.vim中大概是包含了 vim-go 中的某些初始化配置吧, 我系统中是有~/.vimrc配置,所以就悲剧了, 根据提示在~/.vimrc中添加了filetype plugin indent on就解决了, filetype plugin indent on这个配置是什么作用, 没搞清楚。

通过ctrl+x ctrl+o激活插件的代码提示功能。 刚装好 vim-go 是发现没有代码提示, 折腾很久,发现执行:GoUpdateBinaries 重新装下依赖后代码提示功能就好了, 猜测是之前从 master 分之切换到 v1.19 后 gocode 依赖版本变化导致这个问题。

5. vimrc 配置

最终的 vimrc 配置如下:

set nu
set ai
set hlsearch
set incsearch
set shiftwidth=4
set tabstop=4 expandtab
set paste
set autoindent
syntax on

map <C-b> :NERDTreeToggle<CR>
map <C-i> :NERDTreeFind<CR>
let g:ctrlp_map = '<c-p>'
let g:NERDTreeNodeDelimiter = "\u00a0"
let g:ctrlp_max_files = 0
let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files']
let g:ctrlp_max_depth = 40
let g:go_gocode_propose_source=0
let g:ctrlp_match_window = 'bottom,order:btt,min:1,max:10,results:128'
let g:ctrlp_custom_ignore = {
  \ 'dir':  '\v[\/]\.(git|hg|svn)$',
  \ 'file': '\v\.(exe|so|dll)$',
  \ 'link': 'some_bad_symbolic_links',
  \ }

filetype plugin indent on