上篇隨筆記錄了在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
***************
* 歡迎轉載,但請注明出處哦 *
***************