首页 > 代码库 > gocode+auto-complete搭建emacs的go语言自动补全功能

gocode+auto-complete搭建emacs的go语言自动补全功能

上篇随笔记录了在emacs中使用go-mode和goflymake搭建了go语言的简单编程环境(推送门),今天来记录一下使用gocode+auto-complete配置emacs中go语言的自动补全功能。先看一下效果图??,我的emacs配置可以参考myemacs-conf。

技术分享

关于gocode

gocode是nsf写的各种编辑器提供go语言自动补全功能的工具。参考github中的README.md对gocode进行一下安装。

$ go get -u github.com/nsf/gocode

安装完gocode后,运行下面命令设置一下gocode的propose-builtins(默认为false,不会自动联想go语言内置的类型、常量和方法等),

$ gocode set propose-builtins true

下面开始设置emacs。

emacs配置auto-complete

 可以在emacs中配置auto-complete和company-mode来结合gocode提供go语言的自动补全功能,gocode库中也分别提供了针对这两种配置的指南。自己都配置来体验了一下,还是觉得auto-complete使用起来的体验好点。这里就纪录一下auto-complete的配置了,关于company-mode的配置可以参考emacs-company进行配置。

 1. 安装auto-complete

auto-complete的官方使用手册中提供了安装方法。我是采用手工安装的方式进行安装,先下载auto-complete代码库,

$ git clone https://github.com/auto-complete/auto-complete.git

然后进入auto-complete目录,通过etc/install.el进行自动安装,

$ cd auto-complete/$ emacs -batch -l etc/install.el

安装命令会提供“Install to:”,让你输入要安装的目标目录,例如输入 ~/.emacs.d。安装成功后,会提示如下内容,

Successfully installed!Add the following code to your .emacs:(add-to-list ‘load-path "~/.emacs.d")    (require ‘auto-complete-config)(add-to-list ‘ac-dictionary-directories "~/.emacs.d/ac-dict")(ac-config-default)

按照提示将相关配置添加到~/.emacs配置文件中即可。

这里需要说明个问题:我在安装完成后,在加载auto-complete-mode的时候,会提示找不到popup。于是需要自己下载popop.el文件,并靠背到auto-complete.el所在目录。

2. 安装并配置go-autocomplete

从gocode发行包或者gocode的源代码库中拷贝emacs/go-autocomplete.ele文件到~/.emacs.d目录,然后在~/.emacs配置文件中添加下面配置内容,

(require ‘go-autocomplete)(require ‘auto-complete-config)(ac-config-default)

于是,emacs的go语言自动补全功能就可以用了。不过,还需要对默认的配置进行一下修改了提供易用性。

3. 增强配置

i. 联想忽略大小写

auto-complete可以通过ac-ignore-case变量来控制联想是否忽略大小写,

;; 设置为t表示忽略大小写,设置为nil表示区分大小写;; 默认情况下为smart,表示如果输入的字符串不含有大写字符才会忽略大小写(setq ac-ignore-case t)

ii. 上下选择联想项的快捷键

auto-complete提供了TAB、UP、DOWN、M-p和M-n来上下移动选择自动联想项。对于emacs使用惯的用户都习惯了使用C-p和C-n来上下移动,而且在Mac OS X系统下M-p和M-n快捷键实在是不太好按。

(setq ac-use-menu-map t)(define-key ac-menu-map "\C-n" ‘ac-next)(define-key ac-menu-map "\C-p" ‘ac-previous)

iii. go-mode模式下联想项来源配置

默认情况下,go语言的自动补全会存在下面一个问题:md5和md5Inst的联想项重复出现。

技术分享

在emacs的该缓冲区中运行M-: ac-sources看了一下,ac-sources(关于ac-sources是什么,简单说就是auto-complete自动联想显示的数据从哪里来的,更详细信息请参考官方文档)的值为(ac-source-go ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers)。问题就处在ac-source-go和ac-source-words-in-same-mode-buffers这两个。auto-complete通过ac-source-go获取的gocode提供的分析数据(前面两项),又通过ac-source-words-in-same-mode-buffers中获取了在该文件中出现的单词(后面三项),于是导致出现了重复。我们通过修改go-autocomplete.el文件了删除掉ac-source-words-in-same-mode-buffers。

