我在我的macvim上安装了ultisnips和youcompleteme。
问题是ultisnips不起作用,因为tab被ycm绑定。
我尝试使用let g:UltiSnipsExpandTrigger = "<s-tab>"
以便我可以使用shift-tab触发代码段完成,但它不会因某种未知原因而起作用。我可以使用大写作为触发器,但到目前为止我还没有办法做到这一点。
你们有没有一起使用这两个附加组件? 我可以做些什么来制作换档标签? 你能推荐另一把钥匙来触发片段吗?
答案 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_completion和g:ycm_key_list_previous_completion选项更改YouCompleteMe绑定。请注意,当选项从单个字符串更改为字符串列表时,最近更改了这些选项的名称。
答案 7 :(得分:3)
只是把Michaelslec,Joey Liu和我在this issue thread和this 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键的功能。