Wie löst man Omnicomplete / Auto-Vervollständigung bei Tastenanschlägen im INSERT-Modus aus?

9

Die vollständige Autovervollständigung von VIM funktioniert nicht wirklich wie erwartet.

Gibt es einen Weg, es schlauer zu machen? Wie, um den Kontext von Surround-Text zu überwachen? (z. B. nicht auslösen, wenn innerhalb von Kommentaren oder Anführungszeichen)

Ich frage, weil ich seit dem Wechsel zu Vim im Vergleich zur Autocomplete / IntelliSense in IDEs wie Visual Studio, IntelliJ, Sublime und Atom nicht zu einem glücklichen Ort komme (ich habe all diese für die Entwicklung in der Vergangenheit verwendet) .

Die grundlegenden Ziele dieser Frage:

  • Kann Omnicomplete bei A-Za-z-Tastenanschlägen im INSERT-Modus ausgelöst werden? Ich habe es bereits über "." Punktsymbole.
  • Wie bekomme ich Omnicomplete, um die Parameter der Funktion einzufügen?

Ich bin seit ein paar Monaten neu in Vim und versuche verzweifelt, einen reibungslosen Arbeitsablauf zu erreichen. Aber ohne eine gute Autocomplete-Option, die mich dazu zwingt, den Code, den ich zu verwenden versuche, wacher zu lernen, ist es sehr langsam, dass ich andere IDEs, die ich in der Vergangenheit benutzt habe, nicht mehr nutze.

Atom + Go-Plus

Sehen wir uns meine Erwartungen mit Atom + Go-Plus an.

Ich habe eine Funktion mit dem Namen func generate(entropy chan<- uint64) an anderer Stelle in einer anderen Go-Datei im selben Paket.

Wenn ich in Zeile 22 den Buchstaben g eintippe, bekomme ich sofort eine Eingabeaufforderung mit allem, was mit g beginnt:

Wie Sie sehen können, gibt es 3 Optionen, die sofort auftauchen (die ersten beiden sind nur Code-Snippets). Ich kann eine Pfeiltaste verwenden, um zu einer der Optionen zu blättern.

Wenn ich die 3. Option auswähle (oder wenn ich weiterhin gen eintippe, verkleinert sich das Feld auf nur 1 Option), und press enter Atom / Visual Studio / Sublime füllen Sie alle Details der Methode für mich aus:

Ich habe keines der obigen Wörter eingegeben. Es wurde eingefügt und ich kann die Details überschreiben, ändern oder einfach TAB deaktivieren und weiter tippen.

Vim + Vim-Go (wirklich Omnicomplete)

Vergleichen wir das mit meiner aktuellen (vielleicht kaputten?) Konfiguration von omnicomplete . Ich habe das in meinem .vimrc:

set completeopt=longest,menuone

Innerhalb von vim, wenn ich gen eintippe, ist alles, was ich bekomme, was mein vorher eingegebener Text ist, den ich an anderer Stelle in diesem Puffer eingegeben habe (und nur in diesem Puffer, nicht in anderen Puffern). Wenn ich etwas falsch schreibe, bekomme ich nur die falsch geschriebene Version, die ich vorher für das Leben eingegeben habe, das ich geöffnet habe. Dies sagt mir, dass es keine IntelliSense / Autocomplete bei der Arbeit gibt - nur etwas, das die Tastenanschläge überwacht, die ich mache:

Wie Sie sehen können, funktioniert die automatische Vervollständigung nicht, während ich tippe. Allerdings ist dies nützlich mit Kommentaren und Strings an anderen Orten und ich mag es, wie vim erinnert sich an meine Freitext Ich tippe.

Nicht wirklich sicher, welche Vim-Option dies ermöglicht; aber es ist keine automatische Vervollständigung.

Jetzt kann ich CTRL-X + CTRL-O drücken, um die automatische Vervollständigung zu erzwingen und generate() zu erhalten:

Das ist besser; aber ich würde erwarten, dass es mir Autocomplete-Optionen zeigt, wenn ich tippe: keine 3 zusätzlichen Tastenanschläge nötig, um es zu ermöglichen. Das ist eine ganze Menge von C-x C-o-Ereignissen während der wenigen Stunden des Codierens.

Gibt es eine Möglichkeit, dass Vim meine Tastatureingaben im INSERT-Modus überwacht und die automatische Vervollständigung anzeigt, wenn ein passender Ctag oder eine Funktion vorhanden ist? Das könnte die Antwort auf diese Funktionalität sein.

Automatische Vervollständigung mit Parametern

Es gibt ein zweites Problem mit Autocompletion mit omnicomplete , dass ich die obige Cx Co-Anforderung übersehen könnte, wenn dies funktioniert: sobald ich die Methode auswähle, die ich automatisch vervollständigen möchte, fügt sie die Parameter / Felder für mich nicht ein .

