UltiSnips и YouCompleteMe

У меня есть пакеты ultisnips и youcompleteme, установленные на моем macvim. Проблема заключается в том, что ultisnips не работает, потому что tab привязан ycm. Я попробовал поставить let g:UltiSnipsExpandTrigger = "<s-tab>", чтобы я мог выполнить завершение фрагмента с помощью shift-tab, но это не работает по неизвестной причине. Я мог бы использовать кепки в качестве триггера, но до сих пор я не нашел способа сделать это.

Кто-нибудь из вас использует эти два дополнения вместе? Что я могу сделать для работы shift-tab? Можете ли вы порекомендовать другой ключ для запуска фрагментов?

Ответ 1

У меня это в моем vimrc

"" YouCompleteMe
let g:ycm_key_list_previous_completion=['<Up>']

"" Ultisnips
let g:UltiSnipsExpandTrigger="<c-tab>"
let g:UltiSnipsListSnippets="<c-s-tab>"

thats, что я сделал с моей первой попытки, но я опечатал UltiSnips с Ultisnips.. о, хорошо, выработал в конце!

Ответ 2

Другой вариант - использовать плагин 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. UltiSnips и SuperTab играют хорошо вместе, поэтому вы можете просто привязать UltiSnips к вкладке напрямую, и все будет работать.

Ответ 3

Попробуйте это предложение на странице из трекера YouCompleteMe. В вашем .vimrc:

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

В то время как этот параметр расширяет фрагмент , разделяющий сопоставление по умолчанию для перехода по фрагменту, он имитирует поведение TextMates, как указано в тегах справки UltiSnips.

Так как я сопоставил свой ключ Caps Lock с Ctrl, это сопоставление работает довольно плавно.

Ответ 4

скопируйте следующий код в свой 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>"

Ответ 5

Я лично решил не использовать <tab> с YouCompleteMe, но перемещаться по нему вручную.

Итак, я добавил это в свой .vimrc:

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

который просто отключает клавишу tab для YCM. Вместо этого вы используете клавиши перемещения и выбираете запись с помощью CR. UltiSnips работает по умолчанию с tab.

Ответ 6

Хотя я знаю, что этот пост немного стар, у меня есть моя собственная функция, которая немного оптимизирована, чем приведенная выше:

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, а затем просто используйте эту функцию, все будет работать отлично!

EDIT: Кроме того, я использую другую функцию для увеличения функциональности повторного шага между 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>" и ваш набор!

Ответ 7

Я использую оба из них вместе. По умолчанию YouCompleteMe связывает <Tab> и <Down>, чтобы выбрать следующий элемент завершения, а также <S-Tab> и <Up>, чтобы выбрать предыдущий элемент завершения. Вы можете изменить привязки YouCompleteMe с помощью g: ycm_key_list_select_completion и g: ycm_key_list_previous_completion. Обратите внимание, что имена этих параметров были недавно изменены, когда опция была изменена из одной строки в список строк.

Ответ 8

Просто составив ответы Михаэля, Джой Лю и вместе с решениями, которые я нашел в этой теме и этот парень 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>"

Ответ 9

В то время как многие ответы прекрасно работают в этом сообщении, я просто хочу сказать, что проблема вызвана конфликтом привязки ключей между YCM и UltiSnip, в то время как YCM поддерживает фрагменты UltiSnip по умолчанию, он принимает триггер расширения UltiSnip по умолчанию <tab> как его ключ выбора завершения, поэтому фрагменты UltiSnip не будут расширяться <tab>. Дайте им различную привязку ключей, решив проблему, я лично использую <c-n и <c-p> для YCM и использую по умолчанию <tab> для UltiSnip. Вы можете получить более подробную информацию с помощью help youcompleteme doc в vim.

Ответ 10

Основываясь на ответе Зигфрида, я использую следующее, что кажется более естественным:

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 где-то еще (переключение с панели на другую), но это будет только в нормальном режиме, поэтому проблем нет.

Ответ 11

Я установил плагин UltiSnips после плагина YouCompleteMe, поэтому я думал, что они конфликтуют, но на самом деле у меня было что-то более мешающее:

set paste

Обязательно удалите это из .vimrc, если оно присутствует.

Ответ 12

Я использую kj. Это то, что находится в моем .vimrc:

let g:UltisnipsExpandTrigger="kj".

Редко бывает, что я сталкиваюсь с словом, в котором есть kj. Если это так, я просто подождал бы пару секунд после ввода k и этого типа j.

Ответ 13

Как уже упоминалось, отображение Cj в ultisnips прекрасно работает.
let g:UltiSnipsExpandTrigger="<cj>"

Теперь, если вы пойдете немного дальше, установите xcape и используйте
xcape -e "Shift_L=Control_R|J"

Вы раскрываете силу использования только клавиши Shift для utlitsnips.