Warum erhalte ich einen fehlenden Anführungszeichenfehler, wenn ich in einem Mapping mit execute und normal Folgendes verwende?

8

Der Befehl lautet

nnoremap <leader>; :execute "normal! mqA;\<esc>`q"

Wenn Sie dann drücken <leader>;, werden Sie E114: Missing quote: "normal! mqA;\gefolgt von E15: Invalid expression: "normal! mqA;\. Warum ist das? Der Befehl funktioniert einwandfrei, wenn er direkt in die Befehlszeile eingegeben wird.

Der Befehl fügt ;am Ende der aktuellen Zeile ein hinzu, ohne die Cursorposition zu ändern.

Mir ist klar, dass ich nur das tun kann, nnoremap <leader>; mqA;<esc>`qwas funktioniert. Die Frage ist, warum das oben Genannte nicht funktioniert und was getan werden kann, damit es in der normalen Ausführungsform funktioniert.

Meine Vermutung wäre, dass ein gewisses Maß an verschachtelter Flucht erforderlich ist, aber ich konnte keine finden, die funktioniert.

Alice Ryhl
quelle

Antworten:

9

Sie müssen der <Via entkommen <lt>:

nnoremap <leader>; :execute "normal! mqA;\<lt>esc>`q"<cr>

Hinweis: hinzugefügt <cr>, um den Befehl ebenfalls auszuführen.

Dies kann jedoch erheblich vereinfacht werden:

nnoremap <leader>; mqA;<esc>`q

Mithilfe einer Ausdruckszuordnung können Sie Ihre Zuordnung basierend auf einem nachgestellten ;Zeichen abhängig machen :

nnoremap <expr> <leader>; getline('.') =~ ';$' ? '' : "mqA;\<esc>`q"

Weitere Hilfe finden Sie unter:

:h <lt>
:h map-<expr>
Peter Rincker
quelle
1
In der vim Dokumentation. siehe :h <>. Der relevante Teil ist: Die <> Notation verwendet <lt>, um der besonderen Bedeutung von Schlüsselnamen zu entgehen. Die Verwendung eines Backslashs funktioniert ebenfalls, jedoch nur, wenn 'cpoptions' das Flag 'B' nicht enthält. Wenn das BFlag nicht aktiviert ist cpotions, können Sie \<Esc>den <Esc>Schlüssel darstellen.
JDHAO
5

Sie müssen den <ESC>Befehlsmodus verlassen. Dies erfolgt durch das Präfixieren mit <C-v>. Sie benötigen auch ein Trailing <CR>, um es tatsächlich auszuführen. So was:

nnoremap <silent> <leader>; :execute "normal! mqA;<C-v><ESC>`q"<CR>
lcd047
quelle
0

Ich habe festgestellt, dass es drei Möglichkeiten gibt, dem Schlüssel zu entkommen:

  1. nnoremap <silent> <leader>; :execute "normal! mqA;<C-v><esc>`q"<CR>
  2. nnoremap <silent> <leader>; :execute "normal! mqA;\<lt>esc>`q"<CR>
  3. nnoremap <silent> <leader>; :execute "normal! mqA;\e`q"<CR>

Ähnliches gilt für die Eingabetaste ( <cr>):

<c-v><cr>oder \<lt>cr>oder \r.

Jason
quelle
Willkommen bei Vi und Vim !
D. Ben Knoble