(add-hook ‘go-mode-hook #‘(lambda() (setq ac-sources ‘(ac-source-go ac-source-abbrev ac-source-dictionary))))

现在的效果如下,没有出现重复项了,

技术分享

auto-complete一些使用说明

关于auto-complete的详细使用说明,请参考官方使用文档。这里只说一下几项简单的使用说明。

1. 联想项的选择

<TAB>键的使用

自动联想列表显示之后,<TAB>键便临时被赋予了选择联想项的功能。存在下面三种情况:

  • 只有一个联想项时,按<TAB>便是用该联想项自动补全;
  • 存在多个联想项,并且所有联想项存在共同前缀,则自动补全共同前缀;
  • 否则,用于在联想项列表中循环选择;

<RET>键的使用

<RET>键用于使用选中项自动补全,其效果有:

  • 立即自动补全当前选中的联想项;
  • 如果该选中联想项包含动作,则执行该动作。

其它选择键

  • 可用<up>或M-p选择上一个联想项,<down>或M-n选择下一个联想项;
  • 使用M-<digit>快速使用联想列表中前10个联想项自动补全。

2. 联想项帮助信息

所谓联想项的帮助信息,就是关于联想项的详细说明文档。 auto-complete有两种帮助显示方式:

  • quick help:所谓的quick help就是在选择一个联想项后,在该联想项的右边以popup的方式显示帮助信息;
  • buffer help:所谓buffer help就是在一个buffer中显示帮助信息。当联想项的帮助信息太长,quick help方式显示不方便查看时,可以选择buffer help方式。通过上下键选择一个联想项后,按键即可显示buffer help,然后通过C-M-v或C-M-S-v来上下滚动buffer help内容,其它键将会导致buffer help自动关闭。

关于quick help,如下图中黄色区域所示,上下选择联想项后,auto-complete默认显示该联想项的文档说明(如果存在的话)。

技术分享

如果某个联想项的帮助信息太多,quick help显示不太方便查看,可以按f1键来打开buffer help来查看,如下图所示。可以使用C-M-v或者C-M-S-v快捷键来上下滚动buffer help缓冲区以查看帮助信息,其它快捷键将导致buffer help缓冲区自动关闭。

技术分享

3. 使用字典提供联想项

字典是字符串的列表,auto-complete可以通过字典提供自动联想项的配置。 auto-complete支持三种类型字典:

  • user defined dictionary:用户自定义字典,包括两个列表ac-user-dictionary和ac-user-dictionary-files。其中ac-user-dictionary用于添加联想项的字符串列表,修改后立即生效;而ac-user-dictionary-files则是一个自定义字典文件的列表,这些自定义字典文件都是以换行符分割的联想项序列,默认情况下~/.dict也是一个自定义字典文件(自定义字典文件会使用缓存,所以修改不会自动生效,可以运行ac-clear-disctionary-cache来使其生效)。注:用户自定义字典可以用于所有缓冲区。
  • Major Mode Dictionary:以emacs主模式(major mode)命令的字典将只会在该主模式的缓冲区中生效,例如命名为c++-mode的字典只在c++-mode模式的缓冲区中生效。主模式字典文件是从ac-dictionary-directories指定的目录列表中加载的。auto-complete的github库的dict目录下提供了主要emacs主模式的字典文件。(注:修改或添加后,同样需要运行ac-clear-disctionary-cache来清除缓存)
  • Extension Dictionary:扩展名字典,从名称上我们可以看出它是针对文件扩展名来生效的。例如命名为cpp的字典文件只在*.cpp的缓冲区中生效。扩展名字典同样是从ac-dictionary-directories指定的目录列表中查找的。其也存在缓存。

 

 参考列表:

http://dominik.honnef.co/posts/2013/03/emacs-go-1/

https://github.com/nsf/gocode

http://auto-complete.org/doc/manual.html

 

***************

* 欢迎转载,但请注明出处哦 *

***************

gocode+auto-complete搭建emacs的go语言自动补全功能