Vim 自动补全集成方案

VIM

准备阶段, 一台空的centos7系统。如果你所使用的环境不是初始化的服务器的话, 以下请适当安装需要的依赖。安装这个果然是很难啊,我不得不说太难了, 翻阅了很多 资料, 各种google。 尤其是在centos上, 简直了, 如果是乌班图Ubuntu的话, 可能还好一点,因为在编译的YcmCompleteMe的时候, 自动下载的clang是Ubuntu的,所以之后需要centos需要自己编译安装

安装一些基础的依赖

yum -y update
yum -y install git
yum -y install ncurses-devel
yum install python-devel libffi-devel graphviz-devel elfutils-libelf-devel readline-devel libedit-devel libxml2-devel protobuf-devel gtext-devel doxygen swig -y

升级gcc & vim

yum install centos-release-scl -y
yum install devtoolset-3-toolchain -y
yum install gcc-c++
scl enable devtoolset-3 bash

安装最新版vim, 最好是8.0以上, 不然会出现问题。
vim //查看你的vim版本

git clone https://github.com/vim/vim.git
cd vim/src/
./configure –with-features=huge -enable-pythoninterp –with-python-config-dir=/usr/lib/python2.7/config
make && make install

安装Vundle 插件管理

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim //提示版本可能会更新, 请于github查看
vim ~/.vimrc //没有就将下面粘贴进去, 如果有错误, 请到github获取官方配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
set nocompatible              " be iMproved, required
filetype off " required=

set nocompatible " be iMproved, required
filetype off " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'tpope/vim-fugitive'
" plugin from http://vim-scripts.org/vim/scripts.html
" Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent.com/command-t.git'
" git repos on your local machine (i.e. when working on your own plugin)
" Plugin 'file:///home/gmarik/path/to/plugin'
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.
" Plugin 'ascenator/L9', {'name': 'newL9'}

" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

vim
:PluginInstall //安装插件

安装YouCompleteMe

vim ~/.vimrc

1
2
3
4
5
all vundle#begin()  
. . .
Plugin 'Valloric/YouCompleteMe’ //加入 YouCompleteMe
. . .
call vundle#end()

继续vim 然后:PluginInstall

升级Cmake

wget https://cmake.org/files/v3.11/cmake-3.11.3.tar.gz
tar xvf cmake-3.11.3.tar.gz && cd cmake-3.11.3/
./bootstrap
gmake
gmake install
//查看版本
/usr/local/bin/cmake –version
//移除自带的版本
yum remove cmake -y
//新建软连接
ln -s /usr/local/bin/cmake /usr/bin/

到这里第一部分算是完成了, 千万不能立即编译YcmCompleteMe, 因为centos根本就不会自动下载clang所以这里我们需要自己安装, 过程非常漫长, 要等待很长时间, 所以务必耐心等待

下载文件

http://releases.llvm.org/download.html#6.0.0首先到这个页面Source下面除了**LLVM Test Suite (.sig)**以外的全部下载下来

准备 LLVM 源码

LLVM 的各个子组件必须放在 LLVM 源码的固定位置,使用固定名称。
首先解压 llvm-6.0.0.src.tar.xz,生成目录 llvm-6.0.0.src
解压 tar.xz 文件使用 tar Jxvf filename.tar.xz -C 指定路径
解压文件到指定文件夹tar Jxvf filename.tar.xz -C 指定路径
mv 源文件 新文件名来修改文件名

放在 llvm-6.0.0.src/tools 目录下的组件:

解压 cfe-6.0.0.src.tar.xz,重命名为 llvm-6.0.0.src/tools/clang
解压 lld-6.0.0.src.tar.xz,重命名为 llvm-6.0.0.src/tools/lld
解压 polly-6.0.0.src.tar.xz,重命名为 llvm-6.0.0.src/tools/polly
解压 lldb-6.0.0.src.tar.xz,重命名为 llvm-6.0.0.src/tools/lldb

放在 llvm-6.0.0.src/projects 目录下的组件:

解压 openmp-6.0.0.src.tar.xz,重命名为 llvm-6.0.0.src/projects/openmp
解压 libcxx-6.0.0.src.tar.xz,重命名为 llvm-6.0.0.src/projects/libcxx
解压 libcxxabi-6.0.0.src.tar.xz,重命名为 llvm-6.0.0.src/projects/libcxxabi
解压 libunwind-6.0.0.src.tar.xz,重命名为 llvm-6.0.0.src/projects/libunwind
解压 compiler-rt-6.0.0.src.tar.xz,重命名为 llvm-6.0.0.src/projects/compiler-rt

clang 的子组件:

解压 clang-tools-extra-6.0.0.src.tar.xz,重命名为 llvm-6.0.0.src/tools/clang/tools/extra

