Comment vim détermine-t-il la taille d'une seule «modification» lors de l'utilisation de «u» et de «CTL-R»?

17

Lorsque vous utilisez uou CTL-Rpour annuler ou refaire une modification dans vim, il semble que je modifie des morceaux de texte, pas seulement la frappe la plus récente.

Qu'est-ce qui détermine la taille du bloc considéré comme un seul montage?

DQdlM
la source

Réponses:

19

Vous recherchez la définition de undo-blocks.

De :h undo-blocks:

Une commande d'annulation annule normalement une commande tapée, quel que soit le nombre de modifications apportées par cette commande. Cette séquence de modifications annulables forme un bloc d'annulation. Ainsi, si la ou les touches tapées appellent une fonction, toutes les commandes de la fonction sont annulées ensemble.

Le même bloc est utilisé pour redo. De :h redo:

Les derniers changements sont mémorisés. Vous pouvez utiliser les commandes Annuler et Rétablir ci-dessus pour rétablir le texte tel qu'il était avant chaque modification. Vous pouvez également appliquer à nouveau les modifications en récupérant le texte avant l'annulation.

vappolinario
la source
4
Vous pouvez également séparer manuellement un seul bloc d'annulation avec la commande CTRL-G uen mode insertion, ce qui est utile si vous avez des macros en mode insertion.
fruglemonkey
8

L' édition modale de vim est souvent considérée comme un opérateur (par exemple c, d...) appliquée sur une mouvement (par exemple iw, w, }, ...). En tant que merveilleux sous-produit, Vim obtient de grosses défaites. Alors que d'autres éditeurs doivent deviner pour faire de nombreuses petites annulations en blocs d'annulation, Vim le fait naturellement. Un autre effet secondaire est que cela vous donne un opérateur de répétition .(aka la commande point).

Votre question mentionne spécifiquement les frappes, donc je suppose que vous voulez savoir comment annuler de petites modifications en mode insertion. La réponse est que ce n'est pas "la voie Vim". "The Vim Way" signifie que vous serez en mode insertion pour une courte rafale à la fois. Cela signifie que lorsque des erreurs sont commises en mode insertion, vous quittez souvent le mode normal et corrigez le texte ou faites simplement une annulation u, et réécrivez le texte.

Parfois, il est nécessaire de diviser un bloc d'annulation en mode insertion. Cela peut être accompli via <c-g>uen mode insertion. Voir :h :undojet :h undo-blockspour plus d'informations.

Pour plus d'aide, je suggère ce qui suit:

:h undo-blocks
:h :undoj
:h undo-tree
:h persistent-undo
:h undo.txt

Il y a aussi quelques screencasts sur ce sujet:

Peter Rincker
la source
"Chunky undo" - meilleure description que j'ai vue.
Matt Parker
6

Vous pouvez aussi y penser de cette façon: chaque fois que vous passez en mode insertion pour éditer du texte et que vous appuyez Esc, cela formera un bloc. Si vous essayez d'annuler ce bloc, vous irez à la même position avant de passer en mode d'insertion.

Par conséquent, vous pouvez "enregistrer" vos modifications simplement en quittant le mode d'insertion de temps en temps: disons que vous passez en mode d'insertion et écrivez une fonction. Vous pouvez continuer à coder et passer à la fonction suivante, mais il est parfois préférable de revenir au mode normal et de basculer à nouveau en mode insertion. De cette façon, vous pouvez structurer votre code de manière simple et si vous devez revenir en arrière, vous pouvez savoir dans quelle position vous vous retrouverez.

Remarque: si vous utilisez des flèches pour vous déplacer, c'est comme si vous appuyiez sur Esc+ [ hjkl]

Wylex
la source