UltiSnips i YouCompleteMe


131

Mam pakiety ultisnips i youcompleteme zainstalowane na moim macvimie. Problem polega na tym, że ultisnips nie działa, ponieważ tab jest powiązany przez ycm. Próbowałem wstawić let g:UltiSnipsExpandTrigger = "<s-tab>"tak, że mogę uruchomić uzupełnianie fragmentu za pomocą shift-tab, ale z nieznanego powodu nie działa. Mógłbym użyć kapsli jako spustu, ale jak dotąd nie znalazłem sposobu, aby to zrobić.

Czy któryś z was używa tych dwóch dodatków razem? Co mogę zrobić, aby karta shift działała? Czy możesz polecić inny klucz do uruchamiania fragmentów?


YCM również mapuje, <S-Tab>podobnie jak UltiSnips, IIRC. Chyba powinieneś zapytać autora YCM.
romainl

Zmieniłem klucze do poprzedniego zakończenia na ycm i usunąłem s-tab. wciąż nie działa. spróbuję
wysłać

1
Sprawdź, czy twoja mapa działa :verbose map <S-Tab>, prawdopodobnie nie będzie działać na vimie z linii poleceń. Całkiem niezłym zamiennikiem jest imo <CR>.
Daan Bakker

Dzięki temu bardzo chciałem znaleźć rozwiązanie, a to, że YouCompleteMe nie ma forum jest denerwujące. Dzięki
atmx

2
Czy próbowałeś tego ostatnio ponownie? Jedna lub obie wtyczki musiały zostać zaktualizowane, ponieważ dokumentacja UltiSnips mówi: „YouCompleteMe - jest dostarczany z obsługą uzupełniania po wyjęciu z pudełka dla UltiSnips. Oferuje naprawdę fajne okno dialogowe uzupełniania fragmentów.”
Kyle Strand

Odpowiedzi:


191

Inną opcją jest użycie wtyczki 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>"

Tutaj YouCompleteMe jest powiązany z inną kombinacją Ctrln, ale ta kombinacja jest związana z tabulatorem SuperTab. UltiSnips i SuperTab grają dobrze razem, więc możesz po prostu powiązać UltiSnips bezpośrednio z zakładką i wszystko się ułoży.


7
Sugestia Joeya Liu nie działała dla mnie (zakładka niczego nie rozwinęła, tylko przewinęłaby się do następnej opcji autouzupełniania). Ta odpowiedź działała świetnie, ale najpierw musiałem zaktualizować i ponownie skompilować YouCompleteMe.
BenjaminGolder

1
Jak wspominali inni, rozwiązanie Joey Liu już nie działa. Ten ma!
Kotwica

3
Czy istnieje sposób na wyróżnienie fragmentów na liście autouzupełniania?
syntagma

3
CHOLERA ! Człowiek ! Działa jak urok! Najlepsze rozwiązanie w historii!
Yves Lange

4
To fajne, ale naciśnięcie tabwewnątrz fragmentu spowoduje przejście do następnego tabulatora, zamiast wypełnienia sugestii YCM. Musiałem dodać let g:UltiSnipsJumpForwardTrigger = "<Right>"i let g:UltiSnipsJumpBackwardTrigger = "<Left>"sprawić, by to zadziałało.
Gabriel Florit

51

Wypróbuj tę sugestię na stronie z narzędzia do śledzenia problemów YouCompleteMe. W twoim .vimrc:

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

Chociaż to ustawienie sprawi, że rozszerzenie współdzielonego skrawka będzie domyślnym mapowaniem do przeskakiwania do przodu w obrębie skrawka , symuluje zachowanie TextMates, jak wspomniano w tagach pomocy UltiSnips.

Odkąd zamapowałem klawisz Caps Lock na Ctrl, to mapowanie działa dość płynnie.


1
To powinna być najlepsza odpowiedź, prosta i prosta, chociaż w moim macvimie na macOS 10.12 <cj> nie działa, zmieniam go na <ck>, wtedy wszystko działa dobrze. <tab> do przodu, <s-tab> do tyłu, <ck> rozwiń fragment. Dzięki
gpanda

Byłem nowy w Ultisnips i wypróbowałem tę sugestię. Nie polecałbym tego, ponieważ mapowanie zarówno „skoku do przodu”, jak i „rozwinięcia” do tego samego klucza sprawia, że ​​zagnieżdżone fragmenty stają się bezużyteczne, co jest czymś, czego najprawdopodobniej w końcu będziesz potrzebować.
Kevin

40

skopiuj poniższy kod do swojego vimrc i ciesz się. Ta funkcja rozwiąże wszystkie problemy między YCM i 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
Myślę, że jest to zasługa: github.com/Valloric/YouCompleteMe/issues/ ... A BufEnter automatycznie doda kilka komentarzy.
ches

3
Wydawało się, że to nie działa dla mnie, w systemie Mac OS X; od 10 lipca 2014 r. Odpowiedź Siegfrieda zadziałała jednak.
miguel.martin

Na razie wygląda świetnie! Ale jak mogę przechodzić tabulatorami przez punkty przerwania fragmentu?
chmanie

1
Okazało się, że przydaje się powiązanie, g:UltiSnipsJumpForwardTrigger="<cr>"aby nadal móc przeglądać wszystkie możliwe uzupełnienia / fragmenty
alaroldai

1
To pozwala mi przechodzić przez listę zakończeń YCM (w tym sugestie Ultisnips), ale ostatnia linia inoremap <expr> tak naprawdę nie wpływa na moje naciśnięcie klawisza Enter. Mogę ręcznie wywołać uzupełnianie za pomocą <Cy>, ale enter nic nie robi. Jakieś sugestie?
HaaR

18

mam to w moim vimrc

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

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

to właśnie zrobiłem przy pierwszej próbie, ale błędnie napisałem UltiSnips z Ultisnips ... no cóż, w końcu wyszło!


17

Osobiście zdecydowałem się nie używać <tab>z YouCompleteMe, ale nawigować ręcznie.

Więc dodałem to do mojego .vimrc:

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

co po prostu wyłącza tabklucz dla YCM. Zamiast tego użyj klawiszy ruchu (strzałki lub CTRL-N/ CTRL-P) i wybierz wpis za pomocą CR. UltiSnips działa domyślnie z tab.


5

Łącząc tylko odpowiedzi Michaelsleca, Joeya Liu i razem z rozwiązaniami, które znalazłem w tym wątku i vimrc tego gościa , mam teraz to, co rozwiązało prawie wszystkie problemy.

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>"

Było to bardzo pomocne, gdy zasadniczo próbowałem rozwiązać ten sam problem z COC i Ultisnips. Chcą używać <TAB> i <S-TAB> do poruszania się w górę iw dół PUM, a także do poruszania się tam iz powrotem w obiektach zastępczych Ultisnips. Dzięki.
110100100

4

Chociaż wiem, że ten post jest trochę stary, mam własną funkcję, która jest nieco bardziej zoptymalizowana niż ta podana powyżej:

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

Oczywiście, jeśli po prostu zachowasz ustawienia, które dostarczył Joey Liu, a następnie po prostu użyjesz tej funkcji, wszystko będzie działać idealnie!

EDYCJA: Używam również innej funkcji, aby zwiększyć funkcjonalność cofania się między YouCompleteMe i UltiSnips. Pokażę ci o co mi chodzi:

function! g:UltiSnips_Reverse()                                                                                               
  call UltiSnips#JumpBackwards()                                                                                              
  if g:ulti_jump_backwards_res == 0        
    return "\<C-P>"                                                                                                           
  endif                                                                                                                       

  return ""                                                                                                                   
endfunction

Następnie umieść to w swoim .vimrc:

au BufEnter * exec "inoremap <silent> " . g:UltiSnipsJumpBackwardTrigger . " <C-R>=g:UltiSnips_Reverse()<cr>"

A także let g:UltiSnipsJumpBackwardTrigger="<s-tab>"i Twój zestaw!


3

Używam ich obu razem. Domyślnie YouCompleteMe wiąże <Tab>i <Down>wybiera następny element ukończenia, a także <S-Tab>i <Up>wybiera poprzedni element ukończenia. Wiązania YouCompleteMe można zmienić za pomocą opcji g: ycm_key_list_select_completion i g: ycm_key_list_previous_completion . Zauważ, że nazwy tych opcji zostały ostatnio zmienione, gdy opcja została zmieniona z pojedynczego ciągu na listę ciągów.


3

Opierając się na odpowiedzi Siegfrieda, używam następujących, które wydają się bardziej naturalne:

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>"

Używam też c-hjklpowiązań gdzie indziej (przełączam się z jednego panelu na inny), ale byłoby to tylko w trybie normalnym, więc nie ma problemu.


To działa i wydaje się naturalne. Dziękuję za udostępnienie!
Rudolf Adamkovič

3

Zainstalowałem wtyczkę UltiSnips po wtyczce YouCompleteMe, więc myślałem, że są ze sobą sprzeczne, ale w rzeczywistości miałem coś bardziej przeszkadzającego:

set paste

Pamiętaj, aby usunąć to z, .vimrcjeśli jest obecne.


2

Podczas gdy wiele odpowiedzi działa dobrze w tym poście, chcę tylko powiedzieć, że problem jest spowodowany kolizją powiązań klawiszy między YCM i UltiSnip, podczas gdy YCM domyślnie obsługuje fragmenty UltiSnip, przyjmuje domyślny wyzwalacz rozwijania UltiSnip <tab>jako klawisz wyboru zakończenia, więc Fragmenty UltiSnip nie zostaną rozszerzone o <tab>. Danie im innego przypisania klucza rozwiąże problem, osobiście używam <c-ni <c-p>dla YCM i używam domyślnego <tab>dla UltiSnip. Możesz uzyskać więcej szczegółów z help youcompletemedoc in vim.


1

Używam kj. Oto, co jest w moim .vimrc:

let g:UltisnipsExpandTrigger="kj".

Rzadko się zdarza, że ​​trafiam na słowo, które ma kjw sobie. W takim przypadku odczekałbym tylko kilka sekund po wpisaniu ki tym typie j.


1

Używam ;do rozwijania UltiSnips, jest to dla mnie takie fajne

let g:UltiSnipsExpandTrigger = ";"

Edycja: teraz używam \ ponieważ stwierdziłem, że nie mogę pisać ;w trybie wstawiania Vima
Kaka Ruto

0

Jak wspominali inni, mapowanie Cj na ultisnips działa świetnie.
let g:UltiSnipsExpandTrigger="<c-j>"

Teraz, jeśli pójdziesz trochę dalej i zainstalujesz xcape i użyj
xcape -e "Shift_L=Control_R|J"

Uwolnisz moc używania tylko klawisza Shift do utlitsnips.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.