使用 CMake 生成 Makefile

  1. cd llvm-6.0.0.src //首先进入解压的目录
  2. mkdir build && cd build
  3. cmake .. -DLLVM_OPTIMIZED_TABLEGEN=ON -DLLVM_INCLUDE_DOCS=OFF -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON -DLLVM_INSTALL_UTILS=ON -DWITH_POLLY=ON -DLINK_POLLY_INTO_TOOLS=ON -DLLVM_TARGETS_TO_BUILD=X86 -DLIBOMP_ARCH=x86_64 -DBUILD_SHARED_LIBS=ON -DLIBOMP_ENABLE_SHARED=ON -DLLVM_ENABLE_LIBCXX=ON -DLLDB_RELOCATABLE_PYTHON=ON -DLLVM_ENABLE_FFI=ON -DCMAKE_BUILD_TYPE=Release -DCLANG_DEFAULT_CXX_STDLIB=libc++ -DCLANG_DEFAULT_RTLIB=compiler-rt -DCLANG_INCLUDE_TESTS=OFF -DENABLE_LINKER_BUILD_ID=ON -DENABLE_X86_RELAX_RELOCATIONS=ON -DLIBCXXABI_INCLUDE_TESTS=OFF -DLIBCXX_INCLUDE_BENCHMARKS=OFF -DLIBCXX_INCLUDE_TESTS=OFF -DLIBOMP_TSAN_SUPPORT=ON -DLLDB_BUILD_INTEL_PT=OFF -DLLDB_INCLUDE_TESTS=OFF -DLLVM_ENABLE_OCAMLDOC=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_GO_TESTS=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INSTALL_BINUTILS_SYMLINKS=ON -DLLVM_TOOL_LLGO_BUILD=ON -DLLVM_TOOL_PARALLEL_LIBS_BUILD=ON -DLLVM_ENABLE_PIC=ON -DLIBUNWIND_ENABLE_SHARED=OFF -DLIBCXX_ENABLE_PEDANTIC=ON -DLIBCXXABI_LIBDIR_SUFFIX=64 -DLIBCXX_LIBDIR_SUFFIX=64 -DLIBUNWIND_LIBDIR_SUFFIX=64 -DLLVM_LIBDIR_SUFFIX=64

编译(时间较长, 注意等待)

make -j4 // -j4 表示并发执行 4 个任务,这个数字指定 CPU 核心数为佳
make install

在编译阶段遇到的问题

这里的问题是以我本身环境所决定, 具体的如果你遇到请自行搜索查阅

内存不足

这里如果你的机器内存太小, 比如我的内存只有1G, 所以需要借助swap
dd if=/dev/zero of=/swapfile bs=64M count=16 //bs代表块大小, count需要多少块
mkswap /swapfile
swapon /swapfile
// 编译结束以后一定要删除
swapoff /swapfile
rm /swapfile

遇到未找到的问题

/usr/bin/ld: cannot find -lgtest
如果是遇到这个问题, 是越少googletest框架, 参考https://stackoverflow.com/questions/13513905/how-to-setup-googletest-as-a-shared-library-on-linux

git clone https://github.com/google/googletest.git
cd googletest
cmake -DBUILD_SHARED_LIBS=ON .
make
cp -a googletest/include/gtest /usr/include
cp -a googlemock/gtest/libgtest_main.so googlemock/gtest/libgtest.so /usr/lib/

遇到Can’t locate Data/Dumper.pm in @INC…问题

wget http://www.cpan.org/modules/by-module/Data/Data-Dumper-2.154.tar.gz
tar xvzf Data-Dumper-2.154.tar.gz
cd Data-Dumper-2.121
perl Makefile.PL
make
make install
//如果遇到Can’t locate ExtUtils/MakeMaker.pm…该错误
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker cpan

下面就是编译YcmCompleteMe

由于你不是直接编译, 而是通过另外编译Clang, 所以不能使用install.sh脚本。

mkdir ~/ycm_build
cd ~/ycm_build
cmake -G “Unix Makefiles” -DEXTERNAL_LIBCLANG_PATH=/usr/local/lib64/libclang.so . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
// 这里需要你自己查找机器libclang的地方, find / -name “libclang”

生成ycm_core

cmake –build . –target ycm_core –config Release

至此,YouCompleteMe已经算是安装成功!
注意:这时候,ycm_build目录可以删除啦!

安装成功后,ycm_build以及ycm_temp目录都可以删除,不影响YouCompleteMe插件的使用。

如果vim 出现
NoExtraConfDetected: No .ycm_extra_conf.py file detected, so no compile flags are available. Thus no semantic support for C/C++/ObjC/ObjC++. Go READ THE DOCS NOW, DON’T file a bug r…
https://github.com/Valloric/ycmd/blob/master/cpp/ycm/.ycm_extra_conf.py该页面下载, 然后修改进行修改
cd ~/.vim/bundle/YouCompleteMe
查看有没有cpp文件夹, 没有就创建mkdir cpp/ycm, 然后将下载.ycm_extra_conf.py放进该文件夹下, 然后编辑

1
2
3
4
5
6
7
'-isystem',
'/usr/include',
'-isystem',
'/usr/include/c++/4.8.5',//注意这是你自己版本
'-isystem',
'/usr/include',
'/usr/include/x86_64-linux-gnu/c++', //这个也是你机器实际的位置

再次打开 .vimrc 配置YCM,如下:

“YouCompleteMe
let g:ycm_global_ycm_extra_conf=’~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py’

这样就算完成了, 可以自动补全了, 安装这个真的太费劲了, 简直不能忍受啊。 真的太繁琐了。