Wählen Sie ein Element in der VIM-Autovervollständigungsliste aus, ohne einen Zeilenumbruch einzufügen

22

Eine ziemlich ärgerliche Funktion von vim ist, dass wenn Sie sich im Einfügemodus befinden und eine automatische Vervollständigung durchführen (Strg-N), die Pfeiltaste nach unten zum gewünschten Element drücken und dann das Element einfügen, aber auch eine neue Zeile einfügen, die Sie einfügen dann muss löschen.

Gibt es eine Möglichkeit, ein Element aus der Autocomplete-Liste auszuwählen, ohne eine zusätzliche unerwünschte Zeile zu erhalten?

Tyler Durden
quelle
1
So funktioniert das bei mir nicht ... Ich wähle etwas aus, drücke die Eingabetaste und der Cursor befindet sich danach immer noch in der gleichen Zeile.
Goldlöckchen

Antworten:

37

Es hängt davon ab, in welchem ​​Popup-Menü-Status Sie sich befinden (siehe :help popupmenu-completion). Ich verstehe aus Ihrer Frage, dass Sie sich in Zustand 2 befinden (da Sie die Pfeiltasten gedrückt haben, um eine Vervollständigung zu finden). Das Standardverhalten für Enterin Status 2 besteht jedoch darin, die Vervollständigung ohne Zeilenvorschub einzufügen. was Sie beschreiben, ist normalerweise das Verhalten von Zustand 1 (das ist, wenn Sie Ctrl+ N/ Ctrl+ verwenden P.)

Eine Möglichkeit, die in allen Status konsistent funktioniert, ist die Verwendung von Ctrl+ Y. Ich erinnere mich gerne an das Y, das für "Ja, akzeptiere dieses Wort" steht. Es ist auch möglich, einfach mit der Eingabe des Texts zu beginnen, der nach dem vollständigen Wort kommen soll, es sei denn, Sie haben die Dinge wie in der Antwort von geedoubleya neu zugeordnet.

Im selben Kontext können Sie Ctrl+ drücken E, um das Menü abzubrechen und Ihren Text so zu belassen, wie er war, bevor Sie ihn aufgerufen haben. Wenn Sie an die Paarung von Ctrl+ Eund Ctrl+ Yin anderen Kontexten gewöhnt sind (z. B. um im normalen Modus nach oben oder unten zu scrollen oder um im Einfügemodus das Zeichen unter oder über dem Cursor einzufügen), können Sie sich dies hier merken. Sie können es sich auch als "Verlassen" des Menüs oder ähnliches vorstellen.

Sehen Sie :help popupmenu-keysfür mehr.

Echristopherson
quelle
2
Ah ha, das macht Sinn. Ich habe Strg-N verwendet, um die Dropdown-Liste zu öffnen. Ich habe gerade die Pfeiltasten verwendet, um im Dropdown-Menü zu navigieren. Ich wusste nicht, dass Sie die Pfeiltasten verwenden können, um das Dropdown zu öffnen.
Tyler Durden
Die Pfeiltasten können das Dropdown-Menü in der Standardkonfiguration nicht öffnen. Der Unterschied, den ich erwähnte, bestand darin, durch das Menü zu navigieren, nachdem es geöffnet wurde.
Echristopherson
Aus irgendeinem Grund, als ich dies mit <kbd> Strg </ kbd> + <kbd> Y </ kbd> versuchte, hat es auch die Zeile eingerückt, was unerwünscht ist. Irgendwelche Gedanken, warum das passieren würde?
mpacer
Das habe ich noch nie erlebt. Vielleicht liegt es an einer Einrückung oder einem Plugin, das Sie vergessen haben. Ich würde auf Vims Mailingliste fragen: vim.org/maillist.php .
Echristopherson
6

Persönlich benutze ich dieses:

inoremap <expr> <TAB> pumvisible() ? "\<C-y>" : "\<CR>"
inoremap <expr> <Esc> pumvisible() ? "\<C-e>" : "\<Esc>"
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<Up>"

Jeder, der das CtrlP-Plugin verwendet, findet diese Zuordnung möglicherweise praktisch.

Dmitrii
quelle
3

Ich weiß, dass dies alt ist, aber eine Art Huckepack auf Geedoubleyas Antwort, denn obwohl Echristophersons Antwort informativ und fantastisch war, wenn jemand eine schnelle und schmutzige Lösung will:

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))
Jay
quelle
2

Alternativ zu den Pfeiltasten können Sie mit den Tasten j& kdurch die Autovervollständigungsliste scrollen.

Auf diese Weise wird die aktuelle Zeile so geändert, dass sie beim Blättern dem ausgewählten Wort entspricht.

Daher müssen Sie die Eingabetaste nicht drücken, da sich der Cursor am Ende des ersetzten Wortes noch im Einfügemodus befindet.

Um dies zu aktivieren, füge dies zu deiner .vimrc hinzu (Danke an andere bei stackoverflow):

inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))

Anstatt die Pfeiltasten zu verwenden, können Sie auch einfach wiederholen, Ctrl-nwas durch die Optionen fließt ( Ctrl-pum rückwärts zu gehen), und die aktuelle Zeile ersetzen, während sie sich bewegt Enter.

geedoubleya
quelle
Dieses Verhalten kann etwas verwirrend sein, da es sowohl 1) im Einfügemodus als auch 2) j und k interpretiert, um Dinge zu tun, die sie im Einfügemodus nicht tun. Insbesondere können Sie keinen Menüeintrag auswählen und ihm direkt mit etwas folgen, das mit j oder k beginnt.
Echristopherson
Einverstanden, deshalb habe ich die andere Option vorgesehen, wenn dies ein Schritt zu weit war. Persönlich würde ich die Verwirrung vorziehen, anstatt meine Hand zu bewegen, um die Pfeile zu benutzen.
Geedoubleya