這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
雖然 golang 自身提供了 VIM 的文法高亮之類的指令碼,但 autocompletion 並沒有官方解決方案。無意之中發現 gocode 這個支援 VIM 和 Emacs 的 autocompletion daemon。
這裡有個Flash 動畫示範,展示了 gocode 的強大。我得說,用過之後,感覺速度確實夠快。
下面是來自官方的部分介紹:
用於 Go 程式設計語言的自動補全守護進程
Gocode 是可以整合在如 vim 和 emacs 這樣的代碼編輯器中的協助工具輔助。它提供了一系列的進階功能,包括:
(譯註:殘念,還真是“一”系列啊!好吧,但是說實話單就這一個功能就很好用了。)
由於使用 client/server 架構的緩衝形式,所以被稱為守護進程。這使得自動補全非常快。通常,在緩衝生效的情況下自動補全時間在 30ms,一般不會察覺這個延遲。
gocode 的文檔對安裝說得很是詳細,我這裡僅對 VIM 做個簡單的說明。另外,由於 golang 的 pkg 還不夠穩定,不同版本可能會出現編譯錯誤。實際上在我安裝過程中,還是 fix 了 gocode 的相容問題,才順利安裝的。下面會做詳細說明。
首先,我假設你已經安裝好了 go,設定好了 $GOBIN,並將其加入了 $PATH中。使用 8g -V 查看 go 版本,確保版本是【8g version weekly.2011-03-15 7807】。版本不同,在一些 go 的 pkg 的命名、方法等都會有不同。這可能會引起你在編譯 gocode 時報錯。
從 github 上擷取 gocode 代碼:
git clone git://github.com/nsf/gocode.git
進入 gocode 目錄,編譯並安裝:
cd gocode&make install
在我的編譯過程中,出現如下錯誤:
mikespook@mikespook-desktop:~/Desktop/gocode$ make install8g -o _go_.8 gocode.go autocompletefile.go package.go autocompletecontext.go server.go rpc.go decl.go apropos.go scope.go ripper.go config.go declcache.go os_posix.goautocompletefile.go:230: undefined: ast.TypeCaseClauseautocompletefile.go:232: undefined: ast.TypeCaseClauseautocompletefile.go:246: typechecking loopmake: *** [_go_.8] 錯誤 1
這是由於 go/ast 中的 TypeCaseClause 已經改名為 CaseClause。用下面的 patch 即可解決這個問題:
diff --git a/autocompletefile.go b/autocompletefile.goindex e08e161..c0c83c4 100644--- a/autocompletefile.go+++ b/autocompletefile.go@@ -227,17 +227,17 @@ func (f *AutoCompleteFile) processTypeSwitchStmt(a *ast.TypeSwitchStmt) { } } - var lastCursorAfter *ast.TypeCaseClause+ var lastCursorAfter *ast.CaseClause for _, s := range a.Body.List {- if cc := s.(*ast.TypeCaseClause); f.cursor > f.fset.Position(cc.Colon).Offset {+ if cc := s.(*ast.CaseClause); f.cursor > f.fset.Position(cc.Colon).Offset { lastCursorAfter = cc } } if lastCursorAfter != nil { if tv != nil {- if lastCursorAfter.Types != nil && len(lastCursorAfter.Types) == 1 {- tv.Type = lastCursorAfter.Types[0]+ if lastCursorAfter.List != nil && len(lastCursorAfter.List) == 1 {+ tv.Type = lastCursorAfter.List[0] tv.Value = nil } f.scope.addNamedDecl(tv)
完成後,安裝程式會自動將編譯好的 gocode 可執行檔複製到 $GOBIN 目錄中。所以請務必確保 $GOBIN 設定正確。
對於 VIM 來說:
首先確保 $GOROOT/misc/vim 中的 Go VIM 指令碼正確安裝配置。可參考我的 vim 配置:https://bitbucket.org/mikespook/foobar/src/b7dbcbdbf3dd/vim/
然後安裝 gocode 的 vim 指令碼,可以簡單執行 gocode 提供的 shell 指令碼:
cd gocode/vim && ./update.bash
實際上,這個指令碼做了以下工作:
#!/usr/bin/env bashmkdir -p ~/.vim/{autoload,ftplugin}cp autoload/gocomplete.vim ~/.vim/autoloadcp ftplugin/go.vim ~/.vim/ftplugin
確保 vim 啟用了 filetype 外掛程式,.vimrc 中應當有:
filetype plugin on
好了,用 現在可以呼出 go 語言的自動補全了。
我為了方便,將 Ctrl+Space 映射為自動補全快速鍵:
imap <C-Space> <C-x><C-o>
由於我不用 Emacs,所以 Emacs 黨請繞道官方文檔吧……;)
【最新更新】
根據作者提供的線索,使用 golang 的 weekly 版本是不需要打補丁的。所以,正確的 golang 安裝版本是【3b4e9c85b643 weekly/weekly.2011-03-15】
hg up -r weeklyhg id
在 7787 版本 CaseClause 才與 TypeCaseClause 合并到一起,成為 CaseClause。