¿Por qué recibo un error de cita faltante cuando uso lo siguiente en un mapeo usando execute y normal?

8

El comando es

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

Si pulsa <leader>;, se le E114: Missing quote: "normal! mqA;\seguido de E15: Invalid expression: "normal! mqA;\. ¿Por qué es esto? El comando funciona bien si se ingresa directamente en la línea de comando.

El comando agrega un ;al final de la línea actual, sin cambiar la posición de los cursores.

Me doy cuenta de que puedo hacer lo nnoremap <leader>; mqA;<esc>`qque funciona, la pregunta es por qué lo anterior no funciona y qué se puede hacer para que funcione en la forma de ejecución normal.

Mi suposición sería que se necesita cierto nivel de escape anidado, pero no pude encontrar uno que funcione.

Alice Ryhl
fuente

Respuestas:

9

Necesitas escapar de la <vía <lt>:

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

Nota: agregado <cr>para ejecutar el comando también.

Sin embargo, esto se puede simplificar bastante:

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

Usando un mapeo de expresión puede hacer que su mapeo sea condicional basado en un ;carácter final :

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

Para más ayuda ver:

:h <lt>
:h map-<expr>
Peter Rincker
fuente
1
En la documentación vim. ver :h <>. La parte relevante es: la notación <> usa <lt> para escapar del significado especial de los nombres clave. El uso de una barra diagonal inversa también funciona, pero solo cuando 'cpoptions' no incluye la bandera 'B'. Entonces, si la Bbandera no está dentro cpotions, puede usarla \<Esc>para representar la <Esc>clave.
jdhao
5

Necesita escapar del <ESC>modo de comando. Esto se hace con el prefijo <C-v>. También necesita un seguimiento <CR>para ejecutarlo realmente. Me gusta esto:

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

Descubrí que hay 3 formas de escapar de la clave:

  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>

Similar para la tecla Enter ( <cr>):

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

Jason
fuente
¡Bienvenidos a Vi y Vim !
D. Ben Knoble