gocode——VIM 和 Emacs 的 golang 代码自动补全

标签: Stardy & Research autocompletion emacs gocode golang | 发表时间:2011-03-18 11:33 | 作者:mikespook XiaoHui
出处:http://www.mikespook.com

虽然 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 install
8g -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.go
autocompletefile.go:230: undefined: ast.TypeCaseClause
autocompletefile.go:232: undefined: ast.TypeCaseClause
autocompletefile.go:246: typechecking loop
make: *** [_go_.8] 错误 1

这是由于 go/ast 中的 TypeCaseClause 已经改名为 CaseClause。用下面的 patch 即可解决这个问题:

diff --git a/autocompletefile.go b/autocompletefile.go
index 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 bash
mkdir -p ~/.vim/{autoload,ftplugin}
cp autoload/gocomplete.vim ~/.vim/autoload
cp 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 weekly
hg id

在 7787 版本 CaseClause 才与 TypeCaseClause 合并到一起,成为 CaseClause。

相关 [gocode vim emacs] 推荐:

gocode——VIM 和 Emacs 的 golang 代码自动补全

- XiaoHui - Some reminiscences, some memories
虽然 golang 自身提供了 VIM 的语法高亮之类的脚本,但 autocompletion 并没有官方解决方案. 无意之中发现 gocode 这个支持 VIM 和 Emacs 的 autocompletion daemon. 这里有个Flash 动画演示,展示了 gocode 的强大. 我得说,用过之后,感觉速度确实够快.

我是如何从vim转向Emacs的

- flychen50 - Emacs中文网
以前,我多次试图从 vim 转变到 emacs 都失败了. 原因很多,主要原因是 vim 的确一个很强大的 editor 不愧为 emacs 的主要竞争对手,vim 很多强大的功能,很难在 emacs 中找到相应的功能,那个时候还没有水木Emacs版,如果有的话,情况会好一些, 还有一个原因就是我周围几乎没有人用 emacs ,现在也是.

为何 Emacs 和 Vim 被称为两大神器

- mgo - LinuxTOY
Emacs 是神的编辑器,而 Vim 是编辑器之神. 二者为何会有如此美誉,且听本文向你一一道来. Author: Jiqing Wu email:[email protected] homepage:http:://hi.baidu.com/jiqing0925 create:2011-01-09 update:2011-01-09 面向的读者:经常用电脑处理文本和编程的同学.

灵异 Emacs 之画皮

- 月乾 - LinuxTOY
好吧,这回真的是一个小技巧,我以本站站长的名誉担保……如果你觉得我撒谎了,你可以把站长找出来随意处置……(神秘的声音:偶们是无辜的,找 Kardinal 就行). 话说比较讲究的同学,都喜欢给 emacs 设置个漂亮的字体,一般都是矢量字体,大黑二黑三黑啥的,就不点名了,你懂的……. 可是这样也有麻烦的时候,比如说我最近比较爱玩的 eshell ,或者版本控制的 diff 界面之类的……总之,有些情况下,用点阵字体又比较舒服点.

emacs 新手必看: undo-tree

- leafduo - LinuxTOY
火星人都知道,emacs 只有 undo ,没有 redo ……或者说它有 redo,但是相当的诡异,套用一句经典台词就是: 猥琐,非常的猥琐. 简单的说,emacs 的 redo 就是 undo undo ,也就是传说中的负负得正. 可能有些 emacs 新手,还不知道怎么去操作,因为一般情况下,无论你 undo 多少次,都不会发生 redo 的现象.

配置 Emacs 的小技巧

- return - LinuxTOY
前几天……大约在冬季吧,我发现了一个惊天小技巧,当然,是关于 Emacs 的……看到标题你也应该猜到. 这事要从很久以前说起,我很久以前用 Vim ,很久很久以前用 Emacs ,很久很久很久以前用 Vim ……你知道的,我也不知道我到底在多久以前用 Emacs 或者 Vim…… 后来,出了个叫 Vimim 的东东,输入法再也不用担心我的切换了.

Vim初探(一)

- Lee - 博客园-首页原创精华区
  Vim是一款简单而强大的文本编辑器,它能以简单的方式完成复杂的操作. Vim(http://www.vim.org/)是一款开源软件,提供Windows, Linux和MacOS上的多平台的版本. MacOS上的Vim称为MacVim(http://code.google.com/p/macvim/).

Vim 秘籍表

- fandunqiu - LinuxTOY
献给程序员们,彩色风格的 VIM 速查秘籍表,适合打印、设为桌面背景或放置到专门的数码相框. 同时还提供 300DPI 的清晰版、黑白和适用于红绿色盲人士的版本,请移步至作者站点下载. 消息来源:CoolShell 作者 陈皓. 分类: Screenshots, Vim plugins |. 收藏到 del.icio.us |.

Vim学习笔记

- 临池学书 - C++博客-首页原创精华区
最近在学习Vimtutor中的相关内容,Vim的使用博大精深,很多命令一旦不使用就会忘记,下面把其中的没有使用到的相关命令做一个简单的总结,供以后复习使用. 至于常见的保存,插入等等命令,则不予记录,在以后的使用中加深练习即可. To change until the end of a word, type  ce (ce + 修正的单词).

Emacs被发现未遵守GPL许可

- elis - Solidot
Emacs 23.2和23.3被发现没有遵守GPL许可证的要求公开所有源代码. 自2009年12月9日Emacs 23.1.90发布起,Emacs发行包包含了众多用Bison创建的未提供源代码的解析器. Emacs作者、自由软件基金会主席Richard Stallman称此事不仅仅是法律问题,而且是道德问题.