首页 > 代码库 > 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语言自动补全功能