Zurück zum obigen Screenshot, wenn ich diese Methode auswähle, bekomme ich Folgendes:

Beachten Sie, dass die Parameter der Funktion nicht einfügen. Es stimmt nicht mit dem zweiten Bild oben überein, wo die Autovervollständigung in Atom, Sublime und Visual Studio die Methode mit den Parametern vervollständigen.

Ich habe den vim wikia gelesen und verschiedene Optionen mit set completeopt ausprobiert, ohne eine brauchbare Alternative.

Zum Beispiel gibt set completeopt+=preview mir das Vorschaufenster nach der Auswahl von:

Warum gibt man mir die Parameter in einer Vorschau, es vervollständigt immer noch nicht meine line 22 Code und ist oft eine Ablenkung (ich oft deaktivieren Sie es, weil ich viel schneller tippe, als zu stoppen und alle "nachschlagen" Zeit).

Es hat viel Optimierungsaufwand für die Konfigurationsdatei erfordert, um das folgende zu erreichen; aber ich konnte "Punkt" Autovervollständigung zur Arbeit bekommen. Es gibt also eine Form der Autovervollständigung:

Aber es füllt die Parameter nicht einmal aus, wenn ich eine Funktion auswähle, die ziemlich nervig ist, wenn ich ESC + back arrow + back arrow + : + GoDoc eingeben muss, um zu sehen, was es war: das sind 10 Zeichen, um zu sehen, was es war.

Sicher, Atom, Sublime und VS ist viel hübscher, wenn "Autovervollständigung":

(es ist auch besser nach Typen sortiert, obwohl ich vim Setup habe, um sich an das letzte zu erinnern, das oben verwendet wird, damit das hilft). Aber es ist mir egal, hübsch - ich möchte nur meine Parameter angezeigt werden, wenn Sie mit "Punkt" auswählen.

Jeder Ratschlag, wie ich meine vim-go und ähnliche Plugins optimieren kann, wäre sehr willkommen, da ich es vorziehen würde, mit Vim über alle IDEs zu bleiben. Danke.

BEARBEITEN:

Ich sehe, dass der Autor von vim-go am Parameter-Completion-Teil gearbeitet hat und bekommen hat es funktioniert:

Obwohl ich es anscheinend nicht mit meiner Installation arbeiten lassen kann (ich debugge es noch), wollte ich anderen zeigen, dass es tatsächlich möglich ist, automatische Vervollständigung mit Parametern zu haben, die gefüllt werden.

    
eduncan911 07.03.2016, 07:06
quelle

2 Antworten

1
  

Kann Omnicomplete bei A-Za-z-Tastenanschlägen im INSERT-Modus ausgelöst werden?

Sie können InsertCharPre event hören und prüfen, welche Tasten gedrückt wurden.

%Vor%

Außerdem sollten Sie set completeopt+=menuone,noselect,noinsert vermeiden, damit vim den Fertigstellungstext automatisch einfügt. Aber denken Sie daran, es ist keine allgemeine Entscheidung, und Sie werden wahrscheinlich einige Probleme haben. Die eine, die ich gefunden habe, ist es bricht cgn command.

Weitere Informationen finden Sie unter help InsertCharPre , help autocmd-events , help pumvisible() , help feedkeys() .

  

Wie bekomme ich Omnicomplete, um die Parameter der Funktion einzufügen?

Ich habe seit einigen Jahren sublime verwendet und es stellt eingebaute Funktionen (Standard vim omnicompletion) mit Snippets dar. Wenn also Parameter in den Puffer eingefügt werden sollen, müssen Sie:

  1. Installieren Sie den Snippet-Manager wie ultisnips , neosnippet , minisnip , xptemplate oder andere .
  2. Erstellen Sie mehrere Snippets oder installieren Sie sie von irgendwo.
  3. Lassen Sie Ihr Abschlusssystem den bevorzugten Snippet-Manager erkennen (viele Abschlussmanager erkennen ultisnips ).

Wenn Sie es sich anders überlegt haben, das oben erwähnte Fenster Vorschau zu verwenden, hier einige Tipps:

  1. Es ist möglich, ein Vorschaufenster am unteren Bildschirmrand anzuzeigen set splitbelow .
  2. Sie können die Option set previewheight ändern, um die Größe zu ändern.
  3. Um das Fenster nach Abschluss automatisch zu schließen, wird autocmd CompleteDone * pclose .
  4. ausgeführt

Weiterführende Informationen finden Sie in help ins-completion und help preview-window

    
Evgeniy 25.12.2017 09:42
quelle
0

Ich bin nicht sicher, ob es eine vollautomatische Vervollständigung unterstützt, aber supertab ist ein ziemlich robustes IDE-Stil-Vervollständigungs-Plugin.

p>     
Carolyn C. 05.07.2016 22:24
quelle

Tags und Links