UltiSnips и YouCompleteMe

130

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

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

pvinis
источник
YCM также отображает, как <S-Tab>и UltiSnips, IIRC. Думаю, вам следует спросить автора YCM.
romainl
Я изменил ключи для предыдущего завершения на ycm и удалил s-tab. все еще не работает. я попробую
написать
1
Посмотрите, работает ли ваша карта, :verbose map <S-Tab>хотя, вероятно, она не будет работать в командной строке vim. Хорошая замена имо есть <CR>.
Даан Баккер
Спасибо за это, я очень хотел найти решение, и тот факт, что у YouCompleteMe нет форума, меня раздражает. Спасибо
atmosx
2
Вы недавно пробовали это снова? Один или оба плагина должны быть обновлены, потому что в документации UltiSnips сказано: «YouCompleteMe - поставляется с готовой поддержкой автозавершения для UltiSnips. Он предлагает действительно красивый диалог завершения для сниппетов».
Кайл Стрэнд,

Ответы:

188

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

Зигфрид Геваттер
источник
7
Предложение Джои Лю не сработало для меня (вкладка ничего не расширяет, а только прокручивается до следующей опции автозаполнения). Этот ответ сработал отлично, но сначала мне пришлось обновить и перекомпилировать YouCompleteMe.
BenjaminGolder
1
Как уже упоминали другие, решение Джои Лю больше не работает. Это делает!
Anchor
3
Есть ли способ выделить фрагменты в списке автозаполнения?
syntagma
3
ЧЕРТ ! Мужчина ! Работает как шарм! Лучшее решение!
Ив Ланж,
4
Это хорошо, но tabнажатие внутри фрагмента приведет к переходу к следующей позиции табуляции, а не к завершению предложения YCM. Мне пришлось добавить let g:UltiSnipsJumpForwardTrigger = "<Right>"и let g:UltiSnipsJumpBackwardTrigger = "<Left>"заставить эту работу.
Габриэль Флорит
48

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

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

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

Поскольку я сопоставил свою клавишу Caps Lock с Ctrl, это сопоставление работает довольно плавно.

unblevable
источник
1
Это должен быть лучший ответ, простой и понятный, хотя в моем macvim на macOS 10.12 <cj> не работает, я меняю его на <ck>, тогда все работает нормально. <tab> вперед, <s-tab> назад, <ck> развернуть фрагмент. Спасибо
gpanda
40

скопируйте следующий код на свой 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>"
Джо Лю
источник
27
Я думаю, что некоторые заслуги там, где это необходимо: github.com/Valloric/YouCompleteMe/issues/… И BufEnter автоматически убрал несколько комментариев.
ches
3
Для меня это не сработало для Mac OS X; по состоянию на 10 июля 2014 года. Однако ответ Зигфрида работал.
miguel.martin
Пока все выглядит отлично! Но как я могу пролистать точки останова на фрагменте?
chmanie
1
Мне показалось удобным привязать, g:UltiSnipsJumpForwardTrigger="<cr>"чтобы я мог по-прежнему просматривать все возможные дополнения / фрагменты
alaroldai
1
Это позволяет мне пролистывать список завершений YCM (включая предложения Ultisnips), но последняя строка inoremap <expr> на самом деле, похоже, не влияет на нажатие клавиши ввода. Я могу вручную запустить завершение с помощью <Cy>, но ввод ничего не делает. Какие-либо предложения?
HaaR
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 ... ну, в конце концов, сработало!

pvinis
источник
17

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

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

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

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

Томас Фанкхаузер
источник
5

Просто собрал ответы Майклслек, Джои Лю и решения, которые я нашел в этой теме, и 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>"
Судо Бэнгбэнг
источник
Это было очень полезно при попытке исправить ту же проблему с COC и Ultisnips. Желание использовать <TAB> и <S-TAB> для перемещения вверх и вниз по PUM, а также для перемещения вперед и назад в пределах заполнителей Ultisnips. Спасибо.
110100100
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

Конечно, если вы просто сохраните настройки, которые предоставил Джои Лю, а затем просто воспользуетесь этой функцией, все будет работать идеально!

РЕДАКТИРОВАТЬ: Кроме того, я использую другую функцию для увеличения функциональности обратного перехода между 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>"и ваш набор!

Michaelslec
источник
3

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

Дэвид Браун
источник
3

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

set paste

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

Антуан Снайерс
источник
2

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

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

Николас Маттиа
источник
1

Я использую ;для расширения UltiSnips, для меня это так здорово

let g:UltiSnipsExpandTrigger = ";"
Руто Коллинз
источник
Изменить: теперь я использую, \потому что обнаружил, что не могу печатать ;в режиме вставки Vim
Руто Коллинз
0

Я использую kj. Вот что есть у меня .vimrc:

let g:UltisnipsExpandTrigger="kj",

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

dowewas
источник
0

Как упоминалось другими, сопоставление Cj с ultisnips отлично работает.
let g:UltiSnipsExpandTrigger="<c-j>"

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

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

Hritik
источник