Comment ‘refaire’ les changements après ‘annuler’ avec Emacs?

Cet article dit que “Emacs a refait parce que vous pouvez inverser la direction en annulant, annulant ainsi l’annulation”.

Qu’est-ce que ça veut dire? Comment un utilisateur peut-il “refaire” avec Emacs?

Version courte: en annulant l’annulation. Si vous annulez, puis exécutez une commande de non-édition telle que Cf , l’annulation suivante annulera l’annulation, ce qui entraînera un rétablissement.

Version plus longue:

Vous pouvez penser à annuler en opérant sur une stack d’opérations. Si vous exécutez une commande (même une commande de navigation telle que Cf ) après une séquence d’opérations d’annulation, toutes les annulations sont transmises à la stack d’opérations. Donc, la prochaine annule la dernière commande. Supposons que vous ayez une séquence d’opération qui ressemble à ceci:

  1. Insérer “foo”
  2. Insérer “bar”
  3. Insérer “J’aime le spam”

Maintenant, vous défaire. Il annule la dernière action, entraînant la liste suivante:

  1. Insérer “foo”
  2. Insérer “bar”

Si vous faites autre chose que de défaire à ce stade – par exemple, Cf , la stack d’opérations ressemble à ceci:

  1. Insérer “foo”
  2. Insérer “bar”
  3. Insérer “J’aime le spam”
  4. Annuler insérer “J’aime le spam”

Maintenant, lorsque vous annulez, la première chose que vous annulez est l’annulation. Résultat dans votre stack d’origine (et l’état du document):

  1. Insérer “foo”
  2. Insérer “bar”
  3. Insérer “J’aime le spam”

Si vous modifiez la commande pour interrompre la séquence d’annulation, cette commande est ajoutée après l’annulation et est donc la première chose à être annulée par la suite. Supposons que vous reculiez sur “bar” au lieu de bash Cf. Alors vous auriez eu

  1. Insérer “foo”
  2. Insérer “bar”
  3. Insérer “J’aime le spam”
  4. Annuler insérer “J’aime le spam”
  5. Supprimer “bar”

Cet ajout / ré-addition se produit à l’infini. Cela prend un peu de temps pour s’y habituer, mais cela donne vraiment à Emacs un mécanisme d’annulation / restauration extrêmement flexible et puissant.

Pour annuler: C-_

Pour refaire après une annulation: Cg C-_

Tapez plusieurs fois sur C-_ pour refaire ce qui a été annulé par C-_ Pour refaire plusieurs fois une commande emacs, exécutez votre commande puis tapez Cx z puis tapez plusieurs fois sur la touche z pour répéter la commande (intéressant quand vous voulez) exécuter plusieurs fois une macro)

  • Pour annuler une fois: C-/
  • Pour annuler deux fois: C-/ C-/
  • Pour refaire une fois, immédiatement après la suppression: Cg C-/
  • Répéter deux fois, immédiatement après la suppression: Cg C-/ C-/ . Notez que Cg n’est pas répété.
  • Pour annuler immédiatement à nouveau , une fois: Cg C-/
  • Pour annuler immédiatement à nouveau, deux fois: Cg C-/ C-/
  • Pour refaire , le même…

Si vous avez appuyé sur une touche quelconque (que ce soit en tapant des caractères ou en déplaçant simplement le curseur) depuis votre dernière commande d’annulation, il n’est pas nécessaire de taper Cg avant votre prochaine annulation / restauration. Cg est juste une clé sûre pour bash qui ne fait rien, mais qui compte comme une touche non-annuler pour signaler la fin de votre séquence d’annulation. Appuyer sur une autre commande telle que Cf fonctionnerait aussi; c’est juste que cela déplacerait le curseur de l’endroit où vous l’avez.

Si vous appuyez sur Cg ou sur une autre commande alors que vous ne le vouliez pas, et que vous vous perdez dans la mauvaise direction, appuyez simplement sur Cg pour inverser votre direction. Vous devrez défaire complètement vos redos et vos annulations accidentelles avant d’arriver aux annulations que vous voulez, mais si vous continuez à bash C-/ , vous finirez par atteindre l’état souhaité. En fait, tous les états dans lesquels la mémoire tampon a été enregistrée sont accessibles, si vous appuyez une fois sur Cg , puis appuyez sur C-/ suffisamment de fois.

Les raccourcis alternatifs pour undo , autres que C-/ , sont C-_ , Cx u et Mx undo .

Voir Annuler dans le manuel Emacs pour plus de détails sur le système d’annulation d’Emacs.

Pour ceux qui souhaitent avoir la fonctionnalité d’annulation / undo-tree.el la plus courante, quelqu’un a écrit undo-tree.el . Il fournit l’aspect et la convivialité des fonctions non-Emacs, mais donne access à l’intégralité de l’arborescence de l’historique des annulations.

J’aime le système d’annulation intégré d’Emacs, mais je trouve que ce paquet est très intuitif.

Voici le commentaire du fichier lui-même:

Emacs possède un puissant système d’annulation. Contrairement au système d’annulation / restauration standard dans la plupart des logiciels, il vous permet de récupérer tout état passé d’un tampon (alors que le système d’annulation / restauration standard peut perdre les états passés dès que vous recommencez). Cependant, cette puissance a un prix: de nombreuses personnes trouvent le système d’annulation d’Emacs déroutant et difficile à utiliser, générant un certain nombre de paquets qui le remplacent par le système d’annulation / restauration moins puissant mais plus intuitif.

La perte de données avec défault / redo standard, et la confusion de l’annulation d’Emacs, résultent de la tentative de traiter l’historique des annulations comme une séquence linéaire de modifications. Ce n’est pas. Le mode «undo-tree-mode» fourni par ce paquet remplace le système d’annulation d’Emacs par un système qui traite l’historique comme étant ce qu’il est: une arborescence de modifications. Cette idée simple permet de combiner le comportement plus intuitif du système d’annulation / restauration standard avec la puissance de ne jamais perdre aucun historique. Un bonus supplémentaire est que l’historique des annulations peut dans certains cas être stocké plus efficacement, ce qui permet d’accumuler plus de modifications avant qu’Emacs ne commence à ignorer l’historique.

Méfiez-vous d’une bizarrerie d’ arbre pour refaire !

De nombreux «kits de démarrage» (prélude, purcell, spacemacs) sont livrés avec des anneaux. La plupart (tous?) Même auto-activer. Comme mentionné, défaire l’arbre est un moyen pratique de visualiser et de traverser l’arrière ou le défaire. Prélude lui donne même un accord de clé ( uu ), et aussi Cx u .

Le problème est: undo-tree semble détruire la liaison par défaut et bien connue d’Emacs pour redo : Cg C-/ .

Au lieu de cela, vous pouvez utiliser ces touches symésortingques pour annuler / rétablir :

 C-/ undo CS-/ redo 

Celles-ci sont utiles car vous voulez parfois refaire rapidement sans ouvrir le visualiseur.

Je trouve que redo.el extrêmement pratique pour faire un “annuler” / refaire “normal”, et que je le lie habituellement à CSz et défais-le à Cz, comme ceci:

 (when (require 'redo nil 'noerror) (global-set-key (kbd "CSz") 'redo)) (global-set-key (kbd "Cz") 'undo) 

Il suffit de télécharger le fichier, de le mettre dans votre lisp-path et de le coller ci-dessus dans votre .emacs .