UltiSnips und YouCompleteMe

130

Ich habe Bundles ultisnips und youcompleteme auf meinem Macvim installiert. Das Problem ist, dass ultisnips nicht funktioniert, da die Registerkarte durch ycm gebunden ist. Ich habe versucht zu setzen, let g:UltiSnipsExpandTrigger = "<s-tab>"damit ich die Snippet-Vervollständigung mit der Umschalttaste auslösen kann, aber es funktioniert aus einem unbekannten Grund nicht. Ich könnte Kappen als Auslöser verwenden, aber bisher habe ich keine Möglichkeit gefunden, dies zu tun.

Verwendet einer von Ihnen diese beiden Add-Ons zusammen? Was kann ich tun, damit die Umschalttaste funktioniert? Können Sie einen anderen Schlüssel zum Auslösen von Snippets empfehlen?

pvinis
quelle
YCM kartiert <S-Tab>auch UltiSnips, IIRC. Sie sollten den Autor von YCM fragen, denke ich.
Romainl
Ich habe die Schlüssel für die vorherige Fertigstellung auf ycm geändert und die S-Registerkarte entfernt. funktioniert immer noch nicht. Ich werde versuchen, ihn auf Github zu benachrichtigen, denke ich
Pvinis
1
Überprüfen Sie, ob Ihre Karte mit funktioniert :verbose map <S-Tab>, sie funktioniert jedoch wahrscheinlich nicht in der Befehlszeile vim. Ein ziemlich guter Ersatz imo ist <CR>.
Daan Bakker
Vielen Dank dafür, ich wollte unbedingt eine Lösung finden und die Tatsache, dass YouCompleteMe kein Forum hat, ist ärgerlich. Danke
atmosx
2
Haben Sie das kürzlich noch einmal versucht? Eines oder beide Plugins müssen aktualisiert worden sein, da in der UltiSnips-Dokumentation Folgendes steht: "YouCompleteMe - bietet Unterstützung für die sofortige Fertigstellung von UltiSnips. Es bietet einen wirklich schönen Abschlussdialog für Snippets."
Kyle Strand

Antworten:

188

Eine weitere Option ist die Verwendung des SuperTab-Plugins:

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

Hier ist YouCompleteMe an eine andere Kombination gebunden Ctrln, aber dann ist diese Kombination über SuperTab an die Registerkarte gebunden. UltiSnips und SuperTab spielen gut zusammen, sodass Sie UltiSnips einfach direkt an die Registerkarte binden können und alles klappt.

Siegfried Gevatter
quelle
7
Joey Lius Vorschlag funktionierte nicht für mich (die Registerkarte würde nichts erweitern, sondern nur zur nächsten Option für die automatische Vervollständigung scrollen). Diese Antwort funktionierte hervorragend, aber ich musste YouCompleteMe zuerst aktualisieren und neu kompilieren.
BenjaminGolder
1
Wie andere bereits erwähnt haben, funktioniert die Lösung von Joey Liu nicht mehr. Dieser tut es!
Anker
3
Gibt es eine Möglichkeit, Snippets in der Autocompletion-Liste hervorzuheben?
Syntagma
3
VERDAMMT ! Mann ! Arbeiten wie ein Zauber! Beste Lösung aller Zeiten!
Yves Lange
4
Das ist schön, aber wenn Sie tabin ein Snippet klicken, wird zum nächsten Tabstop gewechselt, anstatt den YCM-Vorschlag zu vervollständigen. Ich musste hinzufügen let g:UltiSnipsJumpForwardTrigger = "<Right>"und let g:UltiSnipsJumpBackwardTrigger = "<Left>"diese Arbeit machen.
Gabriel Florit
48

Probieren Sie diesen Vorschlag auf einer Seite des YouCompleteMe-Issue-Trackers aus. In Ihrer .vimrc:

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

Während diese Einstellung das Erweitern einer Snippet- Freigabe zur Standardzuordnung für das Vorwärtsspringen innerhalb eines Snippets macht , simuliert sie das Verhalten von TextMates, wie in den UltiSnips-Hilfetags erwähnt.

Da ich meine Feststelltaste der Strg-Taste zugeordnet habe, funktioniert diese Zuordnung ziemlich reibungslos.

nicht bleibbar
quelle
1
Dies sollte die beste Antwort sein, einfach und direkt, obwohl in meinem Macvim unter MacOS 10.12 <cj> nicht funktioniert, ich ändere es in <ck>, dann funktioniert alles einwandfrei. <tab> vorwärts, <s-tab> rückwärts, <ck> erweitern Sie das Snippet. Danke
gpanda
40

Kopieren Sie den folgenden Code in Ihr vimrc und genießen Sie. Diese Funktion behandelt alle Probleme zwischen YCM und 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>"
Joey Liu
quelle
27
Etwas Kredit, wo es fällig ist, denke ich: github.com/Valloric/YouCompleteMe/issues/… Und der BufEnter hat ein paar Kommentare nach unten geschrieben.
ches
3
Dies schien für mich unter Mac OS X nicht zu funktionieren. Stand 10. Juli 2014. Siegfrieds Antwort funktionierte jedoch.
miguel.martin
Scheint bisher großartig! Aber wie kann ich die Snippet-Haltepunkte "durchblättern"?
Chmanie
1
Ich fand es praktisch zu binden, g:UltiSnipsJumpForwardTrigger="<cr>"damit ich immer noch alle möglichen Vervollständigungen / Schnipsel
durchblättern konnte
1
Auf diese Weise kann ich die aufgelisteten YCM-Vervollständigungen (einschließlich Ultisnips-Vorschläge) durchblättern, aber die letzte Zeile inoremap <expr> scheint sich nicht auf mein Drücken der Eingabetaste auszuwirken. Ich kann den Abschluss manuell mit <Cy> auslösen, aber enter macht nichts. Irgendwelche Vorschläge?
HaaR
18

