Vim: Die automatische Vervollständigung intelligenter machen


75

Ich verwende ctags, taglist usw., um die automatische Vervollständigung in Vim zu erreichen. Es ist jedoch im Vergleich zu Visual Studio Intellisense oder Eclipse Auto-Completion sehr eingeschränkt. Ich frage mich, ob es möglich ist, Vim auf Folgendes abzustimmen:

  1. Automatische Vervollständigung anzeigen, wann immer. oder -> eingegeben werden. Aber nur nach einem Text, der eine Variable sein könnte (z. B. vermeiden, die automatische Vervollständigung nach einer Zahl anzuzeigen).

  2. Funktionsparameter anzeigen, wenn (eingegeben wird.

  3. Beenden Sie das Entfernen der Liste der automatischen Vervollständigungen, wenn einige nachher alle Zeichen löschen. oder ->: Wenn ich einen Variablennamen eingebe, drücken Sie. oder -> um nach einem bestimmten Mitglied zu suchen, muss ich häufig alle Zeichen löschen, die ich nach dem eingebe. oder ->, aber dadurch versteckt Vim die Liste der automatischen Vervollständigungen. Ich möchte es sichtbar halten, wenn ich nicht Esc drücke.

  4. Anzeigen der zugehörigen automatischen Vervollständigung: Wenn ich eine Variable eingebe und ^ X ^ O drücke, werden mir normalerweise alle Tags in der ctags-Datei angezeigt. Ich möchte, dass nur die Tags angezeigt werden, die sich auf die Variable beziehen.

Danke für die Hilfe.

EDIT : Einige Leute stimmen für diese Frage, aber niemand scheint die Antwort zu kennen. Ich wollte nur erwähnen, dass Sie keine vollständige Antwort geben müssen. Teilantworten auf einen der genannten Punkte wären auch gut.


Upvotes zu der Frage bedeuten im Allgemeinen, dass sie die Frage nützlich, klar, präzise oder interessant finden. Wenn Sie viele positive Stimmen erhalten, liegt dies wahrscheinlich daran, dass viele Leute die Antwort wissen und sich selbst nicht kennen oder mehr Details hören möchten.
jmort253

1
Vielen Dank. Leider scheint niemand die Antwort zu kennen :-( Wahrscheinlich sollten wir mit Vim-Entwicklern sprechen (oder vielleicht ist er nur einer), um dies ernsthaft in Betracht zu ziehen, da dies der Hauptnachteil von Vim ist.
Rafid

Antworten:




8

Damit vim beim Drücken einer Taste ein bestimmtes Verhalten auslöst, müssen Sie die Taste einer Funktion zuordnen.

Um beispielsweise den Schlüssel zuzuordnen ., um im INSERTModus eine Art von Abschluss aufzurufen , müssten Sie Folgendes tun:

:inoremap <expr> <buffer> . MyFunction()

und dann müsste die Funktion den Kontext auswerten, in dem sie aufgerufen wurde, und dem Benutzer eine geeignete Antwort präsentieren.

Bearbeiten : Dies ist die Grundlage dafür, wie clang completevon @honk erwähnt funktioniert.

Ich bin mir nicht sicher, ob Sie das Verhalten von Omnifunc an Ihre Bedürfnisse anpassen können, aber meiner Erfahrung nach bin ich nie zu weit gegangen. Wie @Mikhail sagte, müssten Sie die Dinge im Auge behalten, was in der Praxis bedeutet, den Code bis zu einem gewissen Grad zu interpretieren oder sogar auszuführen.


5

Ich benutze vim jeden Tag und kenne kein vorhandenes Skript, das dies tun könnte. Diese Aktion würde das Verständnis der Klassen und das Verfolgen von Variablen erfordern. someObject->bedeutet, dass VIM weiß, um welche Klasse es sich bei der Variablen someObjecthandelt, und dann nach Methoden / Variablen innerhalb dieser Klasse suchen kann.

Das Schreiben von Skripten für vim ist relativ einfach, obwohl, wie Sie kommentiert haben, noch niemand darauf geantwortet hat. Stimmen Sie von mir ab.


OK, dann vereinfachen wir es. Wäre es möglich zu überprüfen, wann '.' oder '->' geschrieben sind und dementsprechend die automatische Vervollständigung anzeigen?
Rafid

2

Ich würde gerne die gleiche Funktionalität haben, die Sie suchen, und bin gerade auf ein vielversprechendes Plugin gestoßen:

https://github.com/Shougo/neocomplcache scheint das neue Autocomplpop zu sein und scheint während meiner ersten Versuche recht gut zu funktionieren ... jetzt, um die Omni-Vervollständigung für die Arbeit mit Scala ~ zu konfigurieren


Sieht interessant aus. Die Sache mit der automatischen Vervollständigung von Vim ist jedoch, dass der Kontext nicht berücksichtigt wird. Zum Beispiel, wenn ich '.' oder '->' nach einer Variablen sollte ich nur die Mitglieder dieser Variablen sehen, nicht alle möglichen Vervollständigungen.
Rafid

Dies ist der Grund, warum ich keine Plugins wie VsVim und ViEmu mehr verwendet habe.
Rafid

Oh? Ich hatte den Eindruck, dass dies die Omni-Vervollständigung ist. Aber ich habe gerade meine Suche begonnen, um diese Art von Funktionalität in Gang zu bringen. Ich hatte gehofft, dass Ctags und Omnicompletion es irgendwie zusammen schaffen könnten. Ich habe versucht, auf eine Mainstream-IDE umzusteigen, aber ich fühlte mich so schmutzig, als ich sie
lud

Nun, ich bin eigentlich das Gegenteil, ich habe den Eindruck, dass es das nicht tut, aber ich bin mir nicht sicher :-) Aber ehrlich gesagt bezweifle ich, dass Plugins auf Vim jemals eine automatische Vervollständigung wie Visual Studio anbieten können, insbesondere Wenn es von Plugins wie Visual Assist oder Resharper unterstützt wird, ist es meiner Meinung nach besser, ein Vim-Plugin in Visual Studio zu haben, als ein Plugin für die automatische Vervollständigung in Vim.
Rafid


1

In jedem Fall empfehle ich YouCompleteMe (YCM) . Es bietet (Fuzzy-) Matching von Kennungen Ihrer aktuellen Datei sowie Pfadvervollständigung, Integration in externe Vervollständigungs-Engines, ...

ad 1)
Wenn Sie die semantische Vervollständigung von Eclipse mögen , verwenden Sie eclim, um vim in Eclipse zu integrieren. (Verwenden Sie alternativ eine andere semantische Engine für YCM)

ad 2)
Diese 2 spielen übrigens gut zusammen ,: YCM kann sogar die Funktionsdefinition (= Parameterliste) der kürzlich abgeschlossenen Funktion bereitstellen!

ad 3)
das macht YCM sowieso

ad 4)
nicht ganz sicher, was du damit meinst. nie verwendet ctags!

PS: Ich empfehle dringend, zusätzlich UltiSnips und Tagbar (und wenn Sie UndoTree mögen ) zu verwenden, was vim zu einer perfekten IDE für mich macht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.