138

我在我的 macvim 上安装了 bundle ultisnips 和 youcompleteme。问题是 ultisnips 不起作用,因为 tab 受 ycm 约束。我尝试 putlet g:UltiSnipsExpandTrigger = "<s-tab>"以便可以使用 shift-tab 触发代码段完成,但由于某些未知原因它不起作用。我可以使用大写作为触发器,但到目前为止我还没有找到这样做的方法。

你们中有人一起使用这两个附加组件吗?我该怎么做才能使 shift-tab 工作?你能推荐另一个触发片段的键吗?

4

14 回答 14

203

另一种选择是使用 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 绑定到制表符。UltiSnips 和 SuperTab 配合得很好,所以你可以直接将 UltiSnips 绑定到 tab,一切都会好起来的。

于 2014-03-07T15:01:04.343 回答
52

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

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

虽然此设置将使扩展片段共享在片段中向前跳转的默认映射,但它模拟了 UltiSnips 帮助标签中提到的 TextMates 的行为。

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

于 2013-06-30T09:26:15.370 回答
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>"
于 2013-09-08T16:11:08.910 回答
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 .. 哦,好吧,最后成功了!

于 2013-02-16T09:53:35.707 回答
18

我个人选择不<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.

于 2014-08-27T17:25:53.367 回答
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>"
于 2015-12-04T11:45:46.470 回答
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>"和你的设置!

于 2014-02-24T05:54:13.980 回答
4

根据 Siegfried 的回答,我正在使用以下看起来更自然的方法:

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其他地方使用绑定(从一个窗格切换到另一个),但这只会在正常模式下,所以没有问题。

于 2015-09-03T21:02:07.890 回答
3

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

于 2013-02-15T20:52:39.223 回答
3

虽然许多答案在这篇文章中运行良好,但我只想说问题是由 YCM 和 UltiSnip 之间的键绑定冲突引起的,而 YCM 默认支持 UltiSnip 片段,它采用默认的 UltiSnip 扩展触发器<tab>作为其完成选择键,所以UltiSnip 片段不会被扩展<tab>。给他们不同的键绑定将解决问题,我个人使用YCM 和 UltiSnip 的默认<c-n值。您可以使用vim 中的 doc 获取更多详细信息。<c-p><tab>help youcompleteme

于 2015-01-11T02:39:44.653 回答
3

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

set paste

.vimrc如果它存在,请确保将其删除。

于 2016-06-01T07:28:46.130 回答
2

;用来扩展 UltiSnips,这对我来说太棒了

let g:UltiSnipsExpandTrigger = ";"
于 2020-01-14T06:47:48.333 回答
1

我用kj. 这就是我的.vimrc

let g:UltisnipsExpandTrigger="kj".

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

于 2017-08-16T05:18:15.633 回答
0

正如其他人所提到的,将 Cj 映射到 ultisnips 效果很好。
let g:UltiSnipsExpandTrigger="<c-j>"

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

您释放了仅使用 utlitsnips 的 shift 键的力量。

于 2019-05-22T22:46:59.690 回答