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.