Vim自动补全神器–YouCompleteMe

时间:2021-01-25 17:29:30
本文主要根据http://blog.marchtea.com/archives/161改编

第一次听说这个插件还是在偶然的情况下看到别人的博客,听说了这个插件的大名.本来打算在实训期间来完成安装的,无奈网实在不给力,也就拖到了回家的时候.在开始准备工作的时候就了解到这个插件不是很容易安装,安装的时候果然名不虚传.(关于这方面的内容,请查看另一篇文章)不过,有付出总有回报,安装之后用上这个插件,真心为这个插件的强大所折服.

那这个插件有何不同?

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

使用感受

  • 和IDE一样,自动补全,
  • 根据include的文件进行补全
  • 不用再蹩脚的生成tags
  • 补全非常精准,而且速度很快,不会有延迟(以前在大项目上,acp用起来实在是很卡)
  • 支持类似tags的跳转,跳到定义处以及使用处
  • 出错提示很智能,并且用起来真的是如丝般柔滑,不用输入:w进行强制检测

安装

说完了那么多好处,就要说到安装了.不同于以往其他vim插件,YCM是一款编译型的插件.在下载完后,需要手动编译后才能使用.对应其他的插件来说,仅仅就是把.vim的文件丢到相应文件夹下就可以.而这也加大了使用YCM的难度.

安装准备

  • 最新版的Vim(7.3.584+),编译时添加+python标志(已经安装的可以通过vim --version查看)
  • cmake(ubuntu可以通过sudo
    apt-get install build-essential cmake来安装
    )
  • python头文件(ubuntu可以通过sudo apt-get install python-dev python3-dev来安装)
  • 安装vundle插件,用于安装管理vim的插件
    按照作者在https://github.com/gmarik/Vundle.vim#about提供的方法安装好vundle。主要就是下载

ubuntu下自动安装

.vimrc中的

call vundle#begin() 与
call vundle#end()  之间
添加下列代码

Plugin Valloric/YouCompleteMe

保存退出后打开vim,在正常模式下输入
:PluginInstall

等待:PluginInstall将YouCompleteMe安装完成

而后进行编译安装:

cd ~/.vim/bundle/YouCompleteMe
./install --clang-completer

如果不需要c-family的补全,可以去掉--clang-completer.如果需要c#的补全,请加上--omnisharp-completer.

正常来说,YCM会去下载clang的包,如果已经有,也可以用系统--system-libclang.

就这样,安装结束.打开vim,输入如下命令:

1 :YcmDiags

如果没有提示错误,那就说明插件安装好了。

如果没有提示YCM未编译,则说明安装已经成功了.

ubuntu下手动编译安装

安装的脚本并不是什么时候都好用,至少对我来说是这样的.安装完之后出现了问题,参考issue#809.

在用

:PluginInstall
安装完成后使用

git clone --recursive https://github.com/Valloric/YouCompleteMe.git

获取最新的仓库,而后使用git submodule update --init --recursive确认仓库的完整性后,开始安装流程.

  1. 安装cmake(ubuntu下使用sudo apt-get install build-essential cmake)
  2. 安装python-dev.(ubuntu下使用sudo
    apt-get install python-dev python3-dev
     
    )
  3. 编译

    ./install --clang-completer

这样就完成了,开始感受YCM提供的完全不逊色于大型IDE所提供的自动补全功能吧.

配置

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

一般来说,我会在~目录下放一个默认的模板,而后再根据不同的项目在当前目录下再拷贝个.ycm_extra_conf.py.
主要就是设置-I与-isystem的选项

