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.

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>

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>

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.


Bienvenue chez Vi et Vim !
D. Ben Knoble
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.