需求背景
之前写过 YouCompleteMe(以下简称ycm) 的研究和配置,但是 ycm 只能用于 vim。如果其他编辑器比如 EMACS、vscode 等想用这种补全机制的话,该怎么办呢?
鉴于这个需求,ycm 的作者又重新开了个项目(该项目便是 ycmd),以便让其他编辑器也可以用上这种补全机制。
那么这种补全机制是什么机制呢?说到底就是 client-server 模式。真正基于 libclang 的语义补全逻辑成为 server(或者说后端),这个后端给每个编辑器插件流出了接口,每个编辑器的插件调用这个接口就可以用上这种机制的补全了。这种机制对于从事过软件开发的人员应该都不会陌生。
因此,之前的 ycm 项目相当于一个完整的 client+server,而作者新开的 ycmd 项目相当于把 server 单独拎出来了。这样一来就很好理解整个链路的原理了。
如何安装
安装教程作者在 ycmd 项目主页也说得很清楚了,同时之前的那篇研究 ycm 安装配置的文章也说得很清楚,这里再次做个简单总结。
一、安装其他依赖
sudo apt-get install build-essential cmake python-dev
二、clone 下来 ycmd 项目
git clone https://github.com/Valloric/ycmd.git
三、更新子模块
git submodule update --init --recursive
四、build ycmd
1. ./build.py --参数
,可以用./build.py --help
查看可以填写的参数;
2. 其他的 build 方法参见之前写的那篇研究 ycm 的文章。
EMACS 对应配置
一、安装 EMACS 的 package emacs-ycmd
二、配置 init.el (更详细的参见 emacs-ycmd 的 GitHub 主页)
(require 'ycmd)
;; 如果配置不生效打开这两句注释
;; (add-hook 'c++-mode-hook 'company-mode)
;; (add-hook 'c++-mode-hook 'ycmd-mode)
(add-hook 'after-init-hook #'global-ycmd-mode)
;; 这里我复用的之前给 vim 安装 ycm 时 build 出来的 ycmd
(set-variable 'ycmd-server-command '("/usr/local/bin/python2" "/Users/yj/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/"))
;; (set-variable 'ycmd-global-config "/path/to/.ycm_extra_conf.py")
(require 'company-ycmd)
(company-ycmd-setup)