Emacs 自動補全,最好的插件當屬 ycmd。以下記錄我的安裝過程。
1. 安裝 ycmd server
github 官方地址: https://github.com/Valloric/ycmd
- git 克隆 ycmd 到本地 ~/ycmd
$ git clone https://github.com/Valloric/ycmd.git ~/ycmd
- 安裝必要的編譯工具和庫
$ sudo apt-get install build-essential cmake python-dev
- 進入文件夾 ycmd,下載完整的 submodule (比較大哦。。。)
$ git submodule update --init --recursive
- 編譯 (比較慢哦。。。)
$ cd ~/ycmd
$ ./build.py --all
注意:對於最新的 ycmd,最好有選擇的 build,(因為實在沒必要在 Linux 下支持 C-sharp 的補全,而且要支持還得安裝 xbuild (xbuild 可在 sourceforge 下載,解壓縮就能用,不用裝 Mono 的 msbuild),麻煩!)
我選擇只要支持 c, c++, go, java, javascript 即可,
$ ./build.py --clang-completer --go-completer --java-completer --ts-completer --clang-tidy
編譯完成之后,會在當前目錄下生成一個 ycmd 文件夾,現在就像這樣 ~/ycmd/ycmd
2. 安裝 ycmd client,還有必要的工具
- 打開 Emacs,命令 M-x list-packages, 分別安裝 ycmd, company-ycmd, flycheck-ycmd
3. 配置,如下內容添加到 ~/.emacs
;;;;================================================= < for ycmd start >
;;;; To use ycmd-mode in all supported modes
(require 'ycmd)
(add-hook 'after-init-hook #'global-ycmd-mode)
;;;; Specify only support c/c++ mode
;;(require 'ycmd)
;;(add-hook 'c++-mode-hook 'company-mode)
;;(add-hook 'c++-mode-hook 'ycmd-mode)
;;;; Specify how to run the server
(set-variable 'ycmd-server-command '("/usr/bin/python" "/home/peterpan/ycmd/ycmd"))
;;(set-variable 'ycmd-server-command '("/usr/bin/python" "~/ycmd/ycmd")) ;; Cannot use ~, should use abspath
;;;; Specify a global emacs configuration
(set-variable 'ycmd-global-config "/home/peterpan/ycmd/examples/.ycm_extra_conf.py")
;;(set-variable 'ycmd-global-config "~/ycmd/examples/.ycm_extra_conf.py") ;; Cannot use ~, should use abspath
;;;; Completion framework
(require 'company-ycmd)
(company-ycmd-setup)
(add-hook 'after-init-hook #'global-company-mode)
;;;; Enable flycheck
(require 'flycheck-ycmd)
(flycheck-ycmd-setup)
(add-hook 'after-init-hook #'global-flycheck-mode)
;;;; Set always complete immediately
(setq company-idle-delay 0)
;;;;================================================== < for ycmd end >
補全的時候,彈出 tip 窗口,用 Meta + n 或 Meta + p 去 cycle 可選項,選中后,直接按 Enter 確認。
4. 當有新庫加入,需要更新文件 ~/ycmd/examples/.ycm_extra_conf.py
例如,我要支持 boost 的補全,則要加入 boost 頭文件路徑 /usr/local/boost_1_67_0,加到 flags 的最后即可,
flags = [ ... # for boost complete '-isystem', '/usr/local/boost_1_67_0' ]
對於 Ubuntu 18.04 的 workaround 方法
因為我之前一直用 Ubuntu 14.04 和 CentOS 7,這兩個操作系統默認的 gcc 版本是 4.8,我在這兩個系統下完成了對 emacs 的各種配置(包括 ycmd 的配置),並且各項功能都調好了。
因項目需要,在升級系統到 Ubuntu 18.04 后,為方便起見,我把舊系統的 .emacs 和 .emacs.d 拷貝到新系統的 home 目錄下, 並調整 ycmd 配置文件的內容,使其指向新系統的 c++ 頭文件目錄,但是卻不能實現 c++ 的自動補全。目前懷疑和 Ubuntu 18.04 的 gcc 和 g++ 版本有關,新系統默認的版本是 7.4。
workaround 方法是:安裝 gcc 4.8 ( $ sudo apt-get install gcc-4.8 ) 和 g++ 4.8 ( $ sudo apt-get install g++-4.8 ),並調整 ycmd 配置文件,使其指向 c++ 4.8 的頭文件目錄。
完。