gocode+auto-complete搭建emacs的go语言自动补全功能
上篇隨筆記錄了在emacs中使用go-mode和goflymake搭建了go語言的簡單編程環(huán)境(推送門),今天來記錄一下使用gocode+auto-complete配置emacs中g(shù)o語言的自動(dòng)補(bǔ)全功能。先看一下效果圖?,我的emacs配置可以參考myemacs-conf。
關(guān)于gocode
gocode是nsf寫的各種編輯器提供go語言自動(dòng)補(bǔ)全功能的工具。參考github中的README.md對(duì)gocode進(jìn)行一下安裝。
$ go get -u github.com/nsf/gocode安裝完gocode后,運(yùn)行下面命令設(shè)置一下gocode的propose-builtins(默認(rèn)為false,不會(huì)自動(dòng)聯(lián)想go語言內(nèi)置的類型、常量和方法等),
$ gocode set propose-builtins true下面開始設(shè)置emacs。
emacs配置auto-complete
?可以在emacs中配置auto-complete和company-mode來結(jié)合gocode提供go語言的自動(dòng)補(bǔ)全功能,gocode庫中也分別提供了針對(duì)這兩種配置的指南。自己都配置來體驗(yàn)了一下,還是覺得auto-complete使用起來的體驗(yàn)好點(diǎn)。這里就紀(jì)錄一下auto-complete的配置了,關(guān)于company-mode的配置可以參考emacs-company進(jìn)行配置。
?1. 安裝auto-complete
auto-complete的官方使用手冊(cè)中提供了安裝方法。我是采用手工安裝的方式進(jìn)行安裝,先下載auto-complete代碼庫,
$ git clone https://github.com/auto-complete/auto-complete.git然后進(jìn)入auto-complete目錄,通過etc/install.el進(jìn)行自動(dòng)安裝,
$ cd auto-complete/ $ emacs -batch -l etc/install.el安裝命令會(huì)提供“Install to:”,讓你輸入要安裝的目標(biāo)目錄,例如輸入 ~/.emacs.d。安裝成功后,會(huì)提示如下內(nèi)容,
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)按照提示將相關(guān)配置添加到~/.emacs配置文件中即可。
這里需要說明個(gè)問題:我在安裝完成后,在加載auto-complete-mode的時(shí)候,會(huì)提示找不到popup。于是需要自己下載popop.el文件,并靠背到auto-complete.el所在目錄。
2. 安裝并配置go-autocomplete
從gocode發(fā)行包或者gocode的源代碼庫中拷貝emacs/go-autocomplete.ele文件到~/.emacs.d目錄,然后在~/.emacs配置文件中添加下面配置內(nèi)容,
(require 'go-autocomplete) (require 'auto-complete-config) (ac-config-default)于是,emacs的go語言自動(dòng)補(bǔ)全功能就可以用了。不過,還需要對(duì)默認(rèn)的配置進(jìn)行一下修改了提供易用性。
3. 增強(qiáng)配置
i. 聯(lián)想忽略大小寫
auto-complete可以通過ac-ignore-case變量來控制聯(lián)想是否忽略大小寫,
;; 設(shè)置為t表示忽略大小寫,設(shè)置為nil表示區(qū)分大小寫 ;; 默認(rèn)情況下為smart,表示如果輸入的字符串不含有大寫字符才會(huì)忽略大小寫 (setq ac-ignore-case t)ii. 上下選擇聯(lián)想項(xiàng)的快捷鍵
auto-complete提供了TAB、UP、DOWN、M-p和M-n來上下移動(dòng)選擇自動(dòng)聯(lián)想項(xiàng)。對(duì)于emacs使用慣的用戶都習(xí)慣了使用C-p和C-n來上下移動(dòng),而且在Mac OS X系統(tǒng)下M-p和M-n快捷鍵實(shí)在是不太好按。
(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模式下聯(lián)想項(xiàng)來源配置
默認(rèn)情況下,go語言的自動(dòng)補(bǔ)全會(huì)存在下面一個(gè)問題:md5和md5Inst的聯(lián)想項(xiàng)重復(fù)出現(xiàn)。
在emacs的該緩沖區(qū)中運(yùn)行M-: ac-sources看了一下,ac-sources(關(guān)于ac-sources是什么,簡單說就是auto-complete自動(dòng)聯(lián)想顯示的數(shù)據(jù)從哪里來的,更詳細(xì)信息請(qǐng)參考官方文檔)的值為(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這兩個(gè)。auto-complete通過ac-source-go獲取的gocode提供的分析數(shù)據(jù)(前面兩項(xiàng)),又通過ac-source-words-in-same-mode-buffers中獲取了在該文件中出現(xiàn)的單詞(后面三項(xiàng)),于是導(dǎo)致出現(xiàn)了重復(fù)。我們通過修改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))))現(xiàn)在的效果如下,沒有出現(xiàn)重復(fù)項(xiàng)了,
auto-complete一些使用說明
關(guān)于auto-complete的詳細(xì)使用說明,請(qǐng)參考官方使用文檔。這里只說一下幾項(xiàng)簡單的使用說明。
1. 聯(lián)想項(xiàng)的選擇
<TAB>鍵的使用
自動(dòng)聯(lián)想列表顯示之后,<TAB>鍵便臨時(shí)被賦予了選擇聯(lián)想項(xiàng)的功能。存在下面三種情況:
- 只有一個(gè)聯(lián)想項(xiàng)時(shí),按<TAB>便是用該聯(lián)想項(xiàng)自動(dòng)補(bǔ)全;
- 存在多個(gè)聯(lián)想項(xiàng),并且所有聯(lián)想項(xiàng)存在共同前綴,則自動(dòng)補(bǔ)全共同前綴;
- 否則,用于在聯(lián)想項(xiàng)列表中循環(huán)選擇;
<RET>鍵的使用
<RET>鍵用于使用選中項(xiàng)自動(dòng)補(bǔ)全,其效果有:
- 立即自動(dòng)補(bǔ)全當(dāng)前選中的聯(lián)想項(xiàng);
- 如果該選中聯(lián)想項(xiàng)包含動(dòng)作,則執(zhí)行該動(dòng)作。
其它選擇鍵
- 可用<up>或M-p選擇上一個(gè)聯(lián)想項(xiàng),<down>或M-n選擇下一個(gè)聯(lián)想項(xiàng);
- 使用M-<digit>快速使用聯(lián)想列表中前10個(gè)聯(lián)想項(xiàng)自動(dòng)補(bǔ)全。
2. 聯(lián)想項(xiàng)幫助信息
所謂聯(lián)想項(xiàng)的幫助信息,就是關(guān)于聯(lián)想項(xiàng)的詳細(xì)說明文檔。 auto-complete有兩種幫助顯示方式:
- quick help:所謂的quick help就是在選擇一個(gè)聯(lián)想項(xiàng)后,在該聯(lián)想項(xiàng)的右邊以popup的方式顯示幫助信息;
- buffer help:所謂buffer help就是在一個(gè)buffer中顯示幫助信息。當(dāng)聯(lián)想項(xiàng)的幫助信息太長,quick help方式顯示不方便查看時(shí),可以選擇buffer help方式。通過上下鍵選擇一個(gè)聯(lián)想項(xiàng)后,按鍵即可顯示buffer help,然后通過C-M-v或C-M-S-v來上下滾動(dòng)buffer help內(nèi)容,其它鍵將會(huì)導(dǎo)致buffer help自動(dòng)關(guān)閉。
關(guān)于quick help,如下圖中黃色區(qū)域所示,上下選擇聯(lián)想項(xiàng)后,auto-complete默認(rèn)顯示該聯(lián)想項(xiàng)的文檔說明(如果存在的話)。
如果某個(gè)聯(lián)想項(xiàng)的幫助信息太多,quick help顯示不太方便查看,可以按f1鍵來打開buffer help來查看,如下圖所示。可以使用C-M-v或者C-M-S-v快捷鍵來上下滾動(dòng)buffer help緩沖區(qū)以查看幫助信息,其它快捷鍵將導(dǎo)致buffer help緩沖區(qū)自動(dòng)關(guān)閉。
3. 使用字典提供聯(lián)想項(xiàng)
字典是字符串的列表,auto-complete可以通過字典提供自動(dòng)聯(lián)想項(xiàng)的配置。 auto-complete支持三種類型字典:
- user defined dictionary:用戶自定義字典,包括兩個(gè)列表ac-user-dictionary和ac-user-dictionary-files。其中ac-user-dictionary用于添加聯(lián)想項(xiàng)的字符串列表,修改后立即生效;而ac-user-dictionary-files則是一個(gè)自定義字典文件的列表,這些自定義字典文件都是以換行符分割的聯(lián)想項(xiàng)序列,默認(rèn)情況下~/.dict也是一個(gè)自定義字典文件(自定義字典文件會(huì)使用緩存,所以修改不會(huì)自動(dòng)生效,可以運(yùn)行ac-clear-disctionary-cache來使其生效)。注:用戶自定義字典可以用于所有緩沖區(qū)。
- Major Mode Dictionary:以emacs主模式(major mode)命令的字典將只會(huì)在該主模式的緩沖區(qū)中生效,例如命名為c++-mode的字典只在c++-mode模式的緩沖區(qū)中生效。主模式字典文件是從ac-dictionary-directories指定的目錄列表中加載的。auto-complete的github庫的dict目錄下提供了主要emacs主模式的字典文件。(注:修改或添加后,同樣需要運(yùn)行ac-clear-disctionary-cache來清除緩存)
- Extension Dictionary:擴(kuò)展名字典,從名稱上我們可以看出它是針對(duì)文件擴(kuò)展名來生效的。例如命名為cpp的字典文件只在*.cpp的緩沖區(qū)中生效。擴(kuò)展名字典同樣是從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
?
***************
* 歡迎轉(zhuǎn)載,但請(qǐng)注明出處哦 *
***************
轉(zhuǎn)載于:https://www.cnblogs.com/lienhua34/p/5839510.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的gocode+auto-complete搭建emacs的go语言自动补全功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1049. 数列的片段和
- 下一篇: 性味归经与功能的脚本(超过四元素)