gocode+auto-complete搭建emacs的go語言自動補全功能

上篇隨筆記錄了在emacs中使用go-mode和goflymake搭建了go語言的簡單編程環境(推送門),今天來記錄一下使用gocode+auto-complete配置emacs中go語言的自動補全功能。先看一下效果圖😄,個人emacs配置能夠參考myemacs-confhtml

關於gocode

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

 能夠在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進行自動安裝,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

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

 

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

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

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

相關文章
相關標籤/搜索