Emacs 自動補全插件 ycmd


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 的頭文件目錄。

 

完。

 

 


免責聲明!

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



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