import osimport ycm_coreflags = [    '-std=c++11',    '-stdlib=libc++',    '-Wno-deprecated-declarations',    '-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',    '-x',    'c++',    '-I',    '.',    '-isystem',    'D:/android-ndk-r9c/platforms/android-19/arch-arm/usr/include/sys',    '-isystem',    'D:/android-ndk-r9c/platforms/android-19/arch-arm/usr/include',    '-isystem',    'D:/android-ndk-r9c/sources/cxx-stl/llvm-libc++/libcxx/include',    '-I',    'D:/work/jni/inc',    '-I',    'D:/work/jni/common',]compilation_database_folder = ''if compilation_database_folder:  database = ycm_core.CompilationDatabase( compilation_database_folder )else:  database = NoneSOURCE_EXTENSIONS = '.cpp''.cxx''.cc''.c''.m''.mm' ]def DirectoryOfThisScript():  return os.path.dirname( os.path.abspath( __file__ ) )def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):  if not working_directory:    return list( flags )  new_flags = []  make_next_absolute = False  path_flags = '-isystem''-I''-iquote''--sysroot=' ]  for flag in flags:    new_flag = flag    if make_next_absolute:      make_next_absolute = False      if not flag.startswith( '/' ):        new_flag = os.path.join( working_directory, flag )    for path_flag in path_flags:      if flag == path_flag:        make_next_absolute = True        break      if flag.startswith( path_flag ):        path = flag[ len( path_flag ): ]        new_flag = path_flag + os.path.join( working_directory, path )        break    if new_flag:      new_flags.append( new_flag )  return new_flagsdef IsHeaderFile( filename ):  extension = os.path.splitext( filename )[ 1 ]  return extension in '.h''.hxx''.hpp''.hh' ]def GetCompilationInfoForFile( filename ):  if IsHeaderFile( filename ):    basename = os.path.splitext( filename )[ 0 ]    for extension in SOURCE_EXTENSIONS:      replacement_file = basename + extension      if os.path.exists( replacement_file ):        compilation_info = database.GetCompilationInfoForFile(          replacement_file )        if compilation_info.compiler_flags_:          return compilation_info    return None  return database.GetCompilationInfoForFile( filename )def FlagsForFile( filename, **kwargs ):  if database:    compilation_info = GetCompilationInfoForFile( filename )    if not compilation_info:      return None    final_flags = MakeRelativePathsInFlagsAbsolute(      compilation_info.compiler_flags_,      compilation_info.compiler_working_dir_ )  else:    relative_to = DirectoryOfThisScript()    final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )  return {    'flags': final_flags,    'do_cache'True  }

YouCompleteMe提供的其他功能

YCM除了提供了基本的补全功能,自动提示错误的功能外,还提供了类似tags的功能:

  • 跳转到定义GoToDefinition
  • 跳转到声明GoToDeclaration
  • 以及两者的合体GoToDefinitionElseDeclaration

可以在.vimrc中配置相应的快捷键.

nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>
nnoremap
<leader>gf :YcmCompleter GoToDefinition<CR>
nnoremap
<leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>

另外,YCM也提供了丰富的配置选项,同样在.vimrc中配置.具体请参考

let g:ycm_error_symbol = '>>'
let g:ycm_warning_symbol = '>*'

同时,YCM可以打开location-list来显示警告和错误的信息:YcmDiags.个人关于ycm的配置如下:

" for ycm
let g:ycm_error_symbol = '>>'
let g:ycm_warning_symbol = '>*'
nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>
nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
nmap <F4> :YcmDiags<CR>
" YouCompleteMe 功能" 补全功能在注释中同样有效let g:ycm_complete_in_comments=1" 允许 vim 加载 .ycm_extra_conf.py 文件,不再提示let g:ycm_confirm_extra_conf=0" 开启 YCM 基于标签引擎let g:ycm_collect_identifiers_from_tags_files=1" 引入 C++ 标准库tags,这个没有也没关系,只要.ycm_extra_conf.py文件中指定了正确的标准库路径set tags+=/data/misc/software/misc./vim/stdcpp.tags" YCM 集成 OmniCppComplete 补全引擎,设置其快捷键inoremap <leader>; <C-x><C-o>" 补全内容不以分割子窗口形式出现,只显示补全列表set completeopt-=preview" 从第一个键入字符就开始罗列匹配项let g:ycm_min_num_of_chars_for_completion=1" 禁止缓存匹配项,每次都重新生成匹配项let g:ycm_cache_omnifunc=0" 语法关键字补全           let g:ycm_seed_identifiers_with_syntax=1" 修改对C函数的补全快捷键,默认是CTRL + space,修改为ALT + ;let g:ycm_key_invoke_completion = '<M-;>'" 设置转到定义处的快捷键为ALT + G,这个功能非常赞nmap <M-g> :YcmCompleter GoToDefinitionElseDeclaration <C-R>=expand("<cword>")<CR><CR>

YCM提供的跳跃功能采用了vim的jumplist,往前跳和往后跳的快捷键为Ctrl+O以及Ctrl+I.

总结

YouCompleteMe是我用过的最爽的一个自动补全的插件了.之前使用acp时,遇到大文件基本上就卡死了,以至于都不怎么敢使用.由于YCM使用的时C/S结构,部分使用vim脚本编写,部分认为原生代码,使得跑起来速度飞快.

