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-completecompany-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

 

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

* 歡迎轉載,但請注明出處哦 *

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2024 CODEPRJ.COM