Je rencontre un problème étrange avec un mappage en mode normal de Esc.
Si vous créez le fichier escmapvimrc
avec le contenu:
set nocompatible
set showcmd " Doesn't affect the problem: just makes it easier to see
nnoremap <Esc> :noh<CR><esc>
Et puis démarrez vim en utilisant ce vimrc:
vim --noplugin -u escmapvimrc
Ensuite, vim démarrera en mode opérateur en attente avec une c
commande en attente de saisie supplémentaire, affichant un fichier vide et avec la ligne de commande :noh
.
Si vous supprimez la nnoremap
ligne, le problème disparaît.
Si vous déboguez et parcourez tout, vous obtenez la sortie suivante:
Entering Debug mode. Type "cont" to continue.
/[...]/escmapvimrc
line 1: set nocompatible
>s
/[...]/escmapvimrc
line 2: set showcmd " Doesn't affect the problem: just makes it easier to see
>s
/[...]/escmapvimrc
line 3: nnoremap <Esc> :noh<CR><esc>
>s
/[...]/escmapvimrc
line 4: End of sourced file
>s
Press ENTER or type command to continue
Après avoir appuyé sur Entrée, l'écran de démarrage de Vim s'affiche, et en dessous:
Entering Debug mode. Type "cont" to continue.
cmd: noh
>s
L'écran de démarrage de Vim disparaît alors et vous êtes en mode opérateur en attente, comme décrit ci-dessus.
Que se passe-t-il?
EDIT: Le comportement est tel que décrit dans Vim 7.3. Dans Vim 7.4.52, le nmap
fait démarrer Vim en mode Remplacer lors du démarrage de Vim sans fichier. (Si Vim 7.4.52 est démarré avec un fichier, cependant, il démarre également avec une commande c en cours.) Quoi qu'il en soit, le problème disparaît lorsque le nmap est supprimé.
la source
:noh
pour moi. Faire de même avec gvim n'a pas montré ce comportement.nnoremap <c-l> :noh<cr><c-l>
/alksdjflaskj
pour effacer la surbrillance de la recherche, ce qui est également assez rapide.Réponses:
Vim envoie au démarrage des codes de terminal spéciaux (qui contiennent généralement la
<esc>
clé) pour déterminer plusieurs choses (couleurs, bs, ...) Si vous avez mappé,<esc>
cela confondra très probablement l'analyseur des codes de retour et des choses étranges peuvent se produire.Par conséquent, utilisez votre carte ci-dessus uniquement après que tout a été correctement configuré (par exemple via une autocommande VimEnter).
la source
'term'
option est définie. C'est généralement uniquement au démarrage, mais il peut y avoir des scénarios où il est défini au moment de l'exécution.VimEnter
n'ait pas fonctionné.Le terminal Linux utilise des séquences d'échappement ANSI (c'est-à-dire des chaînes de caractères commençant par
<Esc>
) pour envoyer des clés spéciales à Vim, et dans le cadre du protocole de communication avec lequel l'application recherche ses capacités. Votre cartographie interfère avec cela et conduit ainsi à ces comportements "étranges".Par conséquent, ne mappez pas
<Esc>
. Utilisez une autre clé. Le problème est moins prononcé dans GVIM, mais je ne le recommanderais pas non plus.la source
<Esc><Esc>
?Essaye ça:
cf /programming//a/16027716/400545
la source
escapemapvimrc
fichier par ceci, lorsque le démarrage de Vim est terminé, je suis en mode ligne de commande, avec la ligne de commande contenant le contenu suivant::83/94/95^G
(c'est un littéralCTRL-G
à la fin). Ce morceau de:help
semble suggérer que ce n'est peut-être pas le meilleur moment pour configurer la cartographie:Note that this event may be triggered halfway executing another event, especially if file I/O, a shell command or anything else that takes time is involved.
J'ai essayé de configurer une autocommande pour définir le mappage plus tard au démarrage, mais le problème persiste. *
J'ai finalement créé une autocommande qui se produit la première fois que j'entre en mode Insertion. Ce n'est évidemment pas une solution parfaite, mais pour moi, cela fonctionnera la plupart du temps, et cela semble être le mieux que je puisse faire:
MISE À JOUR : Après avoir utilisé la version longue ci-dessous sans problème pendant quelques années, j'ai décidé qu'elle était peut-être légèrement sur-conçue, et depuis lors, j'ai utilisé cette version beaucoup plus simple, qui à la place réinitialise simplement le mappage à chaque fois que vous entrez en mode insertion:
Le mappage n'a pas besoin d'être réinitialisé à chaque fois que vous entrez en mode d'insertion, mais cela ne nuit pas non plus à Vim.
VERSION ORIGINALE :
* J'ai essayé attacher à divers événements:
VimEnter
,BufReadPost
,BufWinEnter
, et mêmeCursorMoved
(!), Mais ceux - ci semblent tous au feu trop tôt.la source
TermResponse
automatique?t_RV
,t_u7
,t_RF
,t_RB
, Et peut - être d' autres.) Donc , cela dépend aussi de votre terminal