Perché viene visualizzato un errore di citazione mancante quando si utilizza quanto segue in una mappatura utilizzando execute e normal?


8

Il comando è

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

Se poi premi <leader>;, sarai E114: Missing quote: "normal! mqA;\seguito da E15: Invalid expression: "normal! mqA;\. Perchè è questo? Il comando funziona correttamente se immesso direttamente nella riga di comando.

Il comando aggiunge ;a alla fine della riga corrente, senza cambiare la posizione dei cursori.

Mi rendo conto che posso semplicemente fare ciò nnoremap <leader>; mqA;<esc>`qche funziona, la domanda è perché quanto sopra non funziona e cosa si può fare per farlo funzionare nella forma di esecuzione normale.

La mia ipotesi sarebbe che fosse necessario un certo livello di fuga nidificata, ma non sono riuscito a trovarne uno che funzioni.

Risposte:


9

Devi scappare dalla <via <lt>:

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

Nota: aggiunto <cr>per eseguire anche il comando.

Tuttavia, questo può essere semplificato abbastanza:

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

Utilizzando una mappatura delle espressioni è possibile subordinare la mappatura in base a un ;carattere finale :

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

Per ulteriori informazioni, consultare:

:h <lt>
:h map-<expr>

1
Nella documentazione di VIM. vedi :h <>. La parte rilevante è: la <> notazione usa <lt> per sfuggire al significato speciale dei nomi delle chiavi. Anche l'uso di una barra rovesciata funziona, ma solo quando "cpoptions" non include il flag "B". Quindi, se Bflag non è presente cpotions, è possibile utilizzare \<Esc>per rappresentare la <Esc>chiave.
jdhao,

5

È necessario uscire dalla <ESC>modalità comando. Questo viene fatto prefissandolo con <C-v>. È inoltre necessario un trailing <CR>per eseguirlo effettivamente. Come questo:

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

0

Ho scoperto che ci sono 3 modi per sfuggire alla chiave:

  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>

Simile per il tasto Invio ( <cr>):

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


Benvenuti in Vi e Vim !
D. Ben Knoble
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.