抛弃Vim自带的坑爹的补全吧,抛弃ctags吧,抛弃cscope吧,YCM才是终极补全神器.

在安装过程中,我也遇到了不少的坑.一会会发一篇解决这些坑的文章.

最后祝大家码年顺利,一码平川,码到功成.


一些用户对于ycm的讨论:

  • 小熊

    可惜在win下不能工作

    2013年6月30日回复转发
  • Vim自动补全神器–YouCompleteMecc

    Win下编译通过了,现在还没有弄明白怎么配配置文件

    2013年8月6日回复转发
    • Vim自动补全神器–YouCompleteMecloudzu

      主要是要设置好头文件的搜索路径,你可以参考下我的配置文件
      https://github.com/yunfeizu/dotfiles/blob/master/vim/toolkit/ycm/ycm_extra_conf.py

      2013年8月8日回复转发
      • Vim自动补全神器–YouCompleteMecc

        晓得了,lz有试过在c++文件中补全c头文件里的函数没。目前,我这里能补全c++头文件里的了,但是不能补全c头文件里的函数。是不是我少配置了什么?

        2013年8月12日回复转发
        • Vim自动补全神器–YouCompleteMecloudzu

          很少需要用到补全C函数,貌似和clang的参数有关,不过编译器的配置不是常人能懂的。最快的方法,问ycm的作者 Vim自动补全神器–YouCompleteMe,去github上提个issue吧:https://github.com/Valloric/YouCompleteMe/issues?page=1&state=open, Valloric回复的相当快。

          2013年8月14日回复转发
          • Vim自动补全神器–YouCompleteMecc

            昨天浏览了下YCM的issue,找到解决方法了。Valloric说c函数不会自动补全,需要手动执行补全命令。默认的快捷键是<C-Space>,中文用户可能需要绑定下快捷键。写在这里,好让其他朋友看到~

            2013年8月15日回复转发
          • Vim自动补全神器–YouCompleteMeazure

            回复 cc: clang对win的支持不行,如果用了vc的一些语言特性,比如特定的warning之类的,完全搞不定

            2013年8月20日回复转发
          • Vim自动补全神器–YouCompleteMehousansan

            回复 cc: 补全printf没有??是不是.ycm_extra_conf.py要修改什么?

            2013年12月14日回复转发
          • Vim自动补全神器–YouCompleteMecc

            回复 housansan: YCM默认不自动不全C的全局函数(比如printf,scanf),如果需要补全需要手动执行。YCM默认的手动补全的快捷键是<C-Space>,对应的命令是ycm_key_invoke_completion,而<C-Space>在中文环境下默认是切换输入法的快捷键,所以要重新绑定快捷键。不是在.ycm_extra_conf.py做修改,而是在.vimrc里做修改,比如重新绑定为<S-Space>即Shift+空格可以了。

            2013年12月15日回复转发
          • Vim自动补全神器–YouCompleteMecloudzu

            回复 cc: Vim自动补全神器–YouCompleteMe 解释的很清楚

            2013年12月16日回复转发
          • Vim自动补全神器–YouCompleteMehousansan

            回复 cc: 有什么方法能自动补全全局C,像C++一样补全函数,找了半天没找到

            2014年1月11日回复转发
          • Vim自动补全神器–YouCompleteMemirkoyoung

            回复 cc: 额。。。原来是这样,但是我的还有关键字也不能不全,不知道是何故

            2014年10月2日回复转发
          • Vim自动补全神器–YouCompleteMemirkoyoung

            回复 cc: 按<C-Space>显示的是omni补全,我还以为有什么问题呢。。。c++关键字和c函数都是只能靠<C-Space>么

            2014年10月2日回复转发
  • Vim自动补全神器–YouCompleteMehominlinx

    你好,请问在vim中如何比较好的实现,我输入{}时,代码能够想ST2一样将}回车,并光标移动到{的下一行?谢谢诶

    2013年9月1日回复转发
    • Vim自动补全神器–YouCompleteMecloudzu

      没有用过类似的功能,我有在用autopair,输入{, 会自动补全}, 这时候光标是在两个括号中间的。然后打回车,在开启了autoindent 和smartindent的vim中, vim会把} 移到第三行,光标移到第二行,并做好缩进。如果有什么更好的办法,还望告知。

      2013年9月2日回复转发
      • Vim自动补全神器–YouCompleteMehominlinx

        你好,我用了delimitMate 自动补全,这个也可以将光标移到括号中间,根据你的方法,我在.vimrc中设置了set smartindent 和set autoindent ,但是我单击回车时,此时}会在第二行,光标在}上面,为何啊?

        2013年9月2日回复转发
        • Vim自动补全神器–YouCompleteMecloudzu

          我又仔细看了一下,回车的时候插入一行应该是autopair的功能,不知道delimitMate是否有类似的功能。
          autopair的文档有如下描述:
          g:AutoPairsMapCR 

          Default : 1 

          Map <CR> to insert a new indented line if cursor in (|), {|} [|], '|', "|" 
          execute 'inoremap <buffer> <silent> <CR> <C-R>=AutoPairsReturn()<CR>'

          2013年9月2日回复转发
      • Vim自动补全神器–YouCompleteMeTao Honker

        你好,好像c-support (c.vim) 这个插件有类似的功能:输入 `{`,赶快敲回车,光标就在下一行缩进位上,且在下下行有一个 `}` 补全。

        2013年12月21日回复转发
    • Vim自动补全神器–YouCompleteMe游客

      我是在vimrc 中配置: imap {} {}<ESC>i<CR><CR><ESC>ki 你也可以试试

      2014年10月31日回复转发
      • Vim自动补全神器–YouCompleteMebilly

        这个方法有效,但是比较粗暴,它会在所有文件中都执行这个操作

        2015年1月10日回复转发
    • Vim自动补全神器–YouCompleteMebilly

      请安装 插件 delimitMate

      2015年1月10日回复转发
  • Vim自动补全神器–YouCompleteMehominlinx

    你好,我在使用GoToDefinition时候经常出现:Can't jump to definition. 这是为啥啊?

    2013年9月1日回复转发
    • Vim自动补全神器–YouCompleteMecloudzu

      如果不是源文件有太多编译错误,可能是程序结构的问题,并不是所有的函数都可以找到定义,特别是一些库函数,一般最好用GoToDefinitionElseDeclaration,大部分时候跳到声明就足够了

      2013年9月2日回复转发
  • Vim自动补全神器–YouCompleteMehominlinx

    你好 在使用YCM时,对于大型的工程,工程里面自己写的函数、接口,在别的cpp里面能补全吗?我的只能补全系统函数,比如能补全string的函数,却不能补全我自己写的类

    2013年10月10日回复转发
    • Vim自动补全神器–YouCompleteMecloudzu

      你可以在Vim中执行:YcmDiags,看一下报什么样的错误信息?如果是找不到include file,你就需要在ycm_extra_config.py 中添加路径。

      2013年10月11日回复转发
  • Vim自动补全神器–YouCompleteMehominlinx

    我看了看你的ycm_extra_conf.py,需要自己设置flags,但是:
    1、"-I"跟“-isystem”有啥不同啊?
    2、‘-I’后面是不是将工程的根路径写上吗?你们貌似不是,而是写到了最后一级啊?

    2013年10月10日回复转发
    • Vim自动补全神器–YouCompleteMecloudzu

      1. 我们一般把“-I”用作自己的代码,"-isystem"用作第三代码。这样编译代码的时候,第三方代码编译时的warning,就不会显示出来,只需要专注在自己写的代码。
      2. 我们的makefile比较复杂,不同部分出自不同的人,写include的风格也有些不同,有人就喜欢在include后加上很长的路径,有人则认为路径配置在makefile中,include的时候只需要文件名就好了。

      2013年10月11日回复转发
      • Vim自动补全神器–YouCompleteMehominlinx

        你好,请问你一般将你的ycm_extra_conf.py放置的什么路径下面啊?是:.vim/bundle/YouCompleteMe/cpp/ycm/下面吗?
        还是自己的工程下面啊?

        2013年11月2日回复转发
        • Vim自动补全神器–YouCompleteMecloudzu

          我一般是放在工程目录下面的,因为我的ycm_extra_config.py里面有很多针对工程的相对路径

          2013年11月3日回复转发
          • Vim自动补全神器–YouCompleteMehominlinx

            能给我一个开源的工程参考一下吗?谢谢 我现在在学opengl

            2013年11月3日回复转发
      • Vim自动补全神器–YouCompleteMehominlinx

        还有一个问题:我现在在使用opengl,在ycm_extra_conf.py里面也加入了相应的flag,但是依然没有补全,不过我如果在写代码时,前面加入“::”,他就会补全,这是为啥啊?谢谢

        2013年11月2日回复转发
      • Vim自动补全神器–YouCompleteMewolfy

        -I是给CLANG的编译指令,跟GCC类似,这个是用来指定你要包含头文件的路径的。比如说你用了什么开源库之类的,都可以用-I,然后头文件路径,-L用来指定库路径

        2014年10月11日回复转发
  • Vim自动补全神器–YouCompleteMe冷风一夜

    你好,安装了YCM但是对Python文档不工作,下面显示“找不到补全模式”,感觉好奇怪。

    2013年10月15日回复转发
    • Vim自动补全神器–YouCompleteMecloudzu

      理论上YCM补全python不需要设置,可能是安装的问题,作者推荐使用vundle安装,你可以再重装试试。

      2013年10月16日回复转发
  • Vim自动补全神器–YouCompleteMewych

    补全很傻,写ruby 敲class 补全里居然有php XX

    2013年11月14日回复转发
  • Vim自动补全神器–YouCompleteMe丶因为

    YCM 需要tag文件支持嘛?

    2013年12月1日回复转发
  • Vim自动补全神器–YouCompleteMehousansan

    函数能自动补全参数不?

    2013年12月2日回复转发
    • Vim自动补全神器–YouCompleteMecloudzu

      不知道你说自动补全参数指的什么。补全函数时会有参数提示,上面的gif中有演示

      2013年12月3日回复转发
  • Vim自动补全神器–YouCompleteMedreamgoes

    " Installing bundles to /home/melo/.vi| 
    m/bundle 
    . Bundle 'gmarik/vundle' 
    > Bundle 'Valloric/YouCompleteMe' 
    Bundle 'scrooloose/syntastic' 
    Bundle 'tpope/vim-fugitive' 
    Bundle 'Lokaltog/vim-easymotion' 
    Bundle 'rstacruz/sparkup' 
    Bundle 'L9' 
    Bundle 'FuzzyFinder' 
    Bundle 'git://git.wincent.com/command
    t.git' 
    Helptags 

    Processing 'Valloric/YouCompleteMe'
    我安装插件一直是这个状态(处理安装第一个插件不动), 请问楼主这是什么原因?

    2013年12月5日回复转发
    • Vim自动补全神器–YouCompleteMeLC

      这个应该是还在下载, 这个文件有点大.

      2014年8月5日回复转发
  • Vim自动补全神器–YouCompleteMeSilent_hi

    你好,我想问一下你知道不知道YCM那个黑色配色哪里有,为什么要变量和方法名配色是一起的分不开,还有装了YCM之后,你普通的if for while自动补全怎么做到的,谢谢了。我是VIM菜鸟,正在学习,希望能得到你的回复。

    2013年12月19日回复转发
  • Vim自动补全神器–YouCompleteMeTao Honker

    请教 cloudzu,如何用whitelist/blacklist来让ycm不要在每次打开vim时都问问题?看它的doc没怎么看懂,我现在是指定一个ycm_global_ycm_extra_conf的方式来让它不叫唤的。

    2013年12月21日回复转发
  • Vim自动补全神器–YouCompleteMenob0dy

    我这里在补全一个函数的时候好像就只补全了函数名,不会出现函数名后面的括号,也无法补全函数的参数啊?

    2013年12月24日回复转发
  • Vim自动补全神器–YouCompleteMehousansan

    开发linux驱动,需要怎么添加?能否解释下 ycm_extra_conf.py含义

    2013年12月28日回复转发
  • Vim自动补全神器–YouCompleteMejune

    你好,我的YCM安装完以后,写了main.c,test.c,test.h.3个文件测试.函数test1()申明在test.h中.定义在test.c中,在main中想跳转到函数test1(),但是只能跳到申明处,想跳转到定义处时,提示 RuntimeError: Can't jump to definition.是不是还需要配置什么?

    2014年2月11日回复转发
    • Vim自动补全神器–YouCompleteMeDennis

      我也遇到了这样的问题,从文档上看,好像是说ycm只能跳转到当前的translation unit,也就是只能跳转到当前正在编辑的文件和被#include了的。。。。。不知道我的理解是否正确,哪位大神能补充一下,因为我也遇到了这个问题

      2014年11月16日回复转发
  • Vim自动补全神器–YouCompleteMe忆是星河

    您好,我安装ycm后,那个ycmd的服务老是打开失败,下面是给的提示
    HTTPConnectionPool(host='localhost', port=51092): Max retries exceeded with url: /event_no
    tification (Caused by <class 'socket.error'>: [Errno 111] 拒绝连接)
    An error occured. This is either a bug in UltiSnips or a bug in a 
    snippet definition. If you think this is a bug, please report it to
    https://github.com/SirVer/ultisnips/issues/new.

    Following is the full stack trace:
    Traceback (most recent call last):
    File "/home/sunqiang/.vim/bundle/ultisnips/pythonx/UltiSnips/snippet_manager.py", line 48, in wrapper
    return func(self, *args, **kwds)
    File "/home/sunqiang/.vim/bundle/ultisnips/pythonx/UltiSnips/snippet_manager.py", line 123, in expand_or_jump
    rv = self._try_expand()
    File "/home/sunqiang/.vim/bundle/ultisnips/pythonx/UltiSnips/snippet_manager.py", line 457, in _try_expand
    snippets = self._snips(before, False)
    File "/home/sunqiang/.vim/bundle/ultisnips/pythonx/UltiSnips/snippet_manager.py", line 397, in _snips
    for snippet in source.get_snippets(filetypes, before, possible):
    File "/home/sunqiang/.vim/bundle/ultisnips/pythonx/UltiSnips/snippet/source/file/_base.py", line 36, in get_snippets
    self._ensure_loaded(ft, set())
    File "/home/sunqiang/.vim/bundle/ultisnips/pythonx/UltiSnips/snippet/source/file/_base.py", line 54, in _ensure_loaded
    if self._needs_update(ft):
    File "/home/sunqiang/.vim/bundle/ultisnips/pythonx/UltiSnips/snippet/source/file/_base.py", line 63, in _needs_update
    existing_files = self._get_all_snippet_files_for(ft)
    File "/home/sunqiang/.vim/bundle/ultisnips/pythonx/UltiSnips/snippet/source/file/ultisnips.py", line 149, in _get_all_snippet_files_for
    return set(base_snippet_files_for(ft))
    File "/home/sunqiang/.vim/bundle/ultisnips/pythonx/UltiSnips/snippet/source/file/ultisnips.py", line 48, in base_snippet_files_for
    "You have 'snippets' in UltiSnipsSnippetDirectories. This "
    RuntimeError: You have 'snippets' in UltiSnipsSnippetDirectories. This directory is reserved for snipMate snippets. Use another directory for UltiSnips snippets.

    2014年3月6日回复转发
  • Vim自动补全神器–YouCompleteMefphoenix

    楼主,我安装ycm没成功。没用vundle工具下载ycm。安装步骤如下:
    1. cd ~/.vim/bundle ; git clone --recursive https://github.com/Valloric/YouCompleteMe.git 
    2. git submodule update --init --recursive
    3. mkdir ~/ycm_build ; cd ~/ycm_build
    4. cmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBCLANG=ON . ~/.vim/bundle/YouCompleteMe/cpp
    5. cd ~/.vim/bundle/YouCompleteMe/ ; ./install --clang-completer --system-libclang

    然后打开vim后,':YcmDiags'没反应。求帮助

    2014年5月6日回复转发
    • Vim自动补全神器–YouCompleteMefphoenix

      我已经在linux系统上安装过llvm和clang了

      2014年5月6日回复转发
    • Vim自动补全神器–YouCompleteMefphoenix

      第4步和第5步之间也make了

      2014年5月6日回复转发
  • Vim自动补全神器–YouCompleteMe最励志网

    过来支持一下 感值得收藏分享

    2015年8月8日回复转发
  • Vim自动补全神器–YouCompleteMe歪妖内涵网

    虽然不懂在说什么,但看起来貌似很厉害的样子

    2015年9月4日回复转发
  • Vim自动补全神器–YouCompleteMe爱奇趣

    不错,值得收藏分享!

    2015年9月7日回复转发
  • Vim自动补全神器–YouCompleteMe内涵段子

    不错不错,来看看。。

    2015年10月1日回复转发
  • Vim自动补全神器–YouCompleteMe邓荣飞

    python 补全没问题,可以跳转定义的位置就有问题。提示:RuntimeError: Can't jump to definition or declaration. 不知道这个跟ycm_extra_conf.py的配置关系是什么?

    1月15日回复转发
  • Vim自动补全神器–YouCompleteMe心灯一豆

    好的,谢谢了,之后尝试