Mac安装配置YouCompleteMe

首先,确保你使用最新版本的vim。可以使用homebrew安装。
$ brew install vim
如果没有安装brew的话,可以在终端运行下列脚本安装。
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
查看你的vim支持哪个python版本
$ vim --version
如果只支持python2,则切记不要再去安装另一个python2,因为mac系统自带python2。如果你还安装了另一个python2,则可能会导致编译和使用YCM时使用的python2版本不相同。我之前就是因为这个原因失败了多次。

YouCompleteMe unavailable:cannot import name _remove_dead_weakref

我找了好久才找到解决方法,即删除掉brew安装的python@2
$ brew uninstall python@2
然后,问题解决。


安装YCM

对于YCM的安装,可以使用vim插件管理工具Vundle或者Plug。我在这里给出Plug的安装方法。

在你的vimrc中加入下面三行,然后在vim中运行PlugInstall,接下来会自动安装,等待它安装完成即可。

call plug#begin('~/.vimrc/plugged')
Plug 'Valloric/YouCompleteMe'
call plug#end()

如果你没有安装Plug,可以这样安装。

$ mkdir ~/.vim/autoload/
$ cd ~/.vim/autoload/
$ wget https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

如果你没有使用Vundle或Plug安装YCM,那么请确保你所安装的YCM的完整性。可以运行下列命令检查。
$ git submodule update --init --recursive


编译YCM

编译需要cmakepython-dev的支持。mac中python-dev是现成的。
$ brew install cmake
如果你需要C家族语言的语义支持,完成下列步骤,否则跳过。

  • 下载最新版本的libclang
  • 只有在你的系统libclang版本高于3.9时才可以使用,否则不能。但即使它是,官方也建议尽可能使用llvm.org的官方二进制文件,这确保为你的操作系统下载正确的存档文件。
编译ycm_core

这个库是YCM用来获得快速补全的C++引擎。

在这里,我假设你使用Plug安装了YCM。这意味着顶级YCM目录在~/.vim/plugged/YouCompleteMe。

我们将创建一个新文件夹,其中将放置构建文件。运行以下命令:

$ cd ~
$ mkdir ycm_build
$ cd ycm_build

接下来生成makefiles,如果不关心C家族语言语义支持,则运行如下命令。
$ cmake -G "Unix Makefiles" . ~/.vim/plugged/YouCompleteMe/third_party/ycmd/cpp
如果关心C家族语言语义支持,就比较麻烦一点。

首先将你在llvm.org官网下载的二进制文件解压到一个新的目录~/ycm_temp下,然后执行如下命令

$ cd ycm_build
$ cmake -G "Unix Makefiles" -DPATH_TO_LLVM_ROOT=~/ycm_temp/filename . ~/.vim/plugged/YouCompleteMe/third_party/ycmd/cpp

最后,生成ycm_core
$ cmake --build . --target ycm_core --config Release
至此,YCM就安装完成了。此时,ycm_build以及ycm_temp目录都可以删除,不影响YCM的使用。


配置YCM

.vimrc

" YouCompleteMe   
let g:ycm_server_python_interpreter='/usr/bin/python'
let g:ycm_global_ycm_extra_conf = '~/.vim/plugged/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py'  
" 让Vim的补全菜单行为与一般IDE一致  
set completeopt=longest,menu
" 离开插入模式后自动关闭预览窗口  
autocmd InsertLeave * if pumvisible() == 0|pclose|endif 
let g:ycm_min_num_of_chars_for_completion       =  1         " 触发(符号)补全时需要键入的字符数
let g:ycm_min_num_identifier_candidate_chars    =  0         " 补全候选项的最小字符数
let g:ycm_show_diagnostics_ui                   =  0         " 关闭诊断显示功能(已经使用了ale进行异步语法检查)
let g:ycm_complete_in_comments                  =  1         " 在注释中仍会触发补全
let g:ycm_complete_in_strings                   =  1         " 在字符串中也会触发补全
let g:ycm_cache_omnifunc                        =  0         " 禁止缓存匹配项,每次都重新生成匹配项

" 自动触发语义补全
let g:ycm_semantic_triggers =  { 
            \ 'c,cpp,python,java,go,erlang,perl': ['re!\w{1}'],
            \ 'cs,lua,javascript': ['re!\w{1}'],
            \ }
" 遇到下列文件时才会开启YCM
let g:ycm_filetype_whitelist = { 
            \ "c":1,
            \ "cpp":1, 
            \ "objc":1,
            \ "python":1,
            \ "sh":1,
            \ }
" 跳转到声明或定义处
nnoremap <leader>j :YcmCompleter GoToDefinitionElseDeclaration<cr> 
" 重新加载YCM(每次改变配置时需要)
nnoremap <leader><leader>y :YcmRestartServer<cr>

.ycm_extra_conf.py
查看库路径
echo | clang -v -E -x c++ -
上面的命令会包含以下输出
#include "..." search starts here:
#include <...> search starts here:
...
End of search list.

将这两者之间的内容替换到.ycm_extra_conf.py中的-isystem后面即可。

猜你喜欢

转载自blog.csdn.net/qq_41145192/article/details/81479538