Vim自动补全神器–YouCompleteMe

YouCompleteMe的特别之处

基于语义补全

总所周知,Vim是一款文本编辑器.也就是说,其最基础的工作就是编辑文本,而不管该文本的内容是什么.在Vim被程序员所使用后,其慢慢的被肩负了与IDE一样的工作,文本自动补全(ie.acp,omnicppcompleter),代码检查(Syntastic)等等工作.

针对文本自动补全这个功能来说,主要有两种实现方式.

  • 基于文本

我们常用的omnicppcompleter,acp,vim自带的c-x, c-n的实现方式就是基于文本.更通俗的说法,其实就是一个字:

其通过文本进行一些正则表达式的匹配,再根据生成的tags(利用ctags生成)来实现自动补全的效果.

  • 基于语义

顾名思义,其是通过分析源文件,经过语法分析以后进行补全.由于对源文件进行分析,基于语义的补全可以做到很精确.但是这显然是vim所不可能支持的.而且经过这么多年发展,由于语法分析有很高的难度,也一直没有合适的工具出现.直到,由apple支持的clang/llvm横空出世.YouCompleteMe也正是在clang/llvm的基础上进行构建的.

整合实现了多种插件

  • clang_complete
  • AutoComplPop
  • Supertab
  • neocomplcache
  • Syntastic(类似功能,仅仅针对c/c++/obj-c代码)

支持语言

  • c
  • c++
  • obj-c
  • c#
  • python

对于其他的语言,会调用vim设置的omnifunc来匹配,因此同样支持php,ruby等语言.

已知的有 * javascript —-tern_for_vim * ruby/java —-eclim

效果图:

我的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标准库

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/

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
    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/

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

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

  1. 下载源码。使用vundle搞定,在vimrc文件中加入 
    Bundle ‘Valloric/YouCompleteMe‘
  2. 执行命令:
        $ 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/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查看

  3. 在YouCompleteMe中生成libclang.so和ycm_core.so文件 
    执行 make ycm_core,这样将在~/.vim/bundle/YouCompleteMe/python/目录下自动生成两个文件(libclang.so和ycm_core.so)
  4. 这还是不够的,还必须执行命令:make ycm_support_libs。 这条命令才会生成第三个文件ycm_client_support.so。因为,YouCompleteMe是C/S架构的,所以存在服务器和服务端的说法。
  5. 最后设置.ycm_extra_conf.py文件。
  6. 在.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> " 跳转到定义处
时间: 2024-10-09 16:37:11

Vim自动补全神器–YouCompleteMe的相关文章

Vim自动补全神器&ndash;YouCompleteMe

一.简介 YouCompleteMe是Vim的自动补全插件,与同类插件相比,具有如下优势1.基于语义补全2.整合实现了多种插件 clang_complete.AutoComplPop .Supertab .neocomplcache .Syntastic(类似功能,仅仅针对c/c++/obj-c代码) 3.支持多种语言 c.c++.obj-c.c#.python 对于其他的语言,会调用vim设置的omnifunc来匹配,因此同样支持php,ruby等语言. 4.YouCompleteMe除了提供

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

Vim自动补全插件----YouCompleteMe安装与配置 使用Vim编写程序少不了使用自动补全插件,在Linux下有没有类似VS中的Visual Assist X这么方便快捷的补全插件呢?以前用的是neocomplcache+code_complete+omnicppcomplete,但效果还是不是很好.看到有YCM后前面的插件可以说拜拜了. YouCompleteMe:一个随键而全的.支持模糊搜索的.高速补全的插件.YCM 由 google 公司搜索项目组的软件工程师 Strahinja

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

原文网址:http://www.cnblogs.com/zhongcq/p/3630047.html 使用Vim编写程序少不了使用自动补全插件,在Linux下有没有类似VS中的Visual Assist X这么方便快捷的补全插件呢?以前用的是neocomplcache+code_complete+omnicppcomplete,但效果还是不是很好.看到有YCM后前面的插件可以说拜拜了. YouCompleteMe:一个随键而全的.支持模糊搜索的.高速补全的插件.YCM 由 google 公司搜索

