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

成功了。。。

大概總結的經驗就是:軟件的缺陷不應該成爲懲罰自己的武器:)

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