1. Go的安装
嗯因为Go的官网被墙了所以需要自行准备梯子。Linux安装Go很简单,即使是CentOS 6,直接去golang下载页下载二进制文件解压即可,比如我写这篇博客时的最新版本是1.12.6,下载解压即可:
1 | wget https://dl.google.com/go/go1.12.6.linux-amd64.tar.gz |
我这里依旧是解压到~/local
目录,另外新建了gopath
目录。然后在~/.bashrc
中添加环境变量:
1 | export PATH=$LOCAL/go/bin:$PATH |
GOROOT
指的是Go的安装目录,而GOPATH
则是自定义路径,不一定要在GOROOT
下,而且可以有多个路径,每个路径代表Go的一个工作区,一般的工作区由src
、pkg
、bin
三个目录组成,比如go get
远程下载的项目,而GOBIN
则是安装的二进制文件的路径。
2. 重新编译YCM
之前安装的YCM能够对C/C++进行补全,要对Go进行补全需要加上--go-completer
选项重新编译,不过由于已经存放过编译的中间文件了,所以这次编译会很快。
1 | CC="$LOCAL/gcc-5.4.0/bin/gcc" CXX="$LOCAL/gcc-5.4.0/bin/g++" ./install.py \ |
编译完毕后基本的补全功能已经有了,如下图所示:
Go的编码规范建议使用TAB而非空格表示缩进,因此之前的vim配置中set expandtab
最好注释掉,防止把TAB扩展成空格。
YCM对Go的补全无需像C++一样通过.ycm_extra.conf.py
脚本来指定头文件包含目录的,它是通过直接分析处于$GOROOT/pkg
或GOPATH/pkg
下的静态库.a
文件来获取补全信息的。
由于Go标准库的静态库已经编译好,位于$GOROOT/pkg/$GOOS_$GOARCH
目录下,环境变量可通过go env
命令来查询。而对于go get
或者$GOPATH/src
下的项目,如果没有编译成静态库,YCM是无法补全的,因此要用到某些包时需要首先进入包所在目录go install
。
如果使用了本地包比如import "./local"
,那么需要把local.a
文件拷贝到和当前.go
文件同一目录。
3. vim-go
1 | Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } |
安装、使用可参考vim-go的README,某些二进制文件地址被墙了,所以需要去镜像站下载。
然而打开.go文件时会提示
1 | vim-go: could not find 'gopls'. Run :GoInstallBinaries to fix it |
然而用:GoInstallBinaries
会失败,因为某些二进制文件被墙了,打开vim-go项目目录下的plugin/go.vim
可以找到:
1 | " these packages are used by vim-go and can be automatically installed if |
如注释所言,:GoInstallBinaries
实际上是把这些二进制文件安装到本地,由于golang.org
被墙了,所以相关工具无法下载。即使是github上的项目,克隆速度也慢得感人,所以还是手动下载安装。
3.1 手动安装二进制文件
以fillstruct
为例:
1 | mkdir -p $GOPATH/src/github.com/davidrjenni |
注意go.vim
中的cmd/fillstruct
后缀指的是克隆的项目的子目录,因此流程是先克隆项目本身,再进入相应子目录安装。go install
安装完后会发现$GOPATH/bin
下多了二进制文件fillstruct
。
实际上上述流程是手动进行了go get
的流程,但是能够判断出错到底是git clone
还是go install
,前者出错可能就是访问太慢甚至无法访问,后者则是可能项目里引用了未安装的包。
3.2 安装依赖包
并非所有项目都像fillstruct
那么顺利,比如在安装errcheck
时就提示:
1 | $ go install |
其中/home/xyz
是我的HOME目录,出现这个错误就是因为"golang.org/x/tools/go/packages"
包没有安装,而由于golang.org
被墙了,go get
安装会失败,不过好在可以从golang的github镜像站去找到对应的项目,然后下载安装,以此为例:
1 | cd $GOPATH |
然后再重新在errcheck
目录下go install
即可。
3.3 特别操作
stamblerre/gocode
,由于生成的是gocode-gomod
而非默认的gocode
,因此需要指定二进制名称(似乎go install
无法做到):
1 | go build -o gocode-gomod |
honnef.co/go/tools/cmd/keyify
,在github上有镜像:
1 | cd $GOPATH/src |
3.4 最终安装结果
安装的二进制文件如下:
1 | $ ls $GOBIN |
从golang的github镜像上分别克隆了3个项目:
1 | $ ls $GOPATH/src/golang.org/x |
3.5 其他说明
vim-go的具体使用方式,参考vim-go Tutorial。
打开go文件时会出现下列错误
1 | vim-go: Features that rely on gopls will not work correctly in a null module. |
解决方法参考#2301,在.vimrc
中添加下列代码即可:
1 | let g:go_null_module_warning = 0 |
此外GoRename
命令只有在项目目录在$GOPATH/src
下时才能使用,否则会出现can't find package containing
错误。
4. 总结
由于是在之前的基础上进行,所以Go开发环境的搭建较为简单,安装Go、重新编译YCM,Ultisnip已经有了,剩下的就是vim-go的安装了。其实最重要的还是YCM的补全功能。
虽然我vim-go用得也不多,主要就是用了下将gofmt集成进vim的:GoFmt
命令,毕竟上手Go的时间也不长。话说才发现现在保存文件时就会自动格式化了,无需手动输入:GoFmt
命令。
安装vim-go的主要难点在于各种远程包,在我的电脑上几乎是全程开代理下载,有时候git代理不太好使就直接在VPS上克隆完毕后,打包、FTP下载、FTP上传、解压。
之前实习时安装vim-go去解决各种go get
的问题了,go get
虽然方便,但是出错的话难以及时发现错误在哪,感觉在国内这个网络环境下,还不如手动克隆、安装。