版权声明:本文章为博主原创,转载请注明出处。保留所有权利。

Contents
  1. 1. 前言
  2. 2. 准备
  3. 3. 真正的安装
    1. 3.1. 坑1 Your C++ compiler does NOT fully support C++11
    2. 3.2. 坑2 The ycmd server SHUT DOWN (restart with ycmrestartserver)…
    3. 3.3. 坑2.1 ycm_core.so: undifined symbol: clang_parseTranslationUnit2FullArgv
    4. 3.4. 坑2.2 Import Error: /lib64/libc.so.6: version ‘GLIBC_2.15’ not found
    5. 3.5. 坑2.3 更新了gcc?
    6. 3.6. 坑3 No .ycm_extra_conf.py detected. && Attribute Error: ‘module’ object has no attribute ‘FlagsForFile’
  4. 4. 配置

本文将讲述我是如何安装使用vim的代码补全插件YouCompleteMe的。

  • 前言

    以前总是在用各种IDE在写代码,其一个主要的优点就是通常具备了比较完善的代码补全功能。换到vim之后也是在这一点上很不习惯。为了更好的编辑体验和更高的输入效率,决定搞一个YouCompleteMe
    Ycm号称最强vim代码补全插件,对若干主流编程语言都有着比较好的支持,补全体验直追IDE。
    官方效果演示图
    但是其繁琐的安装过程劝退了不少vim新手,我也曾经是其中一员。

  • 准备

    ycm要求vim版本至少为7.4.1578,并且有Python2或3支持。官方推荐使用Vundle来进行ycm的“安装”,所以最好提前安装好Vundle插件管理器。
    有了Vundle之后,只需在.vimrc文件中添加一行:

    1
    Plugin 'Valloric/YouCompleteMe'

然后在vim中运行:PluginInstall即可进行“安装”。这里安装加了引号的意思是 这一步执行完后ycm并没有被真正安装完成,仍需要后面的步骤进行真正的安装。

  • 真正的安装

    使用Vundle进行安装后,在.vim/bundle文件夹下应该已经有了ycm的文件夹,进入其中并运行install.py安装脚本。如果你需要C家族语言的补全,还需要在后面加上参数--clang-completer。如果能够一口气安装到底,那么恭喜你,起码安装这一步,你完美地避开了所有的坑。然而往往在这一步卡住了无数的英雄好汉。。。

  • 坑1 Your C++ compiler does NOT fully support C++11

    ycm是从源码编译安装的,其源码使用的是C++11,所以我们的编译器也必须完全支持C++11标准才能正常编译,否则在编译前的检查阶段就会fail掉。我最开始的编译器是gcc4.4.7,然而gcc至少也要4.8+才能支持C++11,所以升级gcc势在必行。gcc的升级安装在这里不多细讲,需要注意的是如果有root权限,可以比较方便地用包管理器进行升级,否则就要从源码开始自行配置、编译、安装,有需要的朋友可以参考这篇博客。我这里直接升级到了gcc5.2,填上了这个坑。

  • 坑2 The ycmd server SHUT DOWN (restart with ycmrestartserver)…

    编译成功后打开vim,没准会遇到这个报错,错误的原因可能有多种,详见后面的几个坑

  • 坑2.1 ycm_core.so: undifined symbol: clang_parseTranslationUnit2FullArgv

    ycm的C家族语言补全是基于clang的,报这个错误说明你的clang版本不够。ycm需要至少3.8版本的clang。虽然在运行安装脚本的时候可以使用参数--system-libclang来告诉ycm使用系统自带的clang,但是官方强烈不建议这么做,比较推荐的做法是在这里下载适合自己系统的clang预编译包,放进.vim/bundle/YouCompleteMe/third_party/ycmd/clang_archieves路径下,或者干脆不指定clang,这样安装脚本会自动下载最新的clang预编译包放在上述路径下。

  • 坑2.2 Import Error: /lib64/libc.so.6: version ‘GLIBC_2.15’ not found

    望文生义可知其意,无非就是找不到2.15版本的glibc。运行

    1
    strings /lib64/libc.so.6 | grep GLIBC

