UltiSnips和YouCompleteMe


130

我的macvim上安装了捆绑ultisnips和youcompleteme。问题是,由于tab被ycm绑定,所以ultisnips无法正常工作。我尝试放置,let g:UltiSnipsExpandTrigger = "<s-tab>"以便可以使用shift-tab触发代码段完成,但是由于某些未知原因,该代码不起作用。我可以使用大写作为触发,但是到目前为止,我还没有找到实现此目的的方法。

你们中的任何一个都一起使用这两个附加组件吗?如何使班次排班表工作?您可以推荐另一个按键来触发摘要吗?


YCM还绘制地图<S-Tab>,IIRC的UltiSnips 也是如此。我猜你应该问YCM的作者。
romainl

我更改了ycm上先前完成的键,并删除了s-tab。还是行不通。我会尝试在github上给他
发消息

1
看看您的地图是否正在使用:verbose map <S-Tab>,但是它可能无法在命令行vim上运行。一个相当不错的替代imo是<CR>
2013年

谢谢,我很想找到一个解决方案,而YouCompleteMe没有论坛这一事实很烦人。谢谢
atmosx

2
您最近是否再次尝试过?一个或两个插件必须已更新,因为UltiSnips文档说:“ YouCompleteMe-附带了对UltiSnips的开箱即用完成支持。它为片段提供了一个非常不错的完成对话。”
凯尔·斯特兰德

Answers:


188

另一个选择是使用SuperTab插件:

" if you use Vundle, load plugins:
Bundle 'ervandew/supertab'
Bundle 'Valloric/YouCompleteMe'
Bundle 'SirVer/ultisnips'

