Vim代码补全插件YouCompleteMe对Go语言支持补全路上的辛酸泪

喵哥最近在学习Go语言的过程中发现之前编写C++还管用的YCM“不香了”,Go的代码一直要靠自己敲完。为了方便管理代码,喵哥一直在阿里云服务器上编写,但是本地的Golang是真的好用,搞得心里膈应。一开始,还能用“熟悉Go语言”的借口说服自己,随着代码量的增加,心里开始犯嘀咕了。

其实,经过几分钟查找,喵哥就发现了主要原因:

喵哥之前编译的YCM是针对C++的,编译的命令为:

./install.sh --clang-completer

现在要对Go语言支持,需要用命令编译:

./install.sh --gocode-completer

此外,java、JavaScript、rust对应的编译命令分别为:

./install.sh --java-completer

./install.sh --ts-completer

./install.sh --rust-completer

然而,事情没那么简单,运行完报错了:

main.go:15:2: cannot find package "golang.org/x/tools/internal/lsp/cmd" in any of:

main.go:16:2: cannot find package "golang.org/x/tools/internal/tool" in any of:

其实根据上面的两个错误直接搜索可以很快捷地搜到想要地结论:在/usr/lib/go-1.10/src/或/usr/share/go-1.10/src(两者是软链接关系)下新建目录:golang.org/x,然后在/usr/lib/go-1.10/src/golang.org/x下从github克隆一个文件夹tools:

git clone https://github.com/golang/tools

然而,再次执行./install.sh --gocode-completer编译YCM时,又出现了问题:

/usr/lib/go-1.10/src/golang.org/x/tools/internal/lsp/cache/analysis.go:12:2: cannot find package "golang.org/x/sync/errgroup" in any of:
……
main.go:15:2: use of internal package not allowed
main.go:16:2: use of internal package not allowed
/usr/lib/go-1.10/src/golang.org/x/tools/internal/lsp/protocol/span.go:13:2: cannot find package "golang.org/x/xerrors" in any of:
……

其实是类似地问题,但是网上并没有直接地告知去克隆哪一个目录。还好机智的喵哥发现了一个秘密:刚刚克隆的地址的上一级就是一个Go语言的依赖集合:https://github.com/golang?page=1

在其中可以很容易找到需要的目录:

 

然后就是照葫芦画瓢:

git clone https://github.com/golang/sync
git clone https://github.com/golang/xerrors

现在是没有报缺少依赖包的错误了,但是出现了另外一个棘手的问题:

main.go:15:2: use of internal package not allowed
main.go:16:2: use of internal package not allowed

这个问题耗了很久,大概了解了一下,go中用vendor来管理第三方依赖包,算是external(外包),但是这里说的是内包的问题,喵哥把几个文件夹的位置换了又换,可是还是没有解决。

看了下服务器的go语言的版本是1.10.4,干脆把它升级到最新的版本,算是不破不立。

#卸载旧的Go
sudo rm -rf /usr/local/go
sudo rm -rf /usr/bin/go
sudo rm -rf /usr/bin/gofmt 
sudo rm -rf /usr/lib/go-1.10/

#安装新的Go
wget https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz
tar -xzf go1.13.4.linux-amd64.tar.gz -C /usr/local
sudo ln -s /usr/local/go/bin/* /usr/bin/

Go的环境变量没有变化,就不修改了。

喵哥好奇去看了下新的版本有啥区别,发现这个版本的golang.org/x文件夹在vendor中已经存在,并且包含了部分之前不存在的包。

然后就直接去编译YCM,发现有了新问题。。。

go: golang.org/x/[email protected]: Get https://proxy.golang.org/golang.org/x/net/@v/v0.0.0-20190311183353-d8887717615a.mod: dial tcp 216.58.200.49:443: i/o timeout

这个主要是因为被和谐了,加上一个全局代理即可:

export GOPROXY=https://goproxy.io

后续……

喵哥成功编译了支持go的YCM,但是在使用的过程中还是不能提示补全代码。经过喵哥升级vim8.0到8.1(没用),更换新的ycm,

git clone https://github.com/ycm-core/YouCompleteMe

成功了。。。

大概总结的经验就是:软件的缺陷不应该成为惩罚自己的武器:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章