上篇随笔记录了在emacs中使用go-mode和goflymake搭建了go语言的简单编程环境(推送门),今天来记录一下使用gocode+auto-complete配置emacs中go语言的自动补全功能。先看一下效果图😄,个人emacs配置能够参考myemacs-conf。html
gocode是nsf写的各类编辑器提供go语言自动补全功能的工具。参考github中的README.md对gocode进行一下安装。c++
$ go get -u github.com/nsf/gocode
安装完gocode后,运行下面命令设置一下gocode的propose-builtins(默认为false,不会自动联想go语言内置的类型、常量和方法等),git
$ gocode set propose-builtins true
下面开始设置emacs。github
能够在emacs中配置auto-complete和company-mode来结合gocode提供go语言的自动补全功能,gocode库中也分别提供了针对这两种配置的指南。本身都配置来体验了一下,仍是以为auto-complete使用起来的体验好点。这里就纪录一下auto-complete的配置了,关于company-mode的配置能够参考emacs-company进行配置。编程
auto-complete的官方使用手册中提供了安装方法。我是采用手工安装的方式进行安装,先下载auto-complete代码库,缓存
$ git clone https://github.com/auto-complete/auto-complete.git
而后进入auto-complete目录,经过etc/install.el进行自动安装,dom
$ 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所在目录。post
从gocode发行包或者gocode的源代码库中拷贝emacs/go-autocomplete.ele文件到~/.emacs.d目录,而后在~/.emacs配置文件中添加下面配置内容,
(require 'go-autocomplete) (require 'auto-complete-config) (ac-config-default)
因而,emacs的go语言自动补全功能就能够用了。不过,还须要对默认的配置进行一下修改了提供易用性。
auto-complete能够经过ac-ignore-case变量来控制联想是否忽略大小写,
;; 设置为t表示忽略大小写,设置为nil表示区分大小写 ;; 默认状况下为smart,表示若是输入的字符串不含有大写字符才会忽略大小写 (setq ac-ignore-case t)
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)
默认状况下,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的详细使用说明,请参考官方使用文档。这里只说一下几项简单的使用说明。
自动联想列表显示以后,<TAB>键便临时被赋予了选择联想项的功能。存在下面三种状况:
<RET>键用于使用选中项自动补全,其效果有:
所谓联想项的帮助信息,就是关于联想项的详细说明文档。 auto-complete有两种帮助显示方式:
关于quick help,以下图中黄色区域所示,上下选择联想项后,auto-complete默认显示该联想项的文档说明(若是存在的话)。
若是某个联想项的帮助信息太多,quick help显示不太方便查看,能够按f1键来打开buffer help来查看,以下图所示。可使用C-M-v或者C-M-S-v快捷键来上下滚动buffer help缓冲区以查看帮助信息,其它快捷键将致使buffer help缓冲区自动关闭。
字典是字符串的列表,auto-complete能够经过字典提供自动联想项的配置。 auto-complete支持三种类型字典:
参考列表:
http://dominik.honnef.co/posts/2013/03/emacs-go-1/
https://github.com/nsf/gocode
http://auto-complete.org/doc/manual.html
***************
* 欢迎转载,但请注明出处哦 *
***************