UltiSnips和YouCompleteMe

时间:2013-02-15 13:57:55

标签: vim autocomplete macvim ultisnips

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

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

14 个答案:

答案 0 :(得分:171)

另一个选择是使用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绑定到不同的组合 Ctrl n ,但随后该组合将通过SuperTab绑定到tab。 UltiSnips和SuperTab可以很好地协同工作,因此您可以直接将UltiSnips绑定到制表符,一切都会正常运行。

答案 1 :(得分:46)

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

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

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

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

答案 2 :(得分:37)

将以下代码复制到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>"

答案 3 :(得分: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 ..哦,最后得到了结果!

答案 4 :(得分:11)

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

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

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

只是禁用YCM的标签键。而是使用移动键(箭头或CTRL-N / CTRL-P)并选择 CR 条目。 UltiSnips默认使用 tab

答案 5 :(得分: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>"和你的套装!

答案 6 :(得分:3)

我一起使用它们。默认情况下,YouCompleteMe会绑定<Tab><Down>以选择下一个完成项目,同时选择<S-Tab><Up>来选择上一个完成项目。您可以使用g:ycm_key_list_select_completiong:ycm_key_list_previous_completion选项更改YouCompleteMe绑定。请注意,当选项从单个字符串更改为字符串列表时,最近更改了这些选项的名称。

答案 7 :(得分:3)

只是把Michaelslec,Joey Liu和我在this issue threadthis guy's 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>"

答案 8 :(得分:2)

虽然很多回答在这篇文章中都很好用,但我只想说问题是由YCM和UltiSnip之间的键绑定冲突引起的,而YCM默认支持UltiSnip片段,它采用默认的UltiSnip扩展触发器{{1} }作为完成选择键,因此<tab>不会对UltiSnip片段进行详细说明。给他们不同的键绑定将解决问题,我个人使用<tab><c-n表示YCM,并使用默认<c-p>表示UltiSnip。您可以使用vim中的<tab> doc获取更多详细信息。

答案 9 :(得分: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绑定(从窗格切换到另一个窗格),但这只是在普通模式下,所以没有问题。

答案 10 :(得分:2)

我在YouCompleteMe插件之后安装了UltiSnips插件,所以我认为它们存在冲突,但实际上我有更多的干扰:

set paste

确保将.vimrc中的内容删除(如果有)。

答案 11 :(得分:1)

我使用;扩展UltiSnips,对我来说真是太好了

let g:UltiSnipsExpandTrigger = ";"

答案 12 :(得分:0)

我使用kj。这就是我的.vimrc

let g:UltisnipsExpandTrigger="kj"

我很少遇到包含kj的单词。如果是这种情况,我会在输入k并输入j后等待几秒钟。

答案 13 :(得分:0)

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

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

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