Vim自动补全神器:YouCompleteMe(转)

转自:http://blog.jobbole.com/58978/ 可能会有一段时间写linxu,免不了用vim,留着,找时间实操之 原文出处: marchtea 的博客 第一次听说这个插件还是在偶然的情况下看到别人的博客,听说了这个插件的大名.本来打算在实训期间来完成安装的,无奈网实在不给力,也就拖到了回家的时候.在开始准备工作的时候就了解到这个插件不是很容易安装,安装的时候果然名不虚传.(关于这方面的内容,请查看另一篇文章)不过,有付出总有回报,安装之后用上这个插件,真心为这个插件的强大所折

Vim自动补全神器:YouCompleteMe

第一次听说这个插件还是在偶然的情况下看到别人的博客,听说了这个插件的大名.本来打算在实训期间来完成安装的,无奈网实在不给力,也就拖到了回家的时候.在开始准备工作的时候就了解到这个插件不是很容易安装,安装的时候果然名不虚传.(关于这方面的内容,请查看另一篇文章)不过,有付出总有回报,安装之后用上这个插件,真心为这个插件的强大所折服. 那这个插件有何不同? YouCompleteMe的特别之处 基于语义补全 总所周知,Vim是一款文本编辑器.也就是说,其最基础的工作就是编辑文本,而不管该文本的内容是

vim自动补全插件YouCompleteMe

前言 Valloric/YouCompleteMe可以说是vim安装最复杂的插件之一,但是一旦装好,却又是非常好用的.YouCompleteMe简称ycm 在安装折腾的过程中,我再一次的体会到,除了官网教程,百度上的教程都是辣鸡,都是坑! 安装准备: 1.确保已经安装好build-essential 和 cmake .ycm是编译型补全插件,这两个工具是编译ycm用的. sudo apt-get install build-essential cmake 2.确保已经安装好了python-dev

史上最强大的 Vim 代码补全引擎:YouCompleteMe

引言 自己之前Vim的代码补全插件都是使用 ctags + autotag + taglist + omnicppcompele 的组合,而且很多时候都没有提示或提示补全,而且每次打开一个新文件文件都需要创建一个 ctag 标签库,代码补全才能正能工作,十分的繁琐蛋疼.当时我就在想,既然源代码都有了,难道就没有一个 Vim 插件能的通过已有的源代码,实时构建语法书来提供代码补全提示吗?通过一番搜索,终于发现了她--YouCompleteMe,看了介绍,我开始迫不及待的试用了,顿时感觉从小米加步枪

VIM自动补全插件 - YouCompleteMe--&quot;大神级vim补全插件&quot;

VIM自动补全插件 - YouCompleteMe 序言 vim 之所以被称为编辑器之神多半归功于其丰富的可DIY的灵活插件功能,( 例如vim下的这款神级般的代码补全插件YouCompleteMe), 使用VIM的用户也多半感觉 IDE开发工具不够轻便,且IDE往往只支持特定的几种语言或者特定系统平台,多数人用来用去,还是觉得VIM最顺手,用起来最舒心. 下面这个VIM的自动补全插件——YouCompleteMe,为我们弥补了vim不能自动补全的缺憾.YCM不仅仅对C族语言的支持非常好,而且它

Archlinux YouCompleteMe vim自动补全插件

Archlinux 安装和配置vim补全插件YouCompleteMe的过程. 参考: https://github.com/Valloric/YouCompleteMe https://github.com/gmarik/Vundle.vim http://www.cnblogs.com/zhongcq/p/3630047.html 1.用vundle下载YouCompleteMe和syntastic 2.pacman -S clang (编译会得到/usr/lib/libclang.so)