UltiSnips和YouCompleteMe

我捆绑了ultisnips,并在my macvim上安装了完整版。 问题是ultisnips不工作,因为tab是由ycm绑定的。 我试着让let g:UltiSnipsExpandTrigger = "<s-tab>"这样我就可以通过shift-tab来触发代码片段的完成,但是由于某些未知的原因,这不起作用。 我可以使用大写字母作为触发器,但到目前为止,我找不到这样做的方法。

你们有没有使用这两个附加组件? 我能做些什么来做shift-tab工作? 你能推荐另一个键来触发片段吗?

另一种select是使用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 = ['<Cn>', '<Down>'] let g:ycm_key_list_previous_completion = ['<Cp>', '<Up>'] let g:SuperTabDefaultCompletionType = '<Cn>' " better key bindings for UltiSnipsExpandTrigger let g:UltiSnipsExpandTrigger = "<tab>" let g:UltiSnipsJumpForwardTrigger = "<tab>" let g:UltiSnipsJumpBackwardTrigger = "<s-tab>" 

这里YouCompleteMe绑定到不同的组合键Ctrl n ,但是那个组合绑定到通过SuperTab的选项卡。 UltiSnips和SuperTab在一起玩的很好,所以你可以直接绑定UltiSnips选项卡,一切都会生效。

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

 let g:UltiSnipsExpandTrigger="<cj>" 

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

由于我已将我的大写locking键映射到Ctrl,因此此映射运行得非常顺利。

将下面的代码复制到你的vimrc中,并享受。 此function将处理YCM和UltiSnips之间的所有问题。

 function! g:UltiSnips_Complete() call UltiSnips#ExpandSnippet() if g:ulti_expand_res == 0 if pumvisible() return "\<Cn>" 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 . " <CR>=g:UltiSnips_Complete()<cr>" let g:UltiSnipsJumpForwardTrigger="<tab>" let g:UltiSnipsListSnippets="<ce>" " this mapping Enter key to <Cy> 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() ? "\<Cy>" : "\<Cg>u\<CR>" 

我有这个在我的vimrc

 "" YouCompleteMe let g:ycm_key_list_previous_completion=['<Up>'] "" Ultisnips let g:UltiSnipsExpandTrigger="<c-tab>" let g:UltiSnipsListSnippets="<cs-tab>" 

多数民众赞成在我第一次尝试,但我拼写UltiSnips与Ultisnips ..哦,最后解决了!

我个人select不使用<tab>与YouCompleteMe,但手动导航。

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

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

它简单地禁用了YCM的tab键。 而是使用移动键并select带有CR的条目。 UltiSnips默认使用标签

虽然我知道这个post有点老,但是我有我自己的function,比上面给出的更好一些:

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

当然,如果你只保留了Joey Liu提供的设置,然后使用这个function,所有的东西都可以完美的工作!

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

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

然后把这个放在你的.vimrc中:

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

以及let g:UltiSnipsJumpBackwardTrigger="<s-tab>"和您的设置!

把Michaelslec,Joey Liu的答案和我在这个问题线程和这个人的vimrc中find的解决scheme放在一起,我现在已经解决了所有问题。

 function! g:UltiSnips_Complete() call UltiSnips#ExpandSnippet() if g:ulti_expand_res == 0 if pumvisible() return "\<Cn>" 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 "\<CP>" 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 . " <CR>=g:UltiSnips_Complete()<cr>" au InsertEnter * exec "inoremap <silent> " . g:UltiSnipsJumpBackwardTrigger . " <CR>=g:UltiSnips_Reverse()<cr>" 

我一起使用他们两个。 默认情况下,YouCompleteMe绑定<Tab><Down>来select下一个完成项目,还有<S-Tab><Up>来select上一个完成项目。 您可以使用g:ycm_key_list_select_completion和g:ycm_key_list_previous_completion选项更改YouCompleteMe绑定。 请注意,当选项从单个string更改为string列表时,这些选项的名称最近已更改。

虽然许多答案在这篇文章中工作得很好,但我只想说这个问题是由YCM和UltiSnip之间的键绑定冲突造成的,而YCM默认支持UltiSnip片段,它将默认的UltiSnip扩展触发器<tab>作为完成select键,所以UltiSnip片段不会被<tab> 。 给他们不同的键绑定会解决问题,我个人使用<cn<cp>作为YCM,并使用默认的<tab>作为UltiSnip。 你可以得到更多的细节, help youcompleteme在vim中help youcompleteme文档。

基于齐格弗里德的回答,我正在使用下面这似乎更自然:

 let g:ycm_key_list_select_completion = ['<Cj>'] let g:ycm_key_list_previous_completion = ['<Ck>'] let g:UltiSnipsExpandTrigger = "<Cl>" let g:UltiSnipsJumpForwardTrigger = "<Cj>" let g:UltiSnipsJumpBackwardTrigger = "<Ck>" 

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

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

 set paste 

确保从.vimrc删除它。

我用kj 。 这是我的.vimrc

let g:UltisnipsExpandTrigger="kj"

我很less碰到有kj词。 如果是这种情况,我只需要inputk和那个typesj ,等待几秒钟。