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.

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>

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>

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.


Willkommen bei Vi und Vim !
D. Ben Knoble
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.