Ich habe dies in meinem Vimrc

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

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

Das habe ich bei meinem ersten Versuch getan, aber ich habe UltiSnips mit Ultisnips falsch geschrieben. Na ja, am Ende hat es geklappt!

pvinis
quelle
17

Ich persönlich habe mich dafür entschieden, nicht <tab>mit YouCompleteMe zu verwenden, sondern manuell zu navigieren.

Also habe ich dies zu meinem hinzugefügt .vimrc:

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

tabDadurch wird der Schlüssel für YCM einfach deaktiviert . Stattdessen verwenden Sie die Bewegungstasten (Pfeile oder CTRL-N/ CTRL-P) und wählen den Eintrag mit aus CR. UltiSnips funktioniert standardmäßig mit tab.

Thomas Fankhauser
quelle
5

Wenn ich nur die Antworten von Michaelslec, Joey Liu und die Lösungen zusammenstelle, die ich in diesem Themen-Thread und im Vimrc dieses Typen gefunden habe , habe ich jetzt diese, die so ziemlich alle Probleme gelöst haben.

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>"
Sudo Bangbang
quelle
Dies war sehr hilfreich, wenn im Wesentlichen versucht wurde, dasselbe Problem mit COC und Ultisnips zu beheben. Sie möchten <TAB> und <S-TAB> verwenden, um die PUM auf und ab zu bewegen und sich in Ultisnips-Platzhaltern hin und her zu bewegen. Vielen Dank.
110100100
4

Obwohl ich weiß, dass dieser Beitrag etwas alt ist, habe ich meine eigene Funktion, die etwas optimierter ist als die oben angegebene:

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

Wenn Sie nur die von Joey Liu bereitgestellten Einstellungen beibehalten und dann diese Funktion verwenden, funktioniert natürlich alles perfekt!

BEARBEITEN: Außerdem verwende ich eine andere Funktion, um die Back-Stepping-Funktionalität zwischen YouCompleteMe und UltiSnips zu erhöhen. Ich zeige dir was ich meine:

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

  return ""                                                                                                                   
endfunction

Dann füge dies einfach in deine .vimrc ein:

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

Sowie let g:UltiSnipsJumpBackwardTrigger="<s-tab>"und dein Set!

Michaelslec
quelle
3

Ich benutze beide zusammen. Standardmäßig YouCompleteMe bindet <Tab>und <Down>den nächsten Abschluss Punkt auszuwählen und auch <S-Tab>und <Up>den vorherigen Abschluss Punkt auszuwählen. Sie können die YouCompleteMe-Bindungen mit den Optionen g: ycm_key_list_select_completion und g: ycm_key_list_previous_completion ändern . Beachten Sie, dass die Namen dieser Optionen kürzlich geändert wurden, als die Option von einer einzelnen Zeichenfolge in eine Liste von Zeichenfolgen geändert wurde.

David Brown
quelle
3

Ich habe das UltiSnips-Plugin nach dem YouCompleteMe-Plugin installiert, sodass ich dachte, dass sie in Konflikt stehen, aber in Wirklichkeit hatte ich etwas störenderes:

set paste

Stellen Sie sicher, dass .vimrcSie das entfernen, wenn es vorhanden ist.

Antoine Snyers
quelle
2

Während viele Antworten in diesem Beitrag einwandfrei funktionieren, möchte ich nur sagen, dass das Problem durch eine Kollision der Schlüsselbindung zwischen YCM und UltiSnip verursacht wird. Während YCM UltiSnip-Snippets standardmäßig unterstützt, wird der standardmäßige UltiSnip-Erweiterungsauslöser <tab>als Abschlussauswahlschlüssel verwendet UltiSnip-Snippets werden von nicht erweitert <tab>. Geben Sie ihnen eine andere Schlüsselbindung, um das Problem zu lösen. Ich persönlich verwende <c-nund <c-p>für YCM und verwende die Standardeinstellung <tab>für UltiSnip. Weitere Informationen erhalten Sie mit help youcompletemedoc in vim.

Minghao Ni
quelle
2

Basierend auf Siegfrieds Antwort verwende ich Folgendes, was natürlicher erscheint:

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

Ich verwende die c-hjklBindungen auch woanders (Wechsel von einem Bereich zu einem anderen), aber das wäre nur im normalen Modus, also gibt es kein Problem.

Nicolas Mattia
quelle
1

Ich benutze ;UltiSnips, es ist so geschickt für mich

let g:UltiSnipsExpandTrigger = ";"
Ruto Collins
quelle
Bearbeiten: Ich benutze jetzt, \weil ich festgestellt habe, dass ich ;im Einfügemodus von Vim nicht tippen konnte
Ruto Collins
0

Ich benutze kj. Das ist was in meinem ist .vimrc:

let g:UltisnipsExpandTrigger="kj".

Es kommt selten vor, dass ich auf ein Wort stoße, das kjdarin enthalten ist. Wenn dies der Fall ist, würde ich nur ein paar Sekunden nach der Eingabe kund dieser Eingabe warten j.

Dowewas
quelle
0

Wie von anderen erwähnt, funktioniert die Zuordnung von Cj zu Ultisnips hervorragend.
let g:UltiSnipsExpandTrigger="<c-j>"

Nun, wenn Sie ein bisschen weiter gehen und xcape installieren und verwenden
xcape -e "Shift_L=Control_R|J"

Sie können nur die Umschalttaste für Utlitsnips verwenden.

Hritik
quelle