" make YCM compatible with UltiSnips (using supertab)
let g:ycm_key_list_select_completion = ['<C-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
let g:SuperTabDefaultCompletionType = '<C-n>'

" better key bindings for UltiSnipsExpandTrigger
let g:UltiSnipsExpandTrigger = "<tab>"
let g:UltiSnipsJumpForwardTrigger = "<tab>"
let g:UltiSnipsJumpBackwardTrigger = "<s-tab>"

这里,YouCompleteMe绑定到其他组合Ctrln,但是该组合通过SuperTab绑定到tab。UltiSnips和SuperTab可以很好地配合使用,因此您只需将UltiSnips绑定到选项卡即可,一切都会正常进行。


7
Joey Liu的建议对我不起作用(选项卡不会扩展任何内容,只会滚动到下一个自动完成选项)。这个答案很好用,但是我必须先更新和重新编译YouCompleteMe。
BenjaminGolder

1
正如其他人所提到的,Joey Liu的解决方案不再起作用。这一个!

3
有什么方法可以在自动完成列表上突出显示摘要吗?
宪法

3
该死的 !男子 !像魅力一样工作!有史以来最好的解决方案!
伊夫·兰格

4
很好,但是在摘要tab内打勾将转到下一个制表位,而不是完成YCM建议。我必须添加let g:UltiSnipsJumpForwardTrigger = "<Right>"let g:UltiSnipsJumpBackwardTrigger = "<Left>"使其工作。
加布里埃尔·弗洛里特

48

在YouCompleteMe问题跟踪器的页面上尝试此建议。在您的.vimrc中:

let g:UltiSnipsExpandTrigger="<c-j>"

尽管此设置将使扩展片段共享默认片段以在片段内向前跳转,但它会像UltiSnips帮助标签中所述模拟TextMates的行为。

由于我已将Caps Lock键映射到Ctrl,因此此映射工作非常顺利。


1
这应该是最好的答案,简单明了,尽管在macOS 10.12的macvim中,<cj>不起作用,我将其更改为<ck>,然后一切正常。<tab>向前,<s-tab>向后,<ck>扩展代码段。谢谢
gpanda

40

将以下代码复制到您的vimrc中,即可享受。此功能将处理YCM和UltiSnips之间的所有问题。

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

au BufEnter * exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=g:UltiSnips_Complete()<cr>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsListSnippets="<c-e>"
" this mapping Enter key to <C-y> to chose the current highlight item 
" and close the selection list, same as other IDEs.
" CONFLICT with some plugins like tpope/Endwise
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"

27
我认为应该归功于以下几点github.com/Valloric/YouCompleteMe/issues/… 然后BufEnter autocmd 写下了一些注释。
2013年

3
对于Mac OS X,这似乎对我不起作用。截至2014年7月10日。但是,齐格弗里德的答案有效。
miguel.martin 2014年

到目前为止看起来不错!但是,如何“切换”代码段断点?
chmanie 2014年

1
我发现绑定很方便,g:UltiSnipsJumpForwardTrigger="<cr>"因此我仍然可以浏览所有可能的完成内容/摘要
alaroldai 2014年

1
这使我可以选择列出的YCM完整选项卡(包括Ultisnips建议),但是最后一个inoremap <expr>行实际上似乎并不影响我按Enter键。我可以使用<Cy>手动触发完成,但是Enter却无济于事。有什么建议?
HaaR 2014年

18

我在vimrc中有这个

"" YouCompleteMe
let g:ycm_key_list_previous_completion=['<Up>']

"" Ultisnips
let g:UltiSnipsExpandTrigger="<c-tab>"
let g:UltiSnipsListSnippets="<c-s-tab>"

那就是我第一次尝试时所做的事情,但是我与Ultisnips拼写了UltiSnips ..哦,好的,最终解决了!


17

我个人选择不使用 <tab>与YouCompleteMe,而是手动进行导航。

所以我将其添加到我的.vimrc

let g:ycm_key_list_select_completion=[]
let g:ycm_key_list_previous_completion=[]

只是禁用了tabYCM 的密钥。而是使用移动键(箭头或CTRL-N/ CTRL-P),然后使用选择条目CR。UltiSnips默认使用tab


5

只需将Michaelslec,Joey Liu的答案以及在该问题线程中找到的解决方案以及这个人的vimrc放在一起,我现在就可以解决几乎所有问题。

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

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

当本质上试图解决COC和Ultisnips的同一问题时,这非常有用。想要使用<TAB>和<S-TAB>在PUM中上下移动以及在Ultisnips占位符中来回移动。谢谢。
110100100

4

尽管我知道这篇文章有些陈旧,但是我有一个比上面给出的函数更加优化的函数:

function! g:UltiSnips_Complete()
  call UltiSnips#ExpandSnippetOrJump()
  if g:ulti_expand_or_jump_res == 0
    if pumvisible()
      return "\<C-N>"
    else
      return "\<TAB>"
    endif
  endif

  return ""
endfunction

当然,如果您仅保留Joey Liu提供的设置,然后仅使用此功能,一切都将完美运行!

编辑:另外,我使用另一个函数来增加YouCompleteMe和UltiSnips之间的后退功能。我会告诉你我的意思:

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

  return ""                                                                                                                   
endfunction

然后将其放在您的.vimrc中:

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

以及let g:UltiSnipsJumpBackwardTrigger="<s-tab>"和您一起定!



3

我在YouCompleteMe插件之后安装了UltiSnips插件,因此我认为它们之间存在冲突,但实际上,我还有一些干扰:

set paste

确保从.vimrc存在的位置将其删除。


2

尽管本文中的“许多答案”效果很好,但我只想说问题是由YCM和UltiSnip之间的键绑定冲突引起的,而默认情况下,YCM支持UltiSnip片段,它将默认的UltiSnip扩展触发器<tab>作为其完成选择键,因此UltiSnip片段不会被扩展<tab>。给他们提供不同的键绑定将解决问题,我个人使用<c-n<c-p>对于YCM,<tab>对UltiSnip 使用默认值。您可以help youcompleteme在vim中使用doc 获取更多详细信息。


2

根据齐格弗里德的答案,我使用了以下似乎更自然的内容:

let g:ycm_key_list_select_completion = ['<C-j>']
let g:ycm_key_list_previous_completion = ['<C-k>']

let g:UltiSnipsExpandTrigger = "<C-l>"
let g:UltiSnipsJumpForwardTrigger = "<C-j>"
let g:UltiSnipsJumpBackwardTrigger = "<C-k>"

我还在c-hjkl其他地方使用绑定(从窗格切换到另一个),但这只能在正常模式下进行,所以没有问题。



0

我用kj。这就是我的.vimrc

let g:UltisnipsExpandTrigger="kj"

我很少碰到其中包含的文字kj。如果是这种情况,我将在键入k该类型后等待几秒钟j


0

正如其他人所提到的,将Cj映射到ultisnips非常有用。
let g:UltiSnipsExpandTrigger="<c-j>"

现在,如果您走得更远,安装xcape并使用
xcape -e "Shift_L=Control_R|J"

您可以释放仅使用utlitsnips的Shift键的功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.