gocode——VIM 和 Emacs 的 golang 代碼自動補全

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

雖然 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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.