在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
5let 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")