Por que recebo um erro de cotação ausente ao usar o seguinte em um mapeamento usando execute e normal?

8

O comando é

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

Se você pressionar <leader>;, você será E114: Missing quote: "normal! mqA;\seguido por E15: Invalid expression: "normal! mqA;\. Por que é isso? O comando funciona bem se for inserido diretamente na linha de comando.

O comando adiciona a ;no final da linha atual, sem alterar a posição dos cursores.

Percebo que posso apenas fazer o nnoremap <leader>; mqA;<esc>`qque funciona, a questão é por que o que foi dito acima não funciona e o que pode ser feito para fazê-lo funcionar da forma normal de execução.

Meu palpite seria que é necessário algum nível de escape aninhado, mas não consegui encontrar um que funcione.

Alice Ryhl
fonte

Respostas:

9

Você precisa escapar da <via <lt>:

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

Nota: adicionado <cr>para executar o comando também.

No entanto, isso pode ser bastante simplificado:

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

Usando um mapeamento de expressão, você pode tornar seu mapeamento condicional com base em um ;caractere à direita :

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

Para obter mais ajuda, consulte:

:h <lt>
:h map-<expr>
Peter Rincker
fonte
1
Na documentação do vim. veja :h <>. A parte relevante é: A notação <> usa <lt> para escapar do significado especial dos nomes das chaves. Usar uma barra invertida também funciona, mas apenas quando 'cpoptions' não inclui o sinalizador 'B'. Portanto, se o Bsinalizador não estiver em cpotions, você pode usar \<Esc>para representar a <Esc>chave.
Jdhao
5

Você precisa escapar do <ESC>modo de comando. Isso é feito prefixando-o com <C-v>. Você também precisa de um trailing <CR>para executá-lo. Como isso:

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

Descobri que existem três maneiras de escapar da chave:

  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>

Semelhante para a tecla Enter ( <cr>):

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

Jason
fonte
Bem-vindo ao Vi e Vim !
D. Ben Knoble