Autovervollständigung in Vim

257

Kurz gesagt, ich suche nach einer funktionierenden Funktion zur automatischen Vervollständigung für den Vim-Editor. Ich habe bereits zuvor argumentiert, dass Vim eine IDE unter Linux vollständig ersetzt, und obwohl dies sicherlich zutrifft, fehlt ihm eine wichtige Funktion: die automatische Vervollständigung.

Ich kenne Ctrl+ N, Exuberant Ctags Integration , Taglist , cppcomplete und OmniCppComplete . Leider passt nichts davon zu meiner Beschreibung von "Working Autocompletion":

  • Ctrl+N funktioniert (nur) gut, wenn Sie vergessen haben, wie man buchstabiert class, oder while. Naja.
  • Ctags gibt Ihnen die Grundlagen, hat aber viele Nachteile.
  • Taglist ist nur ein Ctags-Wrapper und erbt als solcher die meisten seiner Nachteile (obwohl es gut zum Auflisten von Deklarationen geeignet ist ).
  • cppcomplete funktioniert einfach nicht wie versprochen, und ich kann nicht herausfinden, was ich falsch gemacht habe oder ob es richtig funktioniert und die Einschränkungen beabsichtigt sind.
  • OmniCppComplete scheint die gleichen Probleme zu haben wie cppcomplete, dh die automatische Vervollständigung funktioniert nicht richtig. Außerdem muss die tagsDatei erneut manuell aktualisiert werden.

Mir ist bewusst, dass nicht einmal moderne, vollständige IDEs eine gute Vervollständigung des C ++ - Codes bieten. Deshalb habe ich Vims Mangel in diesem Bereich bis jetzt akzeptiert. Ich denke jedoch, dass ein grundlegendes Maß an Code-Vervollständigung nicht zu viel verlangt und tatsächlich für die produktive Nutzung erforderlich ist. Also suche ich nach etwas, das zumindest die folgenden Dinge erreichen kann.

  • Syntaxbewusstsein . cppcomplete verspricht (liefert aber nicht für mich), korrekte, bereichsabhängige automatische Vervollständigung der folgenden Punkte:

    variableName.abc
    variableName->abc
    typeName::abc

    Und wirklich, alles andere ist völlig nutzlos.

  • Konfigurierbarkeit . Ich muss (leicht) angeben, wo sich die Quelldateien befinden und woher das Skript seine Informationen zur automatischen Vervollständigung bezieht. Tatsächlich habe ich ein Makefile in meinem Verzeichnis, das die erforderlichen Include-Pfade angibt. Eclipse kann die darin enthaltenen Informationen interpretieren. Warum nicht auch ein Vim-Skript?

  • Aktualität . Sobald ich etwas in meiner Datei ändere, möchte ich, dass die automatische Vervollständigung dies widerspiegelt. Ich möchte nicht manuell auslösen ctags(oder etwas Vergleichbares). Außerdem sollten Änderungen werden inkrementelle , dh wenn ich mich verändert habe nur eine Datei es ist völlig inakzeptabel für ctagszu re-analysieren den gesamten Verzeichnisbaum (die sehr groß sein können).

Habe ich etwas vergessen Fühlen Sie sich frei zu aktualisieren.

Ich bin mit ziemlich viel Konfiguration und / oder Basteln vertraut, aber ich möchte keine Lösung von Grund auf neu programmieren, und ich bin nicht gut darin, Vim-Skripte zu debuggen.

Ein letzter Hinweis: Ich hätte gerne etwas Ähnliches für Java und C #, aber ich denke, das ist zu viel, um darauf zu hoffen: ctagsNur Parsing-Codedateien und sowohl Java als auch C # verfügen über riesige, vorkompilierte Frameworks, die indiziert werden müssten. Leider ist die Entwicklung von .NET ohne IDE noch mehr eine PITA als C ++.

Konrad Rudolph
quelle
4
Es ist lange her, dass Sie diese Frage gestellt haben. Haben Sie endlich eine gute gefunden? Ich frage, weil ich keine akzeptierten Antworten sehe. Persönlich, obwohl ich zugeben muss, habe ich meine Variablen / Funktionen vorangestellt. Zum Beispiel beginnen alle mit sh(was bedeutet, dass es sich in meiner Bibliothek befindet) und werden von der Abkürzung meiner Klasse gefolgt. Zum Beispiel shPfür die ParserKlasse. Dann müssen Sie nur noch shPSTRG + p schreiben (oder STRG + n drücken, wenn Sie möchten) und die Klassenmitglieder von der letzten Verwendung zur ersten (oder zuerst zur letzten, wenn STRG + n)
Shahbaz
4
@ Shahbaz Tatsächlich bin ich überzeugt, dass es im Moment keine ausreichend gute Lösung gibt. clang_completeist technisch am besten, aber aufgrund des fehlenden Zwischenspeicherns der Ergebnisse und der teilweisen Kompilierung unerschwinglich langsam. Ich muss zugeben, dass ich nicht alle Antworten ausprobiert habe, da einige ein kompliziertes, zeitaufwändiges Setup erfordern. Ich werde den Atem anhalten, um ein brauchbares Plugin zu erhalten, das es Entwicklern endlich ermöglicht, ASTs aus C ++ - Quellen zu erstellen (bis jetzt waren keine guten kostenlosen Parser für C ++ verfügbar).
Konrad Rudolph
2
Hast du es clang_completekürzlich versucht ? Es kann libclangjetzt mit Caching verwendet werden und sollte daher schneller sein.
Jan Larres
@ Jan Danke für die Info. Als ich es das letzte Mal ausprobierte, war die libclang-Unterstützung noch lückenhaft. Ich sollte es wahrscheinlich noch einmal versuchen, sobald ich Zeit habe.
Konrad Rudolph
(Grund für das Rollback der Bearbeitung: Produktnamen sind kein Code, sie gehören nicht dazu formatted like this.)
Konrad Rudolph

Antworten:

171

Versuchen Sie YouCompleteMe . Es verwendet Clang über die libclang-Schnittstelle und bietet semantische C / C ++ / Objective-C-Vervollständigung. Es ist ähnlich wie clang_complete, aber wesentlich schneller und mit Fuzzy-Matching.

Darüber hinaus bietet YCM auch eine semantische Vervollständigung für C #, Python, Go, TypeScript usw. Es bietet auch eine nicht semantische, bezeichnerbasierte Vervollständigung für Sprachen, für die es keine semantische Unterstützung gibt.

Valloric
quelle
69
Tatsächlich werde ich diese Lösung akzeptieren. Endlich ein Plugin, das liefert. Ich benutze es jetzt seit einigen Tagen. Die Beantwortung dieser Frage dauerte nur vier Jahre. ;-)
Konrad Rudolph
5
Super Job mit YouCompletMe valloric! Herzlichen Glückwunsch
statquant
5
Schade, dass YouCompleteMe eine vollständige PITA ist, die unter Windows installiert werden kann :(
xx
2
@DrTwox Aus der Readme-Datei: "YCM hat keine offizielle Unterstützung für Windows , aber das bedeutet nicht, dass Sie es dort nicht zum Laufen bringen können. Weitere Informationen finden Sie auf der Wiki-Seite des Windows-Installationshandbuchs. Sie können es jederzeit hinzufügen."
user456584
7
In diesem Beitrag sollte erwähnt werden, dass Sie der Autor sind, da dies eine grenzüberschreitende Eigenwerbung ist (obwohl ich nicht behaupte, dass sie die Frage beantwortet, sollten Sie dennoch einen Haftungsausschluss einfügen).
EntangledLoops
36

Es gibt auch clang_complete , das den clangCompiler verwendet , um die Code-Vervollständigung für C ++ - Projekte bereitzustellen. Es gibt eine weitere Frage mit Hinweisen zur Fehlerbehebung für dieses Plugin.

Das Plugin scheint ziemlich gut zu funktionieren, solange das Projekt kompiliert wird, ist jedoch für große Projekte unerschwinglich langsam (da es versucht, die Tag-Liste vollständig zu kompilieren).

Konrad Rudolph
quelle
Das clang_completePlugin funktioniert gut unter Cygwin und Windows. Ich kann nichts über große Projekte sagen, weil ich keine habe. :)
Lumi
Es scheint, dass clang_complete mit libclang jetzt Caching hat. Dies sollte dann die akzeptierte Antwort sein. Haben Sie versucht, clang_complete auf Linux-Kernel? Die beste Indizierung, die ich für den Kernel gesehen habe, ist die Verwendung von Eclipse CDT. Wenn clang_complete mit dem Kernel umgehen kann, sollte es in der Lage sein, einfach alles zu vervollständigen.
Bindestrich
clang_complete ist ganz einfach das beste Vim-Plugin, das ich benutze.
Cromulent
1
@Cromulent Ah, überprüfe YouCompleteMe, es ist viel besser.
Konrad Rudolph
@KonradRudolph Danke. Ich werde das überprüfen.
Cromulent
6

Ich habe gerade das Projekt Eclim in einer anderen Frage verlinkt gefunden . Dies sieht zumindest für die Java-Integration vielversprechend aus.

Konrad Rudolph
quelle
Hast du es getestet? Scheint interessant.
Pacane
@ Pacane: Nein. Ich musste seit Monaten kein Java mehr verwenden und hatte keine Zeit zum Experimentieren.
Konrad Rudolph
1
Eclim scheint eine großartige Lösung für Java zu sein, obwohl Eclipse auch in einem kopflosen Setup immer noch ein Biest ist
Drupad Panchal
2
Für Java können Sie Vrapper verwenden . Ich finde, dass es normalerweise in Ordnung ist, wenn die automatische Vervollständigung hervorragend ist. Für die gelegentliche textintensive Bearbeitung kann ich echtes Vim als externes Tool starten.
Kizzx2
3

Ich bin etwas spät zur Party, aber Autocomplpop könnte hilfreich sein.

romainl
quelle
2

ist das, wonach Sie suchen, so etwas wie Intellisense?

Insevim scheint das Problem anzugehen.

Link zu Screenshots hier

Ric Tokyo
quelle
2
Das wäre es, wonach ich suche, ja. Leider läuft es nur unter Windows (ich benutze OS X). Auch das letzte Update scheint um 2003 gemacht worden zu sein :-(
Konrad Rudolph
Nun, Sie können den Quellcode bekommen :) Wenn nicht, kann ich mir nur Omnicompletion vorstellen. Oder schauen Sie sich das an: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop für .net Sachen mindestens ..
Ric Tokyo
Ric, bitte gib deinen Kommentar als zwei separate Antworten an, sie sind von unschätzbarem Wert und ich möchte sie richtig ehren! Trotzdem ist MonoDevelop unter OS X ab sofort unbrauchbar, und ich beschäftige mich derzeit mit OmniCppComplete.
Konrad Rudolph
Lol das ist nur Windows! :( Warum solltest du das unter Windows wollen, wo du VS hast? Ich suche nach einer Lösung unter Linux.
Nils
Nils: Nicht jeder hat Zugriff auf Visual Studio, auch viele Benutzer verfügen über vi-Kenntnisse, die sie in der Windows-Umgebung anwenden möchten. Es gab einen Port für Linux, der derzeit jedoch nicht verfügbar ist. Was versuchst du auf jeden Fall zu erreichen? Sind Sie sicher, dass Sie nicht nur die Standardfunktionen für die automatische Vervollständigung benötigen? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/…
Ric Tokyo