let g:UltiSnipsExpandTrigger = "<s-tab>"
来设置Shift-Tab触发代码片段完成,但由于某种未知的原因它并没有生效。我可以使用Caps键作为触发器,但目前我还没有找到这样做的方法。你们中有人同时使用这两个附加组件吗? 我该如何让Shift-Tab起作用? 你能推荐另一个触发代码片段的键吗?
let g:UltiSnipsExpandTrigger = "<s-tab>"
来设置Shift-Tab触发代码片段完成,但由于某种未知的原因它并没有生效。我可以使用Caps键作为触发器,但目前我还没有找到这样做的方法。另一个选择是使用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,并且一切都会顺利进行。
let g:UltiSnipsJumpForwardTrigger="<Right>"
和let g:UltiSnipsJumpBackwardTrigger="<Left>"
以使其正常工作。 - Gabriel Florit在您的.vimrc文件中,尝试在YouCompleteMe问题跟踪器页面上提供的建议。
let g:UltiSnipsExpandTrigger="<c-j>"
虽然这个设置会使得扩展代码片段时使用默认的跳转映射,但它模拟了 UltiSnips 帮助标签中提到的 TextMates 行为。
由于我已经将大写锁定键映射为 Ctrl 键,因此这个映射可以很顺畅地工作。
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>"
g:UltiSnipsJumpForwardTrigger="<cr>"
绑定是很方便的,这样我仍然可以通过 Tab 键浏览所有可能的完成项/代码片段。 - alaroldai我在我的vimrc文件中有以下内容:
"" YouCompleteMe
let g:ycm_key_list_previous_completion=['<Up>']
"" Ultisnips
let g:UltiSnipsExpandTrigger="<c-tab>"
let g:UltiSnipsListSnippets="<c-s-tab>"
这就是我第一次尝试做的事情,但我把"UltiSnips"拼错成了"Ultisnips"... 哦,没关系,最终总算解决了!
借鉴了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>"
虽然我知道这篇帖子有点旧,但我有自己的函数,比上面给出的函数更加优化:
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
function! g:UltiSnips_Reverse()
call UltiSnips#JumpBackwards()
if g:ulti_jump_backwards_res == 0
return "\<C-P>"
endif
return ""
endfunction
au BufEnter * exec "inoremap <silent> " . g:UltiSnipsJumpBackwardTrigger . " <C-R>=g:UltiSnips_Reverse()<cr>"
还有let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
和你的设置!
根据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绑定(在不同窗格之间切换),但这只会在正常模式下进行,所以没有问题。
<Tab>
和<Down>
绑定到选择下一个完成项,将<S-Tab>
和<Up>
绑定到选择上一个完成项。您可以通过g:ycm_key_list_select_completion和g:ycm_key_list_previous_completion选项更改YouCompleteMe的绑定。请注意,当选项从单个字符串更改为字符串列表时,这些选项的名称最近已更改。虽然这篇文章中有很多正确的答案,但我想说问题是由YCM和UltiSnip之间的按键绑定冲突引起的。虽然YCM默认支持UltiSnip代码片段,但它将默认的UltiSnip扩展触发器<tab>
作为其完成选择键,因此UltiSnip代码片段将不会通过<tab>
进行扩展。给它们不同的按键绑定就可以解决问题,我个人使用<c-n>
和<c-p>
来控制YCM,而使用默认的<tab>
来控制UltiSnip。您可以在Vim中使用help youcompleteme
文档获取更多详细信息。
<S-Tab>
,UltiSnips 也是如此,如果我没记错的话。你应该询问 YCM 的作者,我猜。 - romainl:verbose map <S-Tab>
命令,检查你的映射是否正常工作,但在命令行 vim 中可能无法正常工作。在我看来,一个相当不错的替代方案是<CR>
。 - Daan Bakker