YCM和Ultisnips按键冲突解决方案(只使用TAB键,无错误)

Preface

YCM(Youcompleteme)和Ultisnips两个都是很神奇的插件,但是更加神奇的事情发生了,他们的按键产生冲突。有很多的人都采取了替换别的按键的方法~但是作为一个完美主义者,而且为了减轻记忆的压力,算了吧~直接就不改按键了。


1. 原理

有两篇文章可以看一下,不过是英文的:
- How to Make YouCompleteMe Compatible With UltiSnips
- Github Issue-36
- YCM–AND–Yltisnips—Stackoverflow

主要是Ultisnips的调用等级比较高,如果有snippets的时候就会调用Ultisnips,如果没有snippets的时候就会调用YCM的自动补全功能。这样就可以完美的结合了。不过呢,在别人提供的方案里面(本例中),是将Utlisnips的内容放在YCM的补全列表里面,然后再将snippets放入其中。


2. 具体的修改方案

因为github上的issue上面的内容比较杂,因此整理出来:(本方案纯粹采集于github issue上的comment里的,亲自测试过没有问题)

1.Install YCM


2.Install UltiSnips


3.添加功能函数到.vimrc (from @JazzCore)

function! g:UltiSnips_Complete()
  call UltiSnips#ExpandSnippet()
  if g:ulti_expand_res == 0
    if pumvisible()
      return "\<C-n>"
    else
      call UltiSnips#JumpForwards()
      if g:ulti_jump_forwards_res == 0
        return "\<TAB>"
      endif
    endif
  endif
  return ""
endfunction

function! g:UltiSnips_Reverse()
  call UltiSnips#JumpBackwards()
  if g:ulti_jump_backwards_res == 0
    return "\<C-P>"
  endif

  return ""
endfunction


if !exists("g:UltiSnipsJumpForwardTrigger")
  let g:UltiSnipsJumpForwardTrigger = "<tab>"
endif
if !exists("g:UltiSnipsJumpBackwardTrigger")
  let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
endif



4.为了上面的函数创建一个自动BufEnter

au InsertEnter * exec "inoremap <silent> " . g:UltiSnipsExpandTrigger     . " <C-R>=g:UltiSnips_Complete()<cr>"
au InsertEnter * exec "inoremap <silent> " .     g:UltiSnipsJumpBackwardTrigger . " <C-R>=g:UltiSnips_Reverse()<cr>"



5.使用

  • 如果有snips,直接按tab键就可以完成添加
  • tab键往下走,shfit+tab键往上走

此方案基本无bug,解决了所有的出现的问题!
唯一的不足,唯一的!就是在有的时候补全会闪一下!日后修复这个问题。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值