来查看当前系统支持的GLIBC版本,发现我的系统最多只支持到2.12,自然没法找到2.15的版本。虽然这个错误是由glibc的版本比较低引起的,但是在这里非常非常不建议通过更新glibc的版本来填这个坑,原因在于glibc是linux系统比较底层的c++运行库,很多基本的系统命令都依赖这个库,更新时如果操作不当很有可能导致这些命令都没法使用,比较难修理。
那么除此之外还有什么办法呢?上面也说了,ycm是基于clang来做C家族语言的补全的,而实际上这里调用glibc 2.15也是clang的需求,如果你的系统比较旧,那么下载的clang预编译包的所依赖的glibc很有可能版本高于你系统中的glibc,导致你掉入这个坑中,那么实际上我们只需要不使用clang的预编译包,而是从源码编译clang的话,就不会产生依赖更高版本clang的情况了。
从源码编译安装clang的过程不在这里细讲,需要注意的是clang是llvm这个库的一部分,所以实际上你需要从源码编译安装llvm。编译安装完成后,找到安装目录下的lib/libclang.so并用它替换.vim/bundle/YouCompleteMe/third_party/ycmd/下的对应文件就可以了。

  • 坑2.3 更新了gcc?

    业务要求将gcc升级至4.8,更新并更换了默认gcc为高版本后,启动vim时ycm再次报了The ycmd server SHUT DOWN。解决办法是重新执行ycm目录下的setup.py

  • 坑3 No .ycm_extra_conf.py detected. && Attribute Error: ‘module’ object has no attribute ‘FlagsForFile’

    这个其实不算坑,而是安装完成之后对C++补全没有进行配置或者配置不完善的问题。ycm_extra_conf.py实际上是ycm的一个配置文件,在.vim/bundle/YouCompleteMe/third_party/ycmd/路径下。如果不希望使用默认的配置文件,则可以在vimrc里面手动指定(见后)。一般来说我们需要修改的就是该文件中的flags变量,主要是把自己的工程目录添加进去,以便ycm可以识别其中的头文件。如果报Attribute Error,就在文件最后加上下面这段代码:

    1
    2
    def FlagsForFiles(filename):
    return {'flags': flags}
  • 配置

    这里单指在vimrc中的配置。一些常用的配置如下:

    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
    Plugin 'Valloric/YouCompleteMe'

    # 手动设定全局C++补全配置文件
    let g:ycm_global_ycm_extra_conf = '/home/zc/.vim/bundle/YouCompleteMe/.ycm_extra_conf.py'

    let g:ycm_seed_identifiers_with_syntax = 1

    # 设置语义补全触发器,这里设置为只要输入两个字符就触发
    let g:ycm_semantic_triggers = {
    \ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'],
    \ 'cs,lua,javascript': ['re!\w{2}'],
    \ }

    #禁止ycm打开函数原型预览窗口
    set completeopt=menu,menuone
    let g:ycm_add_preview_to_completeopt = 0

    # 文件类型白名单,只有打开这里面的文件类型时才启用ycm的补全,防止打开一些比较大的非代码文件时ycm卡住
    let g:ycm_filetype_whitelist = {
    \ "c":1,
    \ "cpp":1,
    \ "objc":1,
    \ "sh":1,
    \ "zsh":1,
    \ "zimbu":1,
    \ "py":1,
    \ "java":1,
    \ "conf":1
    \ }

    # 补全完成后自动关闭预览窗口
    let g:ycm_autoclose_preview_window_after_completion = 1

    # 切换到非输入模式自动关闭补全窗口
    autocmd InsertLeave * if pumvisible() == 0|pclose|endif

    # 禁止补全时打开预览窗口
    set completeopt-=previe

    # 禁止ycm显示语法诊断信息,因为我用了syntastic插件来检查语法
    let g:ycm_show_diagnostics_ui = 0

    # 设置回车为补全确认键
    let g:ycm_key_list_stop_completion = ['<CR>']

打赏

取消
扫码支持

你的支持是对我最好的鼓励

Contents
  1. 1. 前言
  2. 2. 准备
  3. 3. 真正的安装
    1. 3.1. 坑1 Your C++ compiler does NOT fully support C++11
    2. 3.2. 坑2 The ycmd server SHUT DOWN (restart with ycmrestartserver)…
    3. 3.3. 坑2.1 ycm_core.so: undifined symbol: clang_parseTranslationUnit2FullArgv
    4. 3.4. 坑2.2 Import Error: /lib64/libc.so.6: version ‘GLIBC_2.15’ not found
    5. 3.5. 坑2.3 更新了gcc?
    6. 3.6. 坑3 No .ycm_extra_conf.py detected. && Attribute Error: ‘module’ object has no attribute ‘FlagsForFile’
  4. 4. 配置