UltiSnips и YouCompleteMe
У меня есть пакеты ultisnips и youcompleteme, установленные на моем macvim. Проблема в том, что ultisnips не работает, потому что tab связан с ycm. Я пытался положить let g:UltiSnipsExpandTrigger = "<s-tab>"
так что я могу запустить завершение фрагмента с помощью shift-tab, но это не работает по неизвестной причине. Я мог бы использовать шапки в качестве триггера, но пока я не нашел способа сделать это.
Кто-нибудь из вас использует эти два дополнения вместе? Что я могу сделать, чтобы заставить работать shift-tab? Можете ли вы порекомендовать другую клавишу для запуска фрагментов?
12 ответов
У меня есть это в моем Vimrc
"" YouCompleteMe
let g:ycm_key_list_previous_completion=['<Up>']
"" Ultisnips
let g:UltiSnipsExpandTrigger="<c-tab>"
let g:UltiSnipsListSnippets="<c-s-tab>"
это то, что я сделал с первой попытки, но я с ошибкой написал UltiSnips с Ultisnips... ну, в конце концов, все получилось!
Другой вариант использует плагин 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 к вкладке, и все получится.
Попробуйте это предложение на странице трекера проблем YouCompleteMe. В вашем.vimrc:
let g:UltiSnipsExpandTrigger="<c-j>"
В то время как этот параметр заставляет расширение фрагмента совместно использовать сопоставление по умолчанию для перехода вперед во фрагменте, он имитирует поведение TextMates, как упомянуто в тегах справки UltiSnips.
Поскольку я сопоставил свою клавишу Caps Lock с Ctrl, это отображение работает довольно гладко.
Скопируйте следующий код в ваш 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>"
Я лично решил не использовать <tab>
с YouCompleteMe, но перемещайтесь по нему вручную.
Так что я добавил это к моему .vimrc
:
let g:ycm_key_list_select_completion=[]
let g:ycm_key_list_previous_completion=[]
который просто отключает клавишу табуляции для YCM. Вместо этого вы используете клавиши перемещения и выбираете запись с CR. UltiSnips работает по умолчанию с вкладкой.
Просто соединив ответы Майклслека, Джо Лю и вместе с решениями, которые я нашел в этой теме и в 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
Конечно, если вы просто сохраните настройки, предоставленные Joey Liu, а затем просто воспользуетесь этой функцией, все будет работать идеально!
РЕДАКТИРОВАТЬ: Кроме того, я использую другую функцию для повышения функциональности back-step между 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>"
и ваш набор!
Основываясь на ответе Зигфрида, я использую следующее, которое кажется более естественным:
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
привязки где-то еще (переключение с панели на другую), но это будет только в обычном режиме, так что проблем нет.
Я установил плагин UltiSnips после плагина YouCompleteMe, так что я подумал, что они конфликтуют, но на самом деле у меня было что-то более мешающее:
set paste
Убедитесь, что удалили это из .vimrc
если он присутствует.
Несмотря на то, что многие ответы отлично работают в этом посте, я просто хочу сказать, что проблема вызвана конфликтом привязки клавиш между YCM и UltiSnip, в то время как YCM по умолчанию поддерживает фрагменты UltiSnip, для этого используется стандартный триггер расширения UltiSnip. <tab>
после завершения выберите ключ, поэтому фрагменты UltiSnip не будут расширяться <tab>
, Дай им разные ключи, связка решит проблему, я лично пользуюсь <c-n
а также <c-p>
для YCM и использовать по умолчанию <tab>
для УльтиСнип. Вы можете получить более подробную информацию с help youcompleteme
Документ в VIM.
Я использую их обоих вместе. По умолчанию YouCompleteMe связывает <Tab>
а также <Down>
выбрать следующий элемент завершения, а также <S-Tab>
а также <Up>
выбрать предыдущий элемент завершения. Вы можете изменить привязки YouCompleteMe с помощью параметров g:ycm_key_list_select_completion и g:ycm_key_list_previous_completion. Обратите внимание, что имена этих параметров были недавно изменены, когда параметр был изменен с одной строки на список строк.
Я использую ;
чтобы расширить UltiSnips, это так здорово для меня
let g:UltiSnipsExpandTrigger = ";"
Я использую kj
, Это то, что в моем .vimrc
:
let g:UltisnipsExpandTrigger="kj"
,
Это редко случается, что я сталкиваюсь с словом, которое имеет kj
в этом. Если это так, я бы подождал пару секунд после ввода k
и этот тип j
,
Как уже упоминалось, отображение Cj в ultisnips прекрасно работает.let g:UltiSnipsExpandTrigger="<c-j>"
Теперь, если вы пойдете немного дальше, установите xcape и используйтеxcape -e "Shift_L=Control_R|J"
Вы раскрываете силу использования только клавиши Shift для utlitsnips.