Geben Sie im Befehlszeilenmodus die Befehle <Esc> und Strg ein

11

Stellen Sie sich vor, Sie möchten das folgende Wort zitieren. Wenn dies |die Cursorposition ist, können Sie das Wort einfach cw""<Esc>Paus dem Normalmodus zitieren .

|below

Ich möchte das gleiche Verhalten im Befehlszeilenmodus erreichen. Meine Frage ist, wie ich dem Befehlszeilenmodus sagen kann, dass ich ein eingeben möchte <Esc>. Ich habe versucht :norm cw""<Esc>Pund einige andere Variationen, aber ich bekomme nur ""<Esc>Pstatt "below".

Im Zusammenhang damit möchte ich wissen, wie ich Befehlszeilenmodus-Typ-Strg-Befehle erstellen kann. Zum Beispiel könnte ich cw"<C-r>""<Esc>stattdessen das oben genannte Wort mit zitieren . Aber dann würde ich die Befehlszeile brauchen, um <C-r>für mich zu tippen . Wie kann ich das machen?

Gonçalo Ribeiro
quelle
1
Genau wie <C-x><C-e>in readline, um die Befehlszeile zu bearbeiten $EDITOR, müssen Sie <C-f>in Vim das Befehlszeilenfenster öffnen. Siehe :help cmdline-window.
Romainl

Antworten:

11

<C-v>ist das, wonach Sie suchen. Sie können damit Literalzeichen eingeben (z. B. ein Literal Escanstelle der Zeichenfolge "Esc"), ohne dass Sie etwas maskieren müssen.

:norm cw""<C-v><Esc>P

wird angezeigt als:

:norm cw""^[P

und wird tun, was Sie wollen (dh das Wort zitieren). Sie können dies auch mit anderen <C-?>Zuordnungen verwenden. Zum Beispiel Ihre zweite Anfrage:

:norm cw"<C-v><C-r>""

wird angezeigt als:

:norm cw"^R""

Und wird das gleiche wie oben ergeben. Das Extra muss Escam Ende nicht eingefügt werden .

Zach Ingbretsen
quelle
10

Dies liegt daran, dass Sondertasten wie <Esc>nicht in normalBefehle übersetzt werden und wie gedrückt behandelt werden <Esc>. Um dies zu beheben, können Sie einen execBefehl verwenden. Wie so:

:exec "norm cw\"\"\<Esc>P"

Beachten Sie, dass Sie vor und in Anführungszeichen einen Backslash setzen müssen. Die <Esc>Verwendung von einfachen Anführungszeichen anstelle von doppelten Anführungszeichen funktioniert nicht.

Immergrüner Baum
quelle
Funktioniert dies auch für Strg-Befehle? Wie soll ich sie in den Befehl schreiben?
Gonçalo Ribeiro
Ja, es sollte funktionieren. Sie können sie so schreiben:"\<C-{insert key}>"
EvergreenTree
2

Der Befehlszeilenmodus ist anders. Sie können dort nicht dieselben Bearbeitungsbefehle (im normalen Modus) verwenden. Eine Liste der Befehle finden Sie unter :help c_CTRL-V.

Jetzt gibt es das Befehlszeilenfenster ( :help command-line-window), das über den q:Normal- und den <C-F>Befehlszeilenmodus aufgerufen werden kann. In diesem Fenster können Sie alle normalen Befehle und Zuordnungen verwenden, sodass dies Option 1 wäre.

Option 2 sind spezielle Zuordnungen für den Befehlszeilenmodus. Wie gesagt, Sie können den Ansatz nicht über :normalet al. Der Schlüssel zur Definition dieser ist das :help c_CTRL-\_eMapping, das "[s] {expr} auswertet und [s] die gesamte Befehlszeile durch das Ergebnis ersetzt". Hier ist ein einfaches Beispiel, das nur am Ende der Befehlszeile korrekt funktioniert:

:cnoremap <F1> <C-\>esubstitute(getcmdline(), '\w\+$', '"&"', '')<CR>
Ingo Karkat
quelle
1
Ich glaube nicht, dass das OP eine Zuordnung für die Befehlszeile erstellen wollte, sondern eine Zuordnung über die Befehlszeile ausführen sollte.
EvergreenTree