UltiSnips і YouCompleteMe


130

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

Хтось із вас використовує ці два додатки разом? Що я можу зробити, щоб змусити роботу "shift-tab"? Чи можете ви порекомендувати ще одну клавішу для запуску фрагментів?


YCM також карта <S-Tab>і так само UltiSnips, IIRC. Ви повинні запитати автора YCM, я думаю.
— romainl

я змінив ключі для попереднього завершення на ycm і видалив s-tab. все ще не працює. Я спробую надсилати йому повідомлення на github, я здогадуюсь
— pvinis

1
Перевірте, чи працює ваша карта :verbose map <S-Tab>, але, ймовірно, не буде працювати в командному рядку vim. Досить гарна заміна imo <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
Як вже згадували інші, рішення Джої Лю вже не працює. Це робить!
— Прив’язка

3
Чи є спосіб виділити фрагменти у списку автоматичного завершення?
— синтагма

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, це зіставлення працює досить плавно.


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/isissue/… І BufEnter autocmd кілька коментарів.
— чес

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 .. о, добре, випрацював у підсумку!


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

Звичайно, якщо ви просто збережете налаштування, які надав Джоу Лю, а потім просто скористаєтесь цією функцією, все буде працювати чудово!

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>"і ваш набір!


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 за замовчуванням, він запускає тригер UltiSnip розширення за замовчуванням <tab>як ключ завершення вибору, так Не буде розширено фрагменти UltiSnip <tab>. Надайте їм різні прив'язки ключів, це вирішить проблему, я особисто використовую <c-nі <c-p>для YCM, і використовую за замовчуванням <tab>UltiSnip. Більш детальну інформацію можна отримати з help youcompletemedoc in 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
— Ruto Collins

0

Я використовую kj. Це те, що є в моєму.vimrc :

let g:UltisnipsExpandTrigger="kj".

Рідко трапляється, що я натрапляю на слово, яке є kjв ньому. У такому випадку я просто зачекаю пару секунд після введення тексту kта цього типу j.


0

Як зазначають інші, відображення Cj на ultisnips чудово працює.
let g:UltiSnipsExpandTrigger="<c-j>"

Тепер, якщо піти трохи далі і встановити xcape і використовувати
xcape -e "Shift_L=Control_R|J"

Ви даєте можливість використовувати лише клавішу shift для utlitsnips.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.