UltiSnips和YouCompleteMe

pvi*_*nis 124 vim autocomplete macvim ultisnips

我在我的macvim上安装了ultisnips和youcompleteme.问题是ultisnips不起作用,因为tab被ycm绑定.我尝试使用,let g:UltiSnipsExpandTrigger = "<s-tab>"以便我可以使用shift-tab触发代码段完成,但它不会因某些未知原因而起作用.我可以使用大写作为触发器,但到目前为止,我发现没有办法做到这一点.

你们中的任何人一起使用这两个附加组件吗?我可以做些什么来制作换档标签?你能推荐另一把钥匙来触发片段吗?

Sie*_*ter 180

另一个选择是使用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>"
Run Code Online (Sandbox Code Playgroud)

这里YouCompleteMe绑定到一个不同的组合Ctrln,但随后该组合通过SuperTab绑定到tab.UltiSnips和SuperTab可以很好地协同工作,因此您可以直接将UltiSnips绑定到选项卡,一切都会正常运行.

  • Joey Liu的建议对我不起作用(tab不会扩展任何内容,它只会滚动到下一个自动完成选项).这个答案很有效,但我必须先更新并重新编译YouCompleteMe. (7认同)
  • 这很好,但在片段内点击"tab"将转到下一个tabstop,而不是完成YCM建议.我不得不添加`let g:UltiSnipsJumpForwardTrigger ="<Right>"`和`让g:UltiSnipsJumpBackwardTrigger ="<Left>"`来使这个工作. (4认同)
  • 有没有办法在自动填充列表中突出显示片段? (3认同)
  • 该死的 !男人 !像魅力一样工作!有史以来最好的解决方案! (3认同)

unb*_*ble 46

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

let g:UltiSnipsExpandTrigger="<c-j>"
Run Code Online (Sandbox Code Playgroud)

虽然此设置将扩展代码段共享作为在代码段内向前跳转的默认映射,但它会模拟TextMates在UltiSnips帮助标记中提到的行为.

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


Joe*_*Liu 38

将以下代码复制到您的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>"
Run Code Online (Sandbox Code Playgroud)

  • 我认为应该归功于它:https://github.com/Valloric/YouCompleteMe/issues/36#issuecomment-15451411并且BufEnter自动发表了一些评论. (27认同)
  • 对于Mac OS X来说,这对我来说似乎不起作用; 截至2014年7月10日.齐格弗里德的回答有效. (2认同)

pvi*_*nis 18

我在我的vimrc中有这个

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

"" Ultisnips
let g:UltiSnipsExpandTrigger="<c-tab>"
let g:UltiSnipsListSnippets="<c-s-tab>"
Run Code Online (Sandbox Code Playgroud)

这就是我第一次尝试时所做的,但是我用Ultisnips拼错了UltiSnips ..好吧,最终得到了解决方案!


Tho*_*ser 12

我个人选择不使用<tab>YouCompleteMe,而是手动导航.

所以我把它添加到我的.vimrc:

let g:ycm_key_list_select_completion=[]
let g:ycm_key_list_previous_completion=[]
Run Code Online (Sandbox Code Playgroud)

它只是禁用了tabYCM 的密钥.而是使用移动键并选择条目CR.UltiSnips默认使用tab.


sud*_*ang 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>"
Run Code Online (Sandbox Code Playgroud)