美文网首页编程开发linux学习极光
一步一步带你安装史上最难安装的 vim 插件 —— YouCom

一步一步带你安装史上最难安装的 vim 插件 —— YouCom

作者: Helperhaps | 来源:发表于2016-11-24 17:41 被阅读55735次

    YouCompleteMe is a fast, as-you-type, fuzzy-search code completion engine for Vim.
    参考: https://github.com/Valloric/YouCompleteMe#full-installation-guide
    本篇文章默认读者知道什么是 unix/linux,vim/vi, YouCompleteMe,如果有不清楚的,Search engine is your friend 或者留言讨论。YouCompleteMe 简称 YCM 以下都称为 YCM。

    YouCompleteMe 的强大想必大家都听说过,简单的用一句话来概括的话,媲美 VS 的自动补全 当然可能有一点点过,但可见其强大。但是作为一个十分强大的 vim 插件,他可是十分的难以安装,几乎所有的人,都会在安装阶段苦苦挣扎(别问老夫怎么知道的),然后要么成功安装享受工具带来的便利,要么放弃继续使用传统的自动补全工具(当然也没有那么差,但可能没有 YCM 那么强大)。

    经过老夫的辛苦探索,终于在听到 YCM 大名的一年之后成功安装,所以分享出来,希望能够帮助到更多的人。另外如果在安装过程中遇到任何问题都欢迎在评论与我讨论。

    有了你我才是我,你的存在令我完整
    —— 老夫

    系统环境:Kali-Rolling on Oracle VirtualBox,可以当作是最新版(或者说实验版)的 Debian

    目标:成功安装使用 YCM, 尽量少的编译软件(即尽量使用预编译 deb 包),尽量可以实现更多种语言的自动补全

    安装步骤:

    0. 确保 vim 版本是 7.4.143 或以上,并且支持 python 2/3 脚本

    vim version

    从上图可以看出老夫的 vim 版本是 8.0.49 且支持 python3 脚本但不支持 python2 脚本(截图的倒数第 7,8 行)
    如果你的打印结果中没有相关 python 脚本信息,还可以在 vim 中键入命令 :echo has('python') || has('python3'),若结果是 1 则证明是支持的。

    若不论是 vim 版本不满足条件或者是不支持 python 脚本,那么就需要从源码编译安装 vim 了,

    1. 通过 Vundle 来安装 YCM(官方推荐)

    快速安装 vim 的插件管理插件 vundle

    在 vim 的配置文件 ~/.vimrc 中添加一行(在call vundle#begin()call vundle#end() 之间)

    call vundle#begin()
    . . . 
    Plugin 'Valloric/YouCompleteMe’
    . . .
    call vundle#end()
    

    然后保存运行 vim 命令 :PluginInstall 安装 需要特别注意的是这个时候可能等的时间会相当的长

    这个时候打开 vim 可能则会有警告如下图

    vim warning

    1.5 通过 Git 安装 YCM

    如果你跟老夫一样,等待 Vundle 安装 YCM 等了好久终于貌似好像成功了,打开 vim 却发现 YouCompleteme unavailable : no module named future (当然没有遇到算你运气好),那么你应该考虑一下换用 Git 来安装 YCM:

    # 下载 (在 `~/.vim/bundle` 目录下)
    $ git clone --recursive [https://github.com/Valloric/YouCompleteMe.git](https://github.com/Valloric/YouCompleteMe.git)
    # 检查完整性(在 `~/.vim/bundle/YouCompleteMe` 目录下)
    $ git submodule update --init --recursive
    

    2. 下载安装最新版的 libclang

    如果不需要 C 家族的语义化补全,则可跳过这一步

    # apt-get install llvm-3.9 clang-3.9 libclang-3.9-dev libboost-all-dev
    

    PS: ** YCM 官方墙烈推荐使用上游编译的二进制文件代替系统自带的 libclang**

    You can use the system libclang only if you are sure it is version 3.9 or higher, otherwise don't. Even if it is, we recommend using the official binaries from llvm.org if at all possible. Make sure you download the correct archive file for your OS.

    We STRONGLY recommend AGAINST use of the system libclang instead of the upstream compiled binaries. Random things may break. Save yourself the hassle and use the upstream pre-built libclang.

    3. 编译构建 ycm_core

    ** 需要:cmake python3-dev**

    YCM 的顶层目录或者说根目录应该是 ~/.vim/bundle/YouCompleteMe

    • 创建一个目录放编译过程中产生的文件
    $ mkdir ~/.ycm_build
    $ cd ~/.ycm_build
    
    • 生成 makefile

    如果跳过第三步的话,则可以直接运行

    $ cmake -G "Unix Makefiles" . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
    

    如果没有跳过第三步,说明需要 c 家族的语义化补全则需运行

    $ cmake -G "Unix Makefiles" -DUSE_SYSTEM_BOOST=ON DUSE_SYSTEM_LIBCLANG=ON . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
    
    有问题的编译

    编译通过的,没有报错,但是这个编译结果是有问题的,看第 3 行,反复强调的 c 家族的语义补全没有了。经过老夫反复的检查,原来是上面的编译命令少了一个 - 符号

    $ cmake -G "Unix Makefiles" -DUSE_SYSTEM_BOOST=ON -DUSE_SYSTEM_LIBCLANG=ON . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
    

    这个时候编译的过程如下图:

    编译正常

    其实这个还是有问题的,看倒数第 3、4 行,使用的是外部的 libclang-3.6 ,第 2 步中说的系统安装的 libclang 最低要是是 3.9。
    这个时候就需要删除 ~/.ycm_build 目录下的所有文件,使用下面的命令指定 libclang 的版本重新编译。

    $ cmake -G "Unix Makefiles" -DUSE_SYSTEM_BOOST=ON -DEXTERNAL_LIBCLANG_PATH=/usr/lib/x86_64-linux-gnu/libclang-3.9.so . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
    

    编译的结果是之前新建的目录(也就是当前目录下生成了一些 Makefile 文件)

    Makefile
    • 构建 ycm_core
    #  --config Release 这个构建选项进针对 Windows
    $ cmake --build . --target ycm_core --config Release
    
    build ycm_core

    3.5 配置

    • 复制 .ycm_extra_conf.py 文件
    $ cp ~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py ~/.vim/
    
    • 添加 vim 配置
      注意下面的 python 解释器的路径要和编译 ycm_core 的时候使用的 python 解释器是相同的版本(2 或 3)
    “ ~/.vimrc
    let g:ycm_server_python_interpreter='/usr/bin/python'
    let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'
    

    4. 其他语言的支持

    C#、Go、TypeScript、 JavaScript、 Rust support
    由于老夫对这些语言没有太多的涉猎就不做介绍了。

    5. 测试安装

    首先新建一个 hello.c 文件,

    hello.c

    可以看到自动补全了头文件,厉害了老夫的 YCM

    然后在 vim 中运行 :YcmToggleLogs stderr 命令查看错误日志,

    stderr

    没有看到报错信息,则证明 YCM 已成功安装。

    相关文章

      网友评论

      • Leto_:注意cmake的最后一次,缺少了
        -DUSE_SYSTEM_LIBCLANG=ON 的参数
      • 8e8a8055c581:很详细, 但是你中英标点混用 直接复制会出错
      • 2c8ec795a8b0:添加vim配置的那两句代码在那个位置添加?
        Helperhaps:@哦無聊咯 随意吧,我一般是在最后面
      • 红色的Ricky:按照本文的指示一步步安装完毕,用的是官网下载的llvm。安装后遇到了“no module named builtins”的错误,到YCM官网issue查看修正后,体验了一把vim+ycm的强大

        贴一下在命令行的历史记录(Ubuntu16.04, cmake3.11.1, llvm6.0.0)

        ```
        #/bin/bash
        # 2018-05-13

        # make a dir to store all required softwares, could be removed the dir once the whole process done
        mkdir ~/ycm_tmp
        cd ~/ycm_tmp

        # install cmake by compiling src code (recommend using the latest version)
        apt-get remove cmake
        wget https://cmake.org/files/v3.11/cmake-3.11.1.tar.gz
        tar -xvf cmake-3.11.1.tar.gz
        cd cmake-3.11.1
        ./configure
        make
        make install

        # install llvm using pre-built bin (mind the relavent platform and version)
        wget http://releases.llvm.org/6.0.0/clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz
        tar -xvf clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz
        mv clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-16.04 llvm

        # compile ycm_core, using cmake and llvm
        mkdir ~/.ycm_build
        cd ~/.ycm_build
        cmake -G "Unix Makefiles" -DPATH_TO_LLVM_ROOT=~/ycm_tmp/llvm ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
        cmake --build . --target ycm_core

        # configure vimrc
        cp ~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py ~/.vim/
        echo "let g:ycm_server_python_interpreter='/usr/bin/python'">>~/.vimrc
        echo "let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'">>~/.vimrc

        # update third party modules, otherwise error occurs: "no module name builtins"
        cd ~/.vim/bundle/YouCompleteMe
        git submodule update --init --recursive
        ```
      • f293e8bdd85f:我的装完好像功能不全。也和你的不一样!

        ---------------------------------------------------------------------------

        ➜ .ycm_build cmake -G "Unix Makefiles" -DUSE_SYSTEM_BOOST=ON -DEXTERNAL_LIBCLANG_PATH=/usr/lib/x86_64-linux-gnu/libclang-3.9.so . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
        -- Using libclang to provide semantic completion for C/C++/ObjC
        -- Boost version: 1.58.0
        -- Found the following Boost libraries:
        -- filesystem
        -- regex
        -- system
        -- Using external libclang: /usr/lib/x86_64-linux-gnu/libclang-3.9.so.1
        -- Configuring done
        -- Generating done
        -- Build files have been written to: /home/sam/.ycm_build
        ➜ .ycm_build cmake --build . --target ycm_core --config Release
        Scanning dependencies of target ycm_core
        [ 4%] Building CXX object ycm/CMakeFiles/ycm_core.dir/CandidateRepository.cpp.o
        [ 8%] Building CXX object ycm/CMakeFiles/ycm_core.dir/Character.cpp.o
        --------------------
      • DeamoV:哇kali,大佬您好~怒关注一波
      • scukzz:请问我安装以后想要回车自动补全的功能, vimrc中设置了
        inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>"
        还会不起作用是怎么回事儿
      • scukzz:赞一个!
      • 2a715d6aba3b:future只是python下的一个库,去安装以后就可以了,没必要搞这么麻烦
      • soro:厉害了老哥,wsl 下成功跑起,厉害了老夫的 YCM,然后可以安心用 vscode 了:joy:
      • 8cdcaad69846:1. 运行 vim 命令 :PluginInstall 安装 需要特别注意的是这个时候可能等的时间会相当的长
        按照以上步骤,我在vim 里面执行PluginInstall 显示 editor 没有这个命令
        Helperhaps:没有 「PluginInstall」命令那是因为你的包管理器没有安装成功
      • c8de4557f9b4:反正我试了好几遍,都编译成功了,但是并没有什么反应。
        0bc1592becc0:我也是,什么反应也没有
      • Harddddd:使用Vundle安装YCM时,如果出现```YouCompleteMe unavailable: No module named 'future'```错误,可以运行下面的命令来解决。
        ```
        cd ~/.vim/bundle/YouCompleteMe
        git submodule update --init --recursive
        ```
        63b9c5f93ef5:你好,我按你的步骤执行以后出现了无法克隆https:://github.com/nosami/OmniSharpServer到子模组路径third_party/OmniSharpServer 请问是什么情况?
      • 凌风绝影:兄弟,为什么我会出现这样的错误
        The ycmd server SHUT DOWN (restart with :YcmRestartServer). Stderr (last 30 lin es)
        0d1b415a365b:python3 ~/.vim/bundle/YouCompleteMe/install.py
        成功运行一遍就好了, 如果出错的话,提示缺啥装啥就行了
        4c091a75bd2b:我的也是这个报错!
      • 1f94d78039b2:请教一下,我装完Ycm,启动vim时跟的文件名必须是xx.c,xx.py.xx.php之类的,否则报
        Vim:catch deadly signal ABRT,启动不了了
        1f94d78039b2: @September999 不跟文件名或者跟一个xxx.txt的文件名也启动不了,也就是说必须跟一个编程语言的源代码文件才能打开……,怎么解
      • Leon_Geo:我用的是termux,为什么我明明装了python 3,但提示说找不到libpython.so呢?
        Helperhaps:没用过 termux ,但一般普通的 linux 终端都基本上不会出现问题,具体问题还请去搜索一下
      • bc1faeeae3d6:为什么按照你的配置一步一步下来我的vim不会自动提示。

      • WithU_e4d2:怎么只用Python3呢? 不想用2.7~
        Helperhaps:@情难自禁PL 命令前「:」 冒号的,指的是vim 命令模式下的命令,如果不知道自己在哪个模式下,按几下 ESC 就到这个模式了,不过首先要保存 vimrc 文件,这都是常识。

        另外现在包管理已经不推荐使用 `vundle` 现在用 [plug](https://github.com/junegunn/vim-plug)
        情难自禁PL:”然后保存运行 vim 命令 :PluginInstall 安装 ” 这句话是啥意思 是让在~/.vimrc文件中用vim的命令行模式执行:PluginInstall命令吗?还是说只是在命令行中执行:PluginInstall命令?两种方法我都是了,都不行,博主能指点一下吗?我看了很多博客,都是这样说的,但是我就卡在这步了!!
        Helperhaps:想用就用呗,反正,现在我的新项目,都是优先考虑 3 的
      • c8de4557f9b4:为什么要把错误的步骤写出来
      • 谢伟Alex:你也开始用Vim了吗?
        Helperhaps:做一下简单的运维一直有在用啊,不过做开发没怎么用过

      本文标题:一步一步带你安装史上最难安装的 vim 插件 —— YouCom

      本文链接:https://www.haomeiwen.com/subject/qcprpttx.html