由于最近工作中使用golang开发比较多,而大部分工作都是使用vim完成,在配置vim的golang环境时,发现已经有很多配置的解决方案,vim有很多插件支持golang开发环境,对我而言,配置以下四个插件就够用了:
其中:
- vim-go是针对go语言的vim插件。支持代码格式化、语法检查、语法高亮、调试等非常多的功能。
- tagbar用于方便查看代码结构。
- nerdtree用于管理和查看代码目录结构。
- YouCompleteMe用于代码自动补全。
先来看一下整体效果吧:
左边是代码目录树,中间是代码编辑区域,右边是代码类结构等信息,底部是状态栏。
1.依赖环境
1.1 安装go环境
到 golang.org 将安装包下载,并配置好环境, 推荐使用二进制版本,下载完成后直接解压缩就可以使用。如果无法访问 go 官网,可以考虑去 golang.google.cn 去下载。
wget https://dl.google.com/go/go1.12.linux-amd64.tar.gz
sudo tar xzvf go1.12.linux-amd64.tar.gz -C /usr/local/
配置好GOROOT
和GOPATH
环境变更即可
vim ~/.profile 添加以下内容
# golang
export GOROOT=/usr/local/go1.15.5
export PATH=$PATH:$GOROOT/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
配置go的vim IDE环境需要依赖vim和vim-go插件。
vim-go插件需要vim使用8.0以上的版本,而YouCompleteMe需要python2.7.1+或3.5.1+。如果你系统的vim和python版本满足条件,可以忽略下面两个步骤。
1.2. 安装vim8.0+
推荐使用源码方式安装,先从github上下载vim源代码:
git clone https://github.com/vim/vim.git
在src/INSTALL
安装文档中有针对各个系统的安装步骤,依照步骤安装就好,需要注意的是:由于YouCompleteMe需要vim有python支持,python版本需要2.7.1+或3.5.1+。可以先查看你的vim是否已经支持python:
>vim --version | grep python
+cmdline_hist +langmap -python +visual
+cmdline_info +libcall -python3 +visualextra
-
号表示不支持,重新编译在./configure
的时候加上--enable-pythoninterp=yes
参数就行,如果是python3,则加上--enable-python3interp=yes
。
1.3. 安装python2.7.1+
# Python2.7.1:
wget http://python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz
tar xf Python-2.7.14.tar.xz
cd Python-2.7.14
./configure --prefix=/usr/local/python27 --enable-unicode=ucs4 --enable-shared
make && make install
需要注意的是:
- make install需要管理员权限进行安装
- 编译python的时候加上–enable-unicode和–enable-shared,主要是vim打开python支持后需要python动态库支持,并且unicode需要支持ucs4。
2、Vim 基本配置
2.1.vim基本础配置
参考vim无插件配置。
2.2.vim插件安装
插件的用途就是可以很方便的管理 vim 的各种插件,快速安装配置以及清除,网上现在的帖子多数都是使用的 Vundle 这个插件,不过个人觉得这个管理工具在插件安装多了的时候不是很流畅,更喜好使用 vim-plug 这个插件,两个插件都有很清楚的安装文档,这里是介绍Vundle
我使用Vundle管理vim插件。插件安装比较简单,先打开~/.vimrc,进行需要的插件配置,在配置前建议阅读Vundle的README.md。安装比较简单,如下:
(1)安装插件
在 Linux 下非常简单,直接通过 curl 下载即可(也可以手动下载,见官方文档)
clone vundle.vim.git
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
(2)配置插件
插件的配置也非常简单,只要将所有的插件配置在 call plug#begin('~/.vim/plugged')
和 call plug#end()
之间即可,常见的插件基本上都可以从 github 中找到,如果 github 找不到的话基本上 vim.org 的脚本都可以在 vim-script 中找到备份
在刚刚的 ~/.vimrc 下面继续添加插件相关的配置
set nocompatible " be iMproved, required
filetype off " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'
Plugin 'fatih/vim-go'
Plugin 'majutsushi/tagbar'
Plugin 'scrooloose/nerdtree'
Plugin 'Valloric/YouCompleteMe'
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
然后输入 :w
保存配置,在输入 :PlugInstall
,如下:
:w
:PlugInstall
插件会自动下载安装,看见上面显示 Finishing … Done 的内容,插件安装成功
2.3 其他插件配置
上面一起安装了很多个插件,有些插件要单独配置,记录到下面
- vim-go这个是 go 语言支持插件,上面插件完成后还需要安装很多个 Go 的包才能正常工作,在 vim 中执行下面命令:
:GoInstallBinaries
出现 vim-go: installing finished! 安装成功,可以使用 Go 包的相关功能了(需要注意前面的 PATH 要配置正确,并且已经生效,如果配置正确没有生效,可以注销再登录查看)
- YouCompleteMe这个插件是用来自动完成的,不过需要手动做一些额外的配置
a. 安装依赖关系
sudo apt install build-essential cmake python3-dev
b. 编译
cd ~/.vim/plugged/YouCompleteMe
# 编译,并加入 go 的支持
python3 install.py --go-completer
c. 配置和 SirVer/ultisnips
冲突的快捷键
let g:ycm_key_list_select_completion = ['<C-n>', '<space>']
let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
let g:SuperTabDefaultCompletionType = '<C-n>'
" better key bindings for UltiSnipsExpandTrigger
let g:UltiSnipsExpandTrigger = "<tab>"
let g:UltiSnipsJumpForwardTrigger = "<tab>"
let g:UltiSnipsJumpBackwardTrigger = "<s-tab>"
2.4.插件的配置
我对NERDTree、YouCompleteMe以及tagbar的配置比较简单,需要更多配置请参考各个插件的README.md
2.4.1 vim-go插件
let g:go_fmt_command = "goimports" " 格式化将默认的 gofmt 替换
let g:go_autodetect_gopath = 1
let g:go_list_type = "quickfix"
let g:go_version_warning = 1
let g:go_highlight_types = 1
let g:go_highlight_fields = 1
let g:go_highlight_functions = 1
let g:go_highlight_function_calls = 1
let g:go_highlight_operators = 1
let g:go_highlight_extra_types = 1
let g:go_highlight_methods = 1
let g:go_highlight_generate_tags = 1
let g:godef_split=2
2.4.2 NERDTree插件
" 打开和关闭NERDTree快捷键
map <F10> :NERDTreeToggle<CR>
" 设置宽度
" let NERDTreeWinSize=25
2.4.3 tagbar插件
nmap <F9> :TagbarToggle<CR>
let g:tagbar_width=25
let g:tagbar_type_go = {
\ 'ctagstype' : 'go',
\ 'kinds' : [
\ 'p:package',
\ 'i:imports:1',
\ 'c:constants',
\ 'v:variables',
\ 't:types',
\ 'n:interfaces',
\ 'w:fields',
\ 'e:embedded',
\ 'm:methods',
\ 'r:constructor',
\ 'f:functions'
\ ],
\ 'sro' : '.',
\ 'kind2scope' : {
\ 't' : 'ctype',
\ 'n' : 'ntype'
\ },
\ 'scope2kind' : {
\ 'ctype' : 't',
\ 'ntype' : 'n'
\ },
\ 'ctagsbin' : 'gotags',
\ 'ctagsargs' : '-sort -silent'
\ }
2.5 遇到的问题
2.5.1.vim-go执行:GoInstallBinaries失败
表现为:
vim-go: guru not found. Installing golang.org/x/tools/cmd/guru to folder /home/xxx/repos/gopath/bin/
vim-go: Error downloading golang.org/x/tools/cmd/guru: Fetching https://golang.org/x/tools/cmd/guru?go-get=1
vim-go: https fetch failed: Get https://golang.org/x/tools/cmd/guru?go-get=1: dial tcp 216.239.37.1:443: i/o timeout
vim-go: package golang.org/x/tools/cmd/guru: unrecognized import path "golang.org/x/tools/cmd/guru" (https fetch: Get https://gola
ng.org/x/tools/cmd/guru?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
vim-go: Error installing golang.org/x/tools/cmd/guru: can't load package: package golang.org/x/tools/cmd/guru: cannot find package "golang.org/x/tools/cmd/guru"
原因是在执行:GoInstallBinaries执行时会使用go get 安装依赖包(依赖包在~/.vim/bundle/vim-go/plugin/go.vim
中可以看到),由于国内无法访问https://golang.org
,故会出现io timeout的情况,好在google已经将这些代码上传至github上。直接clone在本地再安装即可,以安装guru为例:
# 先在$GOPATH目录下本地建立golang.org\x
mkdir -p %GOPATH%/src/golang.org/x
# 将tools代码库clone到本地
git clone https://github.com/golang/tools.git %GOPATH%/src/golang.org/x/tools
# 安装guru
go install golang.org/x/tools/cmd/guru
# 安装成功后就可以在$GOPATH/bin 目录下看到guru的二进制文件了
安装其它依赖包方法同上,不再累赘。
4.2.YouCompleteMe安装后不可用
安装完YouaCompleteMe插件后,打开vim提示:
YouCompleteMe unavailable: requires Vim compiled with Python (2.7.1+ or 3.5.1+) support
原因是YouCompleteMe需要vim支持python,在编译vim的时候指定--enable-pythoninterp=yes
即可,如果是python3,则指定--enable-python3interp=yes
4.3.vim加载libpython2.7.so.1.0动态库失败
表现为:
/usr/local/bin/vim: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
当vim开启python支持后,需要依赖python共享库,使用ldd命令可以查看vim依赖的动态库:
> ldd /usr/local/bin/vim
发现的确没有找到libpython2.7.so.1.0
。原因是在源码编译python的时候没有指定--enable-shared
导致,重新编译python即可。由于python源码安装时,默认安装到/usr/local/python27
下,如果仍然没有找到,可以将/usr/local/python27/lib
下生成的libpython2.7.so.1.0
库拷贝到/usr/lib64/
下(64位环境),也可以在/etc/ld.so.conf
指定动态库加载目录。
4.4.undefined symbol pyunicodeucs4_asencodedstring
原因是源码编译python的时候没有开启asencodedstring支持,在编译python的时候加上以下参数就行:
./configure --prefix=/usr/local/python27 --enable-shared
3、使用目前已经配置好的vim
打包.vim和.vimrc文件到新的机器,解压到~目录下
sudo apt-get install ctags安装ctags
vim ~/.vimrc
执行:PlugInstall等安装命令即可