非root环境安装YouCompleteMe

在linux,尤其是无root权限的服务器上安装YouCompleteMe也是个挑战。

参考这篇文章,https://www.jianshu.com/p/c24f919097b3
执行make安装的方式,不论使用DEXTERNAL_LIBCLANG_PATH的方式,还是-DPATH_TO_LLVM_ROOT=自己下载的clang-llvm包的方式,
都只能做到基本的头文件和字符串补全,无法实现语义补全。

由于是非root环境,无法sudo安装正确的llvm-8到系统路径。

一个解决方案是安装linuxbrew,brew可以支持非root安装大量包到其目录,包括gcc,llvm等难以安装的包。
不过linuxbrew安装也会遇到一些问题,记录在ubuntu上安装brew中。

假定linuxbrew已经安装好llvm。
.zshrc配置

1
2
3
4
5
6
## Setup linux brew
export LINUXBREWHOME=$HOME/.linuxbrew
export PATH=$LINUXBREWHOME/bin:$PATH
export MANPATH=$LINUXBREWHOME/man:$MANPATH
export PKG_CONFIG_PATH=$LINUXBREWHOME/lib64/pkgconfig:$LINUXBREWHOME/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LINUXBREWHOME/lib64:$LINUXBREWHOME/lib:$LD_LIBRARY_PATH

因此默认的python将说linuxbrew的版本。

1
2
$ which python
$HOME/.linuxbrew/bin/python # $HOME指用户根目录,实际输出不是它

在YouCompleteMe目录采用$python install.py --clangd-completer的方式进行安装。
可以实现语义补全了,比如struct A{int x;}; A a; 然后敲a.的时候能够弹出x了。

但是还存在一些问题。如vector<int> vec;会报错youcompleteme undeclared identifier 'vector,而
std::vector<int> vec则会报错no member named 'vector' in namespace 'std'

几经折腾,比如clangd-completer换成clang-completer等,还是存在相同的问题。

最后可行的方案。

1
$python install.py --clangd-completer

.vimrc配置

1
2
3
4
5
let g:ycm_server_python_interpreter='$HOME/.linuxbrew/bin/python'                                                                                                                     let g:ycm_global_ycm_extra_conf = '$HOME/.vim/.ycm_extra_conf.py'
" Let clangd fully control code completion
let g:ycm_clangd_uses_ycmd_caching = 0
" Use installed clangd, not YCM-bundled clangd which doesn't get updates.
let g:ycm_clangd_binary_path = exepath("clangd")