• Vim自动补全插件----YouCompleteMe安装与配置


    Vim自动补全插件----YouCompleteMe安装与配置

    使用Vim编写程序少不了使用自动补全插件,在Linux下有没有类似VS中的Visual Assist X这么方便快捷的补全插件呢?以前用的是neocomplcache+code_complete+omnicppcomplete,但效果还是不是很好。看到有YCM后前面的插件可以说拜拜了。

    YouCompleteMe:一个随键而全的、支持模糊搜索的、高速补全的插件。YCM 由 google 公司搜索项目组的软件工程师 Strahinja Val Markovic 所开发,YCM 后端调用 libclang(以获取AST,当然还有其他语言的语义分析库)、前端由 C++ 开发(以提升补全效 率)、外层由 python 封装(以成为 vim 插件),它可能是我见过安装最复杂的 vim 插件了。

    先看个补全效果图

    还可以进行路径自动补全

    录了张使用YCMultisnips的动态giif补全效果图,这两者配合起来写代码很爽。

    我的vim的配置可以看这里

    YouCompleteMe要求Vim版本7.3.584+,前面已经介绍了编译安装Vim7.4方法。 同时YouCompleteMe要求clang版本为3.3以上。如果想获取最新的clang可以使用SVN,按照其官网上介绍的方法编译安装。我们这里介绍源码编译安装clang3.3。

    编译安装llvm-clang3.3

    先下载如下4个源码: llvm-3.3源码 clang-3.3源码 clang-tools-extra-3.3源码 compiler-rt-3.3源码 建立目录:

    mkdir ~/llvm-clang

    分别解压上面下载的4个文件到上述目录

    tar -xvzf llvm-3.3.src.tar.gz
    
    tar -xvzf compiler-rt-3.3.src.tar.gz
    
    tar -xvzf clang-tools-extra-3.3.src.tar.gz
    
    tar -xvzf cfe-3.3.src.tar.gz

    再将工具移动到llvm的相应目录下,使得clang,clang-tools-extra和compiler-rt就可以和llvm一起编译了:

    mv cfe-3.3.src/ llvm-3.3.src/tools/clang/
    
    mv clang-tools-extra-3.3.src/ llvm-3.3.src/tools/clang/extra/
    
    mv compiler-rt-3.3.src/ llvm-3.3.src/projects/compiler-rt/

    下载最新的LLVM、clang 及辅助库源码可用:

    cd ~/llvm-clang
    svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
    cd llvm/tools
    svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
    cd ../..
    cd llvm/tools/clang/tools
    svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
    cd ../../../..
    cd llvm/projects
    svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
    cd ..

    返回~/llvm-clang目录,并新建一个目录llvm-build专门用于编译llvm-clang,使得不污染源码。

    mkdir llvm-build
    
    cd llvm-build/
    
    ../llvm-3.3.src/configure --enable-optimized

    建立编译环境

    此种配置后,llv-clang默认安装到目录 /usr/local/ 下, 如果想改变安装目录,则加上配置: --prefix=Path 来制定 输入 make -j4

    (本人机器为双核)开始编译

    sudo make install

    进行安装

    如要卸载则在该目录下输入

    sudo make uninstall

    安装好后,输入 clang -v查看版本信息:

     clang -v

    安装clang标准库

    clang 的标准库————libc++(接口层)和 libc++abi(实现层)需要安装头文件和动态链接库(*.so)。

    安装libc++

    cd ~/llvm-clang
    svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
    cd libcxx/lib
    ./buildit

    头文件已经生成到 ~/llvm-clang/libcxx/include/,要让 clang 找到必须复制到 /usr/include/c++/v1/

    sudo cp -r ~/llvm-clang/libcxx/include/ /usr/include/c++/v1/

    *.so 文件已生成 ~/llvm-clang/libcxx/lib/libc++.so.1.0,要让 clang 访问必须复 制到 /usr/lib/,并创建软链接

    ln -s ~/llvm-clang/libcxx/lib/libc++.so.1.0 ~/llvm-clang/libcxx/lib/libc++.so.1
    ln -s ~/llvm-clang/libcxx/lib/libc++.so.1.0 ~/llvm-clang/libcxx/lib/libc++.so
    sudo cp ~/dllvm-clang/libcxx/lib/libc++.so* /usr/lib/

    类似,源码安装 libc++abi 的头文件和动态链接库:

    cd  ~/llvm-clang/
    svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi
    cd libcxxabi/lib
    ./buildit

    头文件已经生成到 ~/llvm-clang/libcxxabi/include/,要让 clang 找到必须复制到 /usr/include/c++/v1/

    sudo cp -r ~/llvm-clang/libcxxabi/include/ /usr/include/c++/v1/

    *.so 文件已生成 ~/llvm-clang/libcxx/lib/libc++abi.so.1.0,要让 clang 访问必 须复制到 /usr/lib/,并创建软链接

    ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.so.1
    
    ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.so
    
    sudo cp ~/llvm-clang/libcxxabi/lib/libc++abi.so* /usr/lib/

    后续可以通过如下选项进行代码编译(这里暂时不处理,所以下面不执行):

    clang++ -std=c++11 -stdlib=libc++ -Werror -Weverything -Wno-disabled-macro- expansion -Wno-float-equal -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno- global-constructors -Wno-exit-time-destructors -Wno-missing-prototypes -Wno-padded -lc++ -lc++abi main.cpp

    参数说明:

    • -std=c++11: 使用 C++11 新特性;
    • -stdlib=libc++: 指定使用 clang 的标准库头文件 /usr/include/c++/v1/;
    • -Werror: 将所有编译警告视为编译错误;
    • -Weverything: 打开所有编译警告选项。在 GCC 中,无法通过单个选项打开所有 编译警告,必须繁琐的同时指定 -Wall、-Wextra、以及大量分散的其他选项,为此clang 新增了 -Weverything。当然,有些警告意义不大,完全可忽略,如下;
    • -Wno-disabled-macro-expansion:禁止使用宏表达式,忽略此警告;
    • -Wno-float-equal:浮点类型不应使用 != 和 == 运算符,忽略此警告;
    • -Wno-c++98-compat、-Wno-c++98-compat-pedantic:采用 C++11 新特性的代 码无法兼容 C++98,忽略此警告;
    • -Wno-global-constructors:在 main() 之前存在执行的代码,忽略此警告;
    • -Wno-exit-time-destructors:在 main() 之后存在执行的代码,忽略此警告;
    • -Wno-missing-prototypes:虽有函数定义但缺失函数原型,忽略此警告;
    • -Wno-padded:结构体大小应为 4 字节整数倍,忽略此警告(编译器自动调整对齐 边界);
    • -lc++:指定链接 /usr/lib/libc++.so 标准库;
    • -lc++abi:指定链接 /usr/lib/libc++abi.so 标准库。注意:这两个选项非常重 要,缺失将导致链接失败!

    这些参数在YouCompleteMe的配置文件.ycm_extra_conf.py的flags中设置

    安装配置YouCompleteMe

    • 下载源码。使用vundle搞定,在~/.vimrc文件中加入 
    Bundle 'Valloric/YouCompleteMe'
    • 执行命令:
    $ cd ~
    $ mkdir ~/ycm_build
    $ cd ~/ycm_build
    $ cmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBclang=ON -DEXTERNAL_LIBCLANG_PATH=CLANG_INSTALL_PATH/libclang.so . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp

    注意:这里的CLANG_INSTALL_PATH要替换成你自己libclang.so所在的目录,例如我的是 /ycm_temp/llvmsrc/build/Release+Asserts/lib(即:上面步骤的编译llvm-clang所生成的),如果安装了的话在/usr/local/lib/下也有libclang.so,这个目录也可以。可以通过sudo find / -name "libclang.so" -print查看

    • 在YouCompleteMe中生成libclang.so和ycm_core.so文件 。执行 make ycm_core,这样将在~/.vim/bundle/YouCompleteMe/python/目录下自动生成两个文件(libclang.so和ycm_core.so)
    1. make ycm_core
    • 这还是不够的,还必须执行命令:make ycm_support_libs。 这条命令才会生成第三个文件ycm_client_support.so。因为,YouCompleteMe是C/S架构的,所以存在服务器和服务端的说法。
    1. make ycm_support_libs
    • 最后设置.ycm_extra_conf.py文件。

      不同于很多vim插件,YCM首先需要编译,另外还需要有配置.在vim启动后,YCM会找寻当前路径以及上层路径的.ycm_extra_conf.py.在~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py中提供了默认的模板.也可以参考我的(就在模板上改改而已).不过这个解决了标准库提示找不到的问题.

    C

    C++

      一般来说,在~目录下放一个默认的模板,而后再根据不同的项目在当前目录下再拷贝个.ycm_extra_conf.py(由上面两个超链接获得时注意均重命名为该名字).

    • 在.vimrc中添加配置:
    " 自动补全配置
    set completeopt=longest,menu    "让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
    autocmd InsertLeave * if pumvisible() == 0|pclose|endif    "离开插入模式后自动关闭预览窗口
    inoremap <expr> <CR>       pumvisible() ? "<C-y>" : "<CR>"    "回车即选中当前项
    "上下左右键的行为 会显示其他信息
    inoremap <expr> <Down>     pumvisible() ? "<C-n>" : "<Down>"
    inoremap <expr> <Up>       pumvisible() ? "<C-p>" : "<Up>"
    inoremap <expr> <PageDown> pumvisible() ? "<PageDown><C-p><C-n>" : "<PageDown>"
    inoremap <expr> <PageUp>   pumvisible() ? "<PageUp><C-p><C-n>" : "<PageUp>"
    
    "youcompleteme  默认tab  s-tab 和自动补全冲突
    "let g:ycm_key_list_select_completion=['<c-n>']
    let g:ycm_key_list_select_completion = ['<Down>']
    "let g:ycm_key_list_previous_completion=['<c-p>']
    let g:ycm_key_list_previous_completion = ['<Up>']
    let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示
    
    let g:ycm_collect_identifiers_from_tags_files=1    " 开启 YCM 基于标签引擎
    let g:ycm_min_num_of_chars_for_completion=2    " 从第2个键入字符就开始罗列匹配项
    let g:ycm_cache_omnifunc=0    " 禁止缓存匹配项,每次都重新生成匹配项
    let g:ycm_seed_identifiers_with_syntax=1    " 语法关键字补全
    nnoremap <F5> :YcmForceCompileAndDiagnostics<CR>    "force recomile with syntastic
    "nnoremap <leader>lo :lopen<CR>    "open locationlist
    "nnoremap <leader>lc :lclose<CR>    "close locationlist
    inoremap <leader><leader> <C-x><C-o>
    "在注释输入中也能补全
    let g:ycm_complete_in_comments = 1
    "在字符串输入中也能补全
    let g:ycm_complete_in_strings = 1
    "注释和字符串中的文字也会被收入补全
    let g:ycm_collect_identifiers_from_comments_and_strings = 0
    
    nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳转到定义处

    下面这部分介绍vundle:

    相比sublime text2等现代编辑器,Vim缺乏默认的插件管理器,所有插件的文件都散布在~/.vim下的几个文件夹中,配置vim的过程, 就是在网上不停的搜插件,拷贝到~/.vim下,发现更新,要重新下载重新拷贝,想要删除某个不需要插件,更是要小心翼翼的不要删错。配置出顺手的Vim, 需要极大的耐心和运气。

    当然vim社区的活力是不容怀疑的,没有枪没有炮大神们自己造。以前使用过tpope的pathogen,使用git submodule和pathogen, 管理插件已经大大简化。而今天介绍的vundle, 更是把git操作整合进去,用户需要做的只是去Github上找到自己想要的插件的名字,安装,更新和卸载都可有vundle来完成了。虽然去发现一个好的插件仍然是一个上下求索的过程,但是用户已经可以从安装配置的繁琐过程解脱了。
    Vundle的具体介绍查看vim.org,或者github repo

    安装和配置

    下载vundle

    $ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

    在~/.vimrc 中添加bundle的配置

    set nocompatible                " be iMproved
    filetype off                    " required!
    set rtp+=~/.vim/bundle/vundle/
    call vundle#rc()
    
    " let Vundle manage Vundle
    Bundle 'gmarik/vundle'
    
    "my Bundle here:
    "
    " original repos on github
    Bundle 'kien/ctrlp.vim'
    Bundle 'sukima/xmledit'
    Bundle 'sjl/gundo.vim'
    Bundle 'jiangmiao/auto-pairs'
    Bundle 'klen/python-mode'
    Bundle 'Valloric/ListToggle'
    Bundle 'SirVer/ultisnips'
    Bundle 'Valloric/YouCompleteMe'
    Bundle 'scrooloose/syntastic'
    Bundle 't9md/vim-quickhl'
    " Bundle 'Lokaltog/vim-powerline'
    Bundle 'scrooloose/nerdcommenter'
    "..................................
    " vim-scripts repos
    Bundle 'YankRing.vim'
    Bundle 'vcscommand.vim'
    Bundle 'ShowPairs'
    Bundle 'SudoEdit.vim'
    Bundle 'EasyGrep'
    Bundle 'VOoM'
    Bundle 'VimIM'
    "..................................
    " non github repos
    " Bundle 'git://git.wincent.com/command-t.git'
    "......................................
    filetype plugin indent on
    bundle分为三类:
    1. 在Github vim-scripts 用户下的repos,只需要写出repos名称
    2. 在Github其他用户下的repos, 需要写出”用户名/repos名”
    3. 不在Github上的插件,需要写出git全路径

    安装插件

    打开一个vim, 运行:BundleInstall 

    安装完成后插件就能用了

    其它常用命令:

    • 更新插件:BundleUpdate
    • 清除不再使用的插件:BundleClean,
    • 列出所有插件:BundleList
    • 查找插件:BundleSearch

    vim7.4的安装参考https://github.com/Valloric/YouCompleteMe/wiki/Building-Vim-from-source

    Mirror of the Vim Mercurial repository http://code.google.com/p/vim/https://github.com/mingcaoyouxin/vim)

             vim.wikia.com/wiki/Building_Vim

    本文转载自:http://www.cnblogs.com/zhongcq/p/3630047.html

    参考文章:http://www.junevimer.com/2013/12/11/youcompleteme.html

         http://valloric.github.io/YouCompleteMe/

         http://www.linuxzen.com/vim-dai-ma-bu-quan-he-jian-cha-youcompleteme-syntastic.html

  • 相关阅读:
    复制文件-用FileOutputStream和FileInputStream读写文件
    向属性文件中添加属性
    合并多个文件的内容
    EVA4400存储RAID信息丢失数据恢复过程
    DELL Eq PS4000数据恢复成功案例
    华为OceanStor S5600T服务器数据恢复
    IBM ds4700崩溃重组raid及修复数据库
    分析IBM AIX存储层结构 / 常用存储命令整理
    riad5阵列崩溃,恢复数据过程
    如何使用Handy Backup 6.2进行数据备份(步骤阅读)
  • 原文地址:https://www.cnblogs.com/mingcaoyouxin/p/4231583.html
Copyright © 2020-2023  润新知