V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jpush
V2EX  ›  Vim

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

  •  
  •   jpush · 2017-02-20 14:16:54 +08:00 · 20439 次点击
    这是一个创建于 2862 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 已成功安装。

    作者:老東 D 不知火-极光

    原文: http://www.jianshu.com/p/d908ce81017a

    58 条回复    2017-03-05 07:34:00 +08:00
    CodeingBoy
        1
    CodeingBoy  
       2017-02-20 14:39:09 +08:00
    v2 上面好像是禁止全文转载的
    lll9p
        2
    lll9p  
       2017-02-20 14:40:48 +08:00
    我想知道 windows 怎么安。。
    msg7086
        3
    msg7086  
       2017-02-20 14:42:07 +08:00   ❤️ 3
    似乎阁下并不是作者。先为阁下点了举报。
    Immortal
        4
    Immortal  
       2017-02-20 14:43:05 +08:00
    这东西不是难装
    是国内这个网络 下载下依赖之类的要很久
    总以为是卡死了一样
    Muninn
        5
    Muninn  
       2017-02-20 15:03:57 +08:00
    现在 ycm 自带安装脚本一键执行啊
    这是抄了个旧文?
    jpush
        6
    jpush  
    OP
       2017-02-20 15:05:23 +08:00   ❤️ 1
    @msg7086 文末有附上作者的原文链接你有看到吗
    jpush
        7
    jpush  
    OP
       2017-02-20 15:06:19 +08:00   ❤️ 1
    @CodeingBoy 这是原创,文末有作者链接,作者是我们的成员之一,这是团队账号
    msg7086
        8
    msg7086  
       2017-02-20 15:16:51 +08:00
    @jpush
    因为阁下的名字与作者一栏的名字不同,并且也没有在文中标明作者是阁下团队的一员,因此为阁下点了举报。
    如果是团队成员,那么当然是没有问题的。
    daben1990
        9
    daben1990  
       2017-02-20 15:20:18 +08:00
    装过一次,卡的不行不行的了
    SourceMan
        10
    SourceMan  
       2017-02-20 15:20:52 +08:00
    极光吗?
    这个使用团队号的同事火气有点大啊。
    whatot
        11
    whatot  
       2017-02-20 15:40:51 +08:00
    Plug 'Valloric/YouCompleteMe', { 'do': 'python2 ./install.py --clang-completer --system-libclang --system-boost --gocode-completer' }

    另外就是配置问题了吧
    whatot
        12
    whatot  
       2017-02-20 15:41:21 +08:00
    如果用 arch 可以这么装,快一点
    diffworld
        13
    diffworld  
       2017-02-20 15:43:57 +08:00
    在 vim 补全上尝试了很多,但最后还是选择 neocomplete.vim+补全字典的方式,关键词保存在文件中,随时增加和删除
    linuap
        14
    linuap  
       2017-02-20 16:17:40 +08:00
    ycm 确实神器,不过也挺好装的吧...挂个 proxychains 几乎全自动了...
    不过现在转 spacemacs 了依然用的是 ycmd 补全 :)
    jpush
        15
    jpush  
    OP
       2017-02-20 16:31:32 +08:00
    @msg7086 抱歉,没注意账号 ID 与文末作者关系的注明,是我的疏忽
    jpush
        16
    jpush  
    OP
       2017-02-20 16:43:31 +08:00
    @SourceMan My fault ,没有注明该账号 ID JPush 就是极光,导致了误解
    lypdarling
        17
    lypdarling  
       2017-02-20 16:48:45 +08:00
    Mac 和 Linux 下安装应该非常简单啊
    tabris17
        18
    tabris17  
       2017-02-20 16:50:05 +08:00
    太…………………………作了
    chez
        19
    chez  
       2017-02-20 16:52:58 +08:00
    楼主在 kali 平台安 Youcompleteme 是要干坏事么?
    jpush
        20
    jpush  
    OP
       2017-02-20 17:06:26 +08:00
    @lll9p windows 下用宇宙最强 VS 就好了啊,用什么 VIM
    jpush
        21
    jpush  
    OP
       2017-02-20 17:09:44 +08:00
    @Immortal 确实有这方面原因,但是,从听说 YCM 大名到安装成功花了老夫半年时间徘徊
    jpush
        22
    jpush  
    OP
       2017-02-20 17:12:11 +08:00
    @Muninn 不知道你说的是什么意思,

    > These instructions (using install.py) are the quickest way to install YouCompleteMe, however they may not work for everyone

    这是 README 原文,作者只是分享了自己的安装经历
    jsfaint
        23
    jsfaint  
       2017-02-20 17:12:13 +08:00
    也就是 windows 麻烦啊, Linux 和 mac 一个脚本就搞定了
    https://gist.github.com/jsfaint/efeeae54c2400b42c12a
    jpush
        24
    jpush  
    OP
       2017-02-20 17:13:51 +08:00
    @daben1990 这个嘛, YCM 也是有脾气的吧 lol
    jpush
        25
    jpush  
    OP
       2017-02-20 17:14:31 +08:00
    @SourceMan 已经让刚刚那个同志吃过药了
    jpush
        26
    jpush  
    OP
       2017-02-20 17:18:55 +08:00
    @whatot 你这个是 VIM 的配置语法吗? 是不是有错别字 Plugin,另外的话 Arch 很棒啊, Arch 平台是有第三方的 AUR 包直接安装,你可以看一下他的 WIKI : https://wiki.archlinux.org/index.php/YouCompleteMe#Installation
    ps : 现在的大环境还是用 python3 吧
    jpush
        27
    jpush  
    OP
       2017-02-20 17:20:39 +08:00
    @diffworld neocomplete 也很棒,选择适合自己的插件才是正确的选择
    lingoerer
        28
    lingoerer  
       2017-02-20 17:20:41 +08:00
    我换用 neovim 的原因之一就是可以不用 YCM ,改用 Deoplete ……
    jpush
        29
    jpush  
    OP
       2017-02-20 17:23:00 +08:00
    @linuap
    @lypdarling

    会的人自然觉得不难,你们就当作者翻译了一下 full-installation 的 README 吧
    jpush
        30
    jpush  
    OP
       2017-02-20 17:23:42 +08:00
    @chez 你以为作者会告诉你他的真实意图吗,
    jpush
        31
    jpush  
    OP
       2017-02-20 17:25:56 +08:00
    @lingoerer 其实作者用的最多的还是 sublime text 3, 所以用什么工具并不重要,重要的是能否解决问题。 neovim 或者之前国内某个人的 spacevim 都算是完成度比较高的 vim 配置了,不喜欢折腾的大可以尝试一下
    ivenvd
        32
    ivenvd  
       2017-02-20 17:27:30 +08:00
    @jpush neovim 不是 vim 配置哦……是 vim 的 fork ……
    CodeingBoy
        33
    CodeingBoy  
       2017-02-20 18:34:03 +08:00
    @jpush 哦 那样应该是没问题的 经常看到有全文转载过来就被举报的 因此提醒一下~见谅

    ycm 装过一次,确实难装,我要用 C/C++的自动补全,配置过也不成功
    Mush
        34
    Mush  
       2017-02-20 18:56:23 +08:00
    自从我把开发环境挪到了 Docker 里面, 就再也没有操心过这些事情了.....
    neosfung
        35
    neosfung  
       2017-02-20 19:30:17 +08:00
    n 久之前写下来的记录,不知道还能不能够用

    ```
    sudo apt-get install -y build-essential cmake \
    python-dev libclang-dev \
    vim-addon-manager vim-youcompleteme

    vam install youcompleteme
    ```
    whatot
        36
    whatot  
       2017-02-20 19:54:36 +08:00
    @jpush Plug 是 vim-plug 的命令,能够在安装与更新插件的时候自动执行注册的命令,完成自动编译
    xiaohanqing
        37
    xiaohanqing  
       2017-02-20 20:29:28 +08:00 via Android
    我觉得原生的 omni 就很好用啊
    fzleee
        38
    fzleee  
       2017-02-20 21:08:17 +08:00
    同意 @Immortal 的看法,这东西所谓的难安装完全是因为国内网络环境的问题。 YCM 的安装包实在是太大,下载耗时且经常会失败。

    总结一下安装流程,无非就是:
    1. 通过 Vundle 下载软件。
    2. 安装编译 YCM 需要的库,比如 CMake 之类的。
    3. python install.py

    现在的主流的操作系统,通过软件源安装 VIM 一般都是大于 7.4 的吧,一般都默认有 Python 支持的吧。所以这些地方出问题实在是小概率事件。

    看完这个教程,感觉有点将这个事情复杂化了,会让初次安装 YCM 的人感觉一头雾水。
    Technetiumer
        39
    Technetiumer  
       2017-02-20 22:05:03 +08:00
    @msg7086 所以说你至于举报么
    @SourceMan 我不认为他火气大了

    禁止全文转载属于必须严格遵守的硬性规定?怪不得这里是个人网站而不是社区网站。
    fy
        40
    fy  
       2017-02-20 22:10:45 +08:00
    停一下朋友,讲道理 YCM 这玩意还装个卵子,又难配又卡……
    acdfjelxe
        41
    acdfjelxe  
       2017-02-21 01:17:40 +08:00 via Android
    Gentoo 安装丝般顺滑
    msg7086
        42
    msg7086  
       2017-02-21 03:47:36 +08:00
    @Technetiumer 我认为法律原因也是其中之一。站长生活在美国,需要遵守美国法律,也需要遵守美国的道德准则,擅自转载全文会有法律和道德风险。举报功能就是提醒管理员,这里有一篇文章可能会让他吃上官司,因此让他本人前来审核决定处理方式。举报功能本来就是干这事的,什么叫至于举报么?
    20015jjw
        43
    20015jjw  
       2017-02-21 03:56:51 +08:00 via Android
    我记得 mac 上就对着 github 教程复制粘贴就行了.. 哪这么多事..
    ilcn
        44
    ilcn  
       2017-02-21 04:41:18 +08:00
    能不能不要搞一个这么标题党的文章然后转发一个 github 上面有全文教程的东西。。。
    xiaket
        45
    xiaket  
       2017-02-21 05:53:45 +08:00
    为这个一句话就能安好的东西,花这么多字,还带来这么多口水,真不值
    schezukNewTos
        46
    schezukNewTos  
       2017-02-21 08:02:46 +08:00
    @msg7086 本站服务器在中国,服从中国法律。 ToS 无断变更已经两年了……
    harry890829
        47
    harry890829  
       2017-02-21 08:43:12 +08:00
    ycm 并不难装,这东西主要是安装的时候特别慢,容易超时,应该是网络环境导致的
    mrvon
        48
    mrvon  
       2017-02-21 09:57:26 +08:00
    安装还是非常简单的,作者都已经写好脚本了。
    nG29DOMuRYTWfcSr
        49
    nG29DOMuRYTWfcSr  
       2017-02-21 13:02:23 +08:00 via Android
    楼主成功将我骗进来了
    jpush
        50
    jpush  
    OP
       2017-02-21 13:22:37 +08:00
    @SpaceVim 哈哈哈 那我很有成就感了
    nG29DOMuRYTWfcSr
        51
    nG29DOMuRYTWfcSr  
       2017-02-21 13:25:18 +08:00 via Android
    @jpush 文采这么好,何不帮介绍下 SpaceVim ,:]
    Showfom
        52
    Showfom  
       2017-02-21 13:32:52 +08:00
    从上图可以看出老夫的 vim 版本是 8.0.49 且支持 python3 脚本但不支持 python2 脚本(截图的倒数第 7 , 8 行) 如果你的打印结果中没有相关 python 脚本信息,还可以在 vim 中键入命令 :echo has('python') || has('python3'),若结果是 1 则证明是支持的。


    我怎么数来数去,都是倒数 8 、 9 行啊
    canautumn
        53
    canautumn  
       2017-02-21 13:40:06 +08:00
    过一阵时间不知道升级了哪个部件, YCM 卒。然后要么放弃、要么再花个半天研究一下、再写篇博客。
    whnzy
        54
    whnzy  
       2017-02-22 09:39:36 +08:00
    @whatot 我跟你只少了一个 --system-boost
    whnzy
        55
    whnzy  
       2017-02-22 09:43:14 +08:00
    Plug 不是错别字,是一个包管理,很好用。 传送门: https://github.com/junegunn/vim-plug
    liuqhang
        56
    liuqhang  
       2017-02-22 11:02:57 +08:00
    用 Vundle 装了一下午都没装好。。。
    liuqhang
        57
    liuqhang  
       2017-02-22 14:18:35 +08:00
    终于装好了,费了好大劲,用的是 Centos6 ,简单说下安装过程踩到的坑。

    1.直接用 Vundle 装,不挂代理,装一下午都装不好。

    2.然后装了 Proxychains ,继续用 Vundle 装,装了 2 个小时依然没装好,可能是我梯子太差吧,放弃。

    3.开始采用 Full Installation 的方法装, proxychains git clone --recursive https://github.com/Valloric/YouCompleteMe.git,大
    概用时 30 分钟到 1 个小时,依赖的子项目特别多,估计这也是用 Vundle 不成功原因。

    4.开始编译 ycm_core ,报了个 g++不支持 c++ 11 的错误,然后我就更新了 cmake 和 g++,顺利编译完成。

    5.进入 vim 报错, python 的版本跟编译 ycm_core 时的版本不一致。在生成 ycm_core 配置文件时,加入参数 -DUSE_PYTHON2=OFF ,重新编译 ycm_core 。

    6.成功

    感想:
    1. YCM 不愧是最难装的 vim 插件。
    2. Centos 还是用 7 吧。
    sumu
        58
    sumu  
       2017-03-05 07:34:00 +08:00 via iPhone
    ycm 重度用户,用过就离不开。但困扰我的,还是太耗内存了,内存可以到 6g ,不知道有没有降低的办法,我真是被这个烦死了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   889 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 20:17 · PVG 04:17 · LAX 12:17 · JFK 15:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.