Annuler en mode insertion

23

Existe-t-il une commande pour annuler la dernière opération effectuée en mode insertion?

Je viens de coller du texte du mauvais registre en utilisant <C-r>, et j'ai deux options:

  1. Supprimez à la main ce que je viens de coller et recommencez.
  2. Passez en mode normal, appuyez uet perdez le texte que j'ai tapé avant de frapper <C-r>.

Y a-t-il une meilleure façon?

zool
la source

Réponses:

16

Vim offre une capacité limitée de spécifier la portée d'une modification annulable avec la Ctrl-G ucommande, qui rompt la séquence d'annulation. Voir

:help i_CTRL-G_u

Dans votre cas, la solution serait de remapper <C-R>comme ceci:

:inoremap <C-R> <C-G>u<C-R>

Ensuite, la saisie <C-O>uannulera uniquement les modifications apportées depuis la saisie <C-R>. Voir

:help i_CTRL-O
garyjohn
la source
1
C'est génial, je ne connaissais pas cette commande. Il y a un temps assez long entre taper <C-O>uet voir le résultat à l'écran (environ 4 secondes), une idée sur la façon de m'en débarrasser?
zool
Je l'ai aussi remarqué. Je ne sais pas; Je vais essayer de le découvrir.
garyjohn
Hé là, est-il possible que vous vouliez dire <CR> (retour chariot) au lieu de <CR> (ctrl-r)?
Derwent
Non. La question initiale concernait le comportement de <CR>, c'est donc ce que le mappage utilise. Cependant, vous pouvez remplacer <CR> par <CR> dans ce mappage pour que la séquence d'annulation soit interrompue par un <CR> à la place. Plus d'exemples peuvent être trouvés à :help i_CTRL-G_u.
garyjohn
6

Depuis le mode insertion:

  1. Si votre texte collé est plus petit qu'une ligne (c'est ce que votre 2ème point implique), appuyez simplement sur <C-u>pour supprimer tous les caractères avant le curseur dans la ligne actuelle.

  2. Si le texte collé est plus d'une ligne, votre 2ème solution fonctionnerait mieux, comme suit ADAPTÉ: <C-o>u.

Les deux points ci-dessus commenceront et resteront - ou finiront - en mode insertion; ils sont en fait les mêmes avec vos solutions proposées, juste raccourcies :)

VanLaser
la source
6

Vous pouvez essayer <C-w>(supprime un mot à gauche) ou <C-u>(effacez les caractères avant le curseur lorsque vous appuyez une fois, supprime le saut de ligne lorsque vous appuyez une deuxième fois). Voir :help i_CTRL-Wet :help i_CTRL-U.

Si vous collez beaucoup à partir d'un registre, il est bien sûr plus rapide d'annuler vos modifications, vous pouvez utiliser le mode d'insertion normal avec <C-o>pour cela (exécuter une commande de mode normal puis revenir en mode d'insertion).

En général, il est utile de découper vos modifications en petits morceaux en revenant souvent au mode normal, afin d'avoir des possibilités d'annulation précises.

cbaumhardt
la source