UltiSnips e YouCompleteMe


130

Ho installato bundle ultisnips e youcompleteme sul mio macvim. Il problema è che ultisnips non funziona perché la scheda è rilegata da ycm. Ho provato a metterlo in let g:UltiSnipsExpandTrigger = "<s-tab>"modo da poter attivare il completamento dello snippet con shift-tab, ma non funziona per qualche motivo sconosciuto. Potrei usare i tappi come trigger, ma finora non ho trovato alcun modo per farlo.

Qualcuno di voi usa questi due componenti aggiuntivi insieme? Cosa posso fare per far funzionare il cambio a schede? Puoi consigliare un altro tasto per attivare i frammenti?


YCM mappa anche <S-Tab>così come UltiSnips, IIRC. Dovresti chiedere all'autore di YCM, immagino.
Romainl,

ho cambiato le chiavi per il completamento precedente su ycm e rimosso s-tab. continua a non funzionare. proverò a
mandargli un

1
Verifica se la tua mappa funziona :verbose map <S-Tab>, probabilmente non funzionerà su Vim dalla riga di comando. Un imo sostitutivo abbastanza buono è <CR>.
Daan Bakker,

Grazie per questo ero ansioso di trovare una soluzione e il fatto che YouCompleteMe non abbia un forum è fastidioso. Grazie
atmosx,

2
Hai provato di nuovo di recente? Uno o entrambi i plug-in devono essere stati aggiornati, poiché la documentazione di UltiSnips dice: "YouCompleteMe - viene fornito con il supporto di completamento immediato per UltiSnips. Offre un dialogo di completamento davvero piacevole per i frammenti".
Kyle Strand,

Risposte:


188

Un'altra opzione sta usando il plugin 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>"

Qui YouCompleteMe è associato a una combinazione diversa Ctrln, ma poi quella combinazione è associata a tab tramite SuperTab. UltiSnips e SuperTab giocano bene insieme, quindi puoi semplicemente associare UltiSnips alla scheda direttamente e tutto funzionerà.


7
Il suggerimento di Joey Liu non funzionava per me (la scheda non espandeva nulla, scorreva solo fino alla successiva opzione di completamento automatico). Questa risposta ha funzionato benissimo, ma prima ho dovuto aggiornare e ricompilare YouCompleteMe.
BenjaminGolder,

1
Come altri hanno già detto, la soluzione di Joey Liu non funziona più. Questo fa!
Ancora il

3
Esiste un modo per evidenziare i frammenti nell'elenco di completamento automatico?
syntagma,

3
DANNAZIONE ! Amico! Funzionando come un incanto! La migliore soluzione di sempre!
Yves Lange,

4
È bello, ma colpire taball'interno di uno snippet passerà al tabstop successivo, invece di completare il suggerimento YCM. Ho dovuto aggiungere let g:UltiSnipsJumpForwardTrigger = "<Right>"e let g:UltiSnipsJumpBackwardTrigger = "<Left>"far funzionare tutto questo.
Gabriel Florit,

48

Prova questo suggerimento su una pagina dal tracker dei problemi YouCompleteMe. Nel tuo .vimrc:

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

Mentre questa impostazione farà sì che l'espansione di uno snippet condivida la mappatura predefinita per saltare in avanti all'interno di uno snippet , simula il comportamento di TextMates come menzionato nei tag di aiuto di UltiSnips.

Da quando ho mappato il tasto BLOC MAIUSC su Ctrl, questa mappatura funziona in modo abbastanza fluido.


1
Questa dovrebbe essere la risposta migliore, semplice e diretta, anche se nel mio macvim su macOS 10.12, <cj> non funziona, lo cambio in <ck>, quindi tutto funziona perfettamente. <tab> avanti, <s-tab> indietro, <ck> espandi lo snippet. Grazie
gpanda,

40

copia il seguente codice su vimrc e divertiti. Questa funzione gestirà tutti i problemi tra YCM e 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
Un po 'di credito dove è dovuto penso: github.com/Valloric/YouCompleteMe/issues/… E BufEnter ha scritto alcuni commenti.
ches

3
Questo non sembra funzionare per me, per Mac OS X; dal 10 luglio 2014. La risposta di Siegfried ha funzionato, tuttavia.
miguel.martin,

Sembra fantastico finora! Ma come posso "passare in rassegna" i punti di interruzione dello snippet?
Chmanie,

1
Ho trovato utile legare in g:UltiSnipsJumpForwardTrigger="<cr>"modo da poter ancora passare in
rassegna

1
Questo mi permette di scorrere i completati elencati in YCM (compresi i suggerimenti di Ultisnips), ma l'ultima riga <espr> inoremap non sembra influenzare la mia pressione del tasto Invio. Posso attivare manualmente il completamento con <Cy>, ma invio non fa nulla. Eventuali suggerimenti?
HaaR,

18

ho questo nel mio vimrc

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

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

questo è quello che ho fatto al mio primo tentativo, ma ho sbagliato a scrivere UltiSnips con Ultisnips .. vabbè, alla fine ho risolto!


17

Personalmente ho scelto di non utilizzare <tab>YouCompleteMe ma di navigare manualmente.

Quindi ho aggiunto questo al mio .vimrc:

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

che disabilita semplicemente la tabchiave per YCM. Utilizzare invece i tasti di spostamento (frecce o CTRL-N/ CTRL-P) e selezionare la voce con CR. UltiSnips funziona come predefinito tab.


5

Mettendo insieme le risposte di Michaelslec, Joey Liu e insieme alle soluzioni che ho trovato in questo thread di discussione e in quello di questo ragazzo , ora ho questo che ha risolto praticamente tutti i problemi.

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

Ciò è stato molto utile quando essenzialmente si è cercato di risolvere lo stesso problema con COC e Ultisnips. Volendo usare <TAB> e <S-TAB> per spostarsi su e giù nel PUM e per spostarsi avanti e indietro all'interno dei segnaposto di Ultisnips. Grazie.
110100100,

4

Anche se so che questo post è un po 'vecchio, ho una mia funzione che è un po' più ottimizzata di quella indicata sopra:

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

Ovviamente, se mantieni le impostazioni fornite da Joey Liu e poi usi questa funzione, tutto funzionerà perfettamente!

EDIT: Inoltre, utilizzo un'altra funzione per aumentare la funzionalità di back-stepping tra YouCompleteMe e UltiSnips. Ti mostrerò cosa intendo:

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

  return ""                                                                                                                   
endfunction

Quindi inseriscilo nel tuo .vimrc:

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

Così come let g:UltiSnipsJumpBackwardTrigger="<s-tab>"e il tuo set!


3

Li uso entrambi insieme. Per impostazione predefinita YouCompleteMe si lega <Tab>e <Down>per selezionare l'elemento di completamento successivo e anche <S-Tab>e <Up>per selezionare l'elemento di completamento precedente. È possibile modificare i collegamenti YouCompleteMe con le opzioni g: ycm_key_list_select_completion e g: ycm_key_list_previous_completion . Si noti che i nomi di queste opzioni sono stati recentemente modificati quando l'opzione è stata cambiata da una singola stringa a un elenco di stringhe.


3

Ho installato il plug-in UltiSnips dopo il plug-in YouCompleteMe, quindi ho pensato che fossero in conflitto, ma in realtà ho avuto qualcosa di più interferente:

set paste

Assicurati di rimuoverlo da .vimrcse è presente.


2

Mentre molte risposte funzionano bene in questo post, voglio solo dire che il problema è causato dalla collisione dell'associazione dei tasti tra YCM e UltiSnip, mentre YCM supporta gli snippet UltiSnip per impostazione predefinita, prende il trigger di espansione UltiSnip predefinito <tab>come chiave di selezione del completamento, quindi Gli snippet di UltiSnip non verranno espulsi da <tab>. Assegnare loro una diversa associazione di tasti risolverà il problema, io personalmente uso <c-ne <c-p>per YCM e utilizzo l'impostazione predefinita <tab>per UltiSnip. Puoi ottenere maggiori dettagli con help youcompletemedoc in vim.


2

Sulla base della risposta di Siegfried, sto usando quanto segue che sembra più naturale:

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

Uso anche i c-hjklcollegamenti da qualche altra parte (passando da un riquadro all'altro), ma sarebbe solo in modalità normale, quindi non c'è problema.


1

Uso ;per espandere UltiSnips, è così elegante per me

let g:UltiSnipsExpandTrigger = ";"

Modifica: ora lo uso \perché ho scoperto che non potevo scrivere ;sulla modalità di inserimento di Vim
Ruto Collins il

0

Io uso kj. Questo è ciò che è nel mio .vimrc:

let g:UltisnipsExpandTrigger="kj".

Raramente succede che mi imbatto nella parola che ha kjdentro. In questo caso, aspetterei solo un paio di secondi dopo aver digitato ke quel tipo j.


0

Come menzionato da altri, mappare Cj su ultisnips funziona alla grande.
let g:UltiSnipsExpandTrigger="<c-j>"

Ora, se vai un po 'oltre e installi xcape e use
xcape -e "Shift_L=Control_R|J"

Scatena il potere di usare solo il tasto Maiusc per utlitsnips.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.