Bash-like Code-Vervollständigung in vim?

3

Ich verwende derzeit SuperTab für die Fertigstellung in Vim. Ich möchte jedoch, dass die Vervollständigungen eher wie Bash aussehen. Zum Beispiel, wenn ich schreibe

st

und die möglichen Abschlüsse sind

struct, string

Wenn ich die Tabulatortaste drücke und im Idealfall ein Menü mit möglichen Vervollständigungen anzeige, möchte ich, dass es zu str abgeschlossen wird.

Plugins sind OK.

Alexander Duchene
quelle
1
Bitte posten Sie die identische Frage nicht auf mehreren Websites: stackoverflow.com/questions/15697498/…
Ingo Karkat

Antworten:

2

Ich denke, das folgende Plugin macht das, wonach Sie fragen:
Du vervollständigst mich

Aus der Beschreibung:

YouCompleteMe ist eine schnelle Fuzzy-Suchcodevervollständigungs-Engine für Vim. Es verfügt über zwei Vervollständigungs-Engines: eine identifikatorbasierte Engine, die mit jeder Programmiersprache funktioniert, und eine semantische, Clang-basierte Engine, die die Vervollständigung des semantischen Codes für C / C ++ / Objective-C / Objective-C ++ ermöglicht (ab sofort bezeichnet als „ die Sprachen der C-Familie “).

Josh Whittington
quelle
1

Putten set completeopt=menu,longest stellt sich heraus, den Trick meistens zu tun. Wenn Sie leider mehr Text eingeben und dann erneut die Tabulatortaste drücken, wird versucht, eine vollständige Vervollständigung vorzunehmen, anstatt das nächstlängste gemeinsame Präfix anzugeben.

Alexander Duchene
quelle
Ich denke, das könnte ein Supertab-Problem sein - das Hinzufügen completeopt+=longest macht es besser für mich mit dem Eingeborenen CTRL-N Fertigstellung
JonnyRaa
Eigentlich verstehe ich was du meinst ... habe eine Antwort gepostet
JonnyRaa
0

Aufbauend auf Alexanders Antwort habe ich so etwas in meinem .vimrc

"unix like completion - longest substring
set completeopt+=longest
"add command to retrigger longest substring
"Naive version... see below
inoremap <C-m> <C-e><C-n>

Das 'längste' Stück erledigt also den größten Teil der Arbeit, jedoch nachfolgende Pressen von <C-n> Ich fange gerade an, durch die Optionen zu blättern. Wenn Sie drücken <C-e> dass (e) nds Autovervollständigung, erneut mit auslösen <C-n> Entspricht der nächstlängeren Teilzeichenfolge. Wenn Sie eine Verknüpfung hinzufügen, müssen Sie nicht zwei Tasten drücken.

Das willst du nicht binden <C-n> So können Sie auf gewohnte Weise nicht mehr radeln

Ich habe M gewählt, da es direkt neben N steht und überprüfe ( :h insert-index ) ist standardmäßig nur gebunden an same as <CR>.... weil dies vim ist und nichts jemals einfach ist, stellt sich heraus, dass dies bedeutet, dass vim nicht wirklich kann zwischen den beiden Tastendrücken unterscheiden !

Wenn Ihnen die Verwendung egal ist <C-m> dann nimm einfach was anderes, sonst lies weiter ...

Basierend auf diesem anderen Beitrag habe ich die Antwort unten angepasst und die Syntax ein wenig überarbeitet (basierend auf diese )

Ich endete damit:

"add command to retrigger longest substring
inoremap <expr> <C-M> pumvisible() ? "\<C-e><C-n>" : "\<C-m>"

pumvisible () gibt ein Flag zurück, das angibt, ob das Popup-Menü geöffnet ist. Dies hält uns davon ab, das Verhalten der Eingabetaste im Einfügemodus zu ändern, wenn das Popup-Menü nicht geöffnet ist.

Leider kann ich keine Dokumentation für das finden? und: und warum wir Strings übergeben müssen.

JonnyRaa
quelle