Pourquoi `ESC` fait-il reculer le curseur dans vim?

62

Dans vim, lorsque je frappe ESCpour revenir en mode commande, le curseur se déplace d'un caractère à gauche. Ce n’est pas ce que j’espérais, parfois j’ai immédiatement tenté lde revenir à cet endroit, peut-être pour supprimer un personnage.

Y a-t-il une raison à ce comportement? Est-ce pratique pour un modèle d'utilisation qui me manque?

Eric Wilson
la source
1
Je n'ai même jamais remarqué cela jusqu'à maintenant ... et j'utilise vim tous les jours. Je ne sais pas pourquoi, mais j'aimerais connaître les réponses.
Gabe.
5
Lorsque vous revenez en mode insertion, vous pouvez appuyer sur «a» pour ajouter au lieu de «i» pour insérer. Vous retournerez ensuite à la position dans laquelle vous vous trouviez avant d'appuyer sur la touche d'échappement.
Penguin359

Réponses:

40

En mode insertion, le curseur est entre les caractères, ou avant le premier ou après le dernier caractère. En mode normal, le curseur est placé sur un caractère (les nouvelles lignes ne sont pas des caractères à cet effet). Ceci est un peu hors du commun: la plupart des éditeurs toujours mettre le curseur entre les caractères, et ont la plupart des commandes agissent sur le caractère après (non, à strictement parler, sous ) le curseur. Ceci est peut-être dû en partie au fait qu'avant les interfaces graphiques, les terminaux texte affichaient toujours le curseur sur un caractère (souligné ou bloc, peut-être clignotant). Cette abstraction échoue en mode insertion car cela nécessite une position supplémentaire (posts vs fences).

Pour passer d'un mode à l'autre, le curseur doit être déplacé d'un demi-caractère, pour ainsi dire. La icommande se déplace à gauche pour placer le curseur avant le caractère sur lequel il était terminé. La acommande se déplace bien. Le fait de sortir du mode insertion (en appuyant sur Esc) déplace le curseur à gauche si possible (s'il se trouve au début de la ligne, il est déplacé à droite).

Je suppose que le Esccomportement a un sens. Souvent, vous tapez au bout de la ligne et vous Escne pouvez aller qu’à gauche. Le comportement général est donc le comportement le plus courant.

Pensez au caractère sous le curseur en tant que dernier caractère intéressant et à la commande d'insertion en tant que a. Vous pouvez répéter a Escsans déplacer le curseur, sauf que vous serez déplacé d'une position vers la droite si vous commencez au début d'une ligne non vide.

Gilles, arrête de faire le mal
la source
21

Visuellement, cela a plus de sens dans gvim:

Lors de l'édition, votre curseur est entre les caractères:
entrez la description de l'image ici

En mode normal, il se trouve au-dessus du dernier caractère:
entrez la description de l'image ici

Donc, ça ne remonte pas vraiment un personnage, juste d’être entre r et sà être sur r

Martin Ueding
la source
1
Belle image. Pour être honnête, je suis dans le camp qui dit que le personnage mdoit rester en surbrillance lors de son retour au mode normal ...
Steven Lu
Oops. les liens d'image sont maintenant morts.
Steven Lu
1
liens d'image maintenant morts.
Steven Lu
1
Ouais, l'hébergement manuel de vos images est à la fois plus fastidieux et moins fiable que d'utiliser simplement l'outil de l'éditeur de démarques sur ce site.
Steven Lu
1
Est-ce que tout va bien avec eux encore? C'est "Cursor" ce qu'ils ont tapé et votre texte mentionne "j"
poige
15

Ce comportement est modifiable, comme indiqué ici , mais arrêtez-vous et réfléchissez à ce qui se passe pendant une seconde. Lorsque vous êtes en mode insertion, vous n'êtes pas réellement au-dessus d'un caractère mais entre eux. Lorsque vous insérez quelque chose, le curseur passe à la fin de ce que vous avez inséré pour que le prochain élément inséré soit placé après. Maintenant, pensez à si vous venez de taper une lettre, alors vous voulez y faire quelque chose. Frapper Escmettrait le curseur de sélection directement sur le dernier caractère que vous avez inséré. S'il ne le faisait pas, ce serait plutôt gênant.

La situation à laquelle vous pensez probablement est lorsque vous êtes en mode insertion et que vous vous déplacez comme si vous étiez en mode normal, puis que vous basculiez. Dans ce cas, le curseur semble revenir d’un caractère à l’autre, mais si vous pensez de cette façon, cela indique que vous êtes en mode d’insertion et que la dernière chose que vous avez faite est de ne PAS insérer. Peut-être devriez-vous passer plus de temps en mode normal?

Caleb
la source
15
Cela n'a pas de sens pour moi. Comment expliquez-vous le comportement de reculement iet de ESCpression de touche?
Warren Young
4
Entrer en mode insertion, ne rien insérer, puis le quitter n'est pas un test équitable. Pourquoi voudriez-vous être en mode insertion si vous n'avez pas inséré quelque chose? Si vous insérez quelque chose, le retour au mode normal vous laisse avec le caractère que vous avez inséré sélectionné. Très intuitif.
Caleb
4
Il ne s'agit pas de "juste", mais de pouvoir explicatif. Si votre théorie de fonctionnement n'explique pas tout le comportement, le comportement est incomplet ou vi est incohérent. Je préfère croire que vi est parfait à tous égards, et donc cohérent. :)
Warren Young
9
@Warren Le comportement de "marche en arrière" isuivi de ESCest fonction de iet est totalement indépendant de ESC; plus précisément, lorsque vous frappez, ivous demandez à vim d’ insérer un caractère, ce qui signifie par définition "insérer un caractère antérieur à celui sur alequel je suis", par opposition à "ajouter un caractère après celui-ci".
Kromey
3
En général, après chaque changement, lorsque je quitte ce changement, j'en ai terminé avec ce changement, et la prochaine chose que j'aimerais faire consistera probablement à apporter un changement différent. Ainsi, pour moi, en quittant le mode insertion (quelle que soit la façon dont je l'ai entré), je préférerais généralement que le curseur se positionne sur le caractère suivant afin que je sois prêt pour mon prochain changement, plutôt que d'être prêt à changer ce que je viens de faire. inséré.
Kyle Strand
6

Tapez Alt+ Lpour revenir en mode commande.

Il ne nécessite aucune modification de la cartographie ou de la configuration de vim. Cela fonctionne parce que sur la plupart des émulateurs de terminal Alt+ KEYenvoie un Escsuivi de KEY(sur xterm, vous devrez peut-être ajouter une Xterm*metaSendsEscape: trueligne dans votre fichier ~ / .Xdefaults). Ce comportement vous permet même de "créer" d'autres combinaisons de mode d'insertion qui fonctionnent comme vous le feriez, comme Alt+ Svers Backspace.

En passant, placer le curseur au-dessus du caractère que vous venez d'écrire peut être très gênant. Par exemple, Escdwne supprimez pas le mot après le texte que vous venez d'insérer.

utilisateur79932
la source
Le désagrément que vous évoquez peut être évité en tapant toujours un espace en mode insertion avant l'évasion. Ensuite, le curseur quittant le mode d’insertion est placé sur l’espace et vous pouvez taper Esc d epour supprimer le mot précédent. Je suis revenu au comportement par défaut car je sentais qu'il changeait d'autres comportements déjà encodés dans ma tête.
mljrg
4

Voici ma solution.

C'est une version plus concise de la solution proposée sur la page wikia à ce sujet .

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
Steven Lu
la source
+1 ici pour citer la page du wiki, même si l'utilisateur ne demandait pas réellement un moyen de changer ce comportement.
Kyle Strand
Vous remarquerez que si vous creusez suffisamment dans Vim, de nombreux plug-in dépendent du comportement par défaut (légèrement peu intuitif). Par conséquent, si vous voyez des trucs manger ou modifier un seul personnage au hasard, cela pourrait en être la cause. Je n'utilise pas cette autocommande moi-même; cela fonctionne bien, cependant.
Steven Lu