Pourquoi est-ce que j'obtiens une erreur de devis manquante lors de l'utilisation de ce qui suit dans un mappage utilisant execute et normal?

8

La commande est

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

Si vous appuyez ensuite sur <leader>;, vous E114: Missing quote: "normal! mqA;\suivrez E15: Invalid expression: "normal! mqA;\. Pourquoi est-ce? La commande fonctionne correctement si elle est entrée directement dans la ligne de commande.

La commande ajoute un ;à la fin de la ligne actuelle, sans changer la position des curseurs.

Je me rends compte que je peux simplement faire nnoremap <leader>; mqA;<esc>`qce qui fonctionne, la question est de savoir pourquoi ce qui précède ne fonctionne pas et ce qui peut être fait pour le faire fonctionner sous la forme d'exécution normale.

Je suppose que certains niveaux d'échappement imbriqués sont nécessaires, mais je n'ai pas pu en trouver un qui fonctionne.

Alice Ryhl
la source

Réponses:

9

Vous devez échapper à la <via <lt>:

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

Remarque: ajouté <cr>pour exécuter la commande également.

Cependant, cela peut être simplifié un peu:

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

À l'aide d'un mappage d'expression, vous pouvez rendre votre mappage conditionnel en fonction d'un ;caractère de fin :

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

Pour plus d'aide, voir:

:h <lt>
:h map-<expr>
Peter Rincker
la source
1
Dans la documentation de vim. voir :h <>. La partie pertinente est: La notation <> utilise <lt> pour échapper à la signification spéciale des noms de clés. L'utilisation d'une barre oblique inverse fonctionne également, mais uniquement lorsque «cpoptions» n'inclut pas l'indicateur «B». Donc, si le Bdrapeau n'est pas dedans cpotions, vous pouvez utiliser \<Esc>pour représenter la <Esc>clé.
jdhao
5

Vous devez échapper <ESC>au mode de commande. Cela se fait en le préfixant avec <C-v>. Vous avez également besoin d'un suivi <CR>pour l'exécuter. Comme ça:

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

J'ai trouvé qu'il y a 3 façons d'échapper à la clé:

  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>

Similaire pour la touche Entrée ( <cr>):

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

Jason
la source
Bienvenue chez Vi et Vim !
D. Ben Knoble