Q: Comment insérer / modifier du texte dans un tampon sans m'en rendre undo
compte?
Voici le cas d'utilisation. J'ai un bloc de commentaires au début de chaque fichier qui, entre autres, met à jour un horodatage pour la modification la plus récente d'un fichier. J'aimerais pouvoir modifier cet horodatage sans que les undo
installations le remarquent.
La raison pour laquelle je veux court-circuiter undo
ici est due au cas de bord suivant, qui apparaît lors de l'édition / compilation des documents LaTeX (et probablement d'autres, mais c'est celui qui me rend le plus souvent fou):
- Apportez une petite modification au fichier pour voir comment cela affectera le document compilé
- Enregistrez le fichier (qui met à jour l'horodatage)
- Exécuter
latex
sur le fichier - Décidez que le changement est mauvais
undo
les changements
Le problème à l'étape (5) ( undo
) est qu'il n'annule pas la modification effectuée à l'étape (1), mais annule plutôt la mise à jour de l'horodatage à l'étape (2). Cela ne me dérangerait pas (je pourrais le faire à undo
nouveau), sauf qu'il déplace également le point jusqu'à l'horodatage en haut du fichier, ce qui est presque toujours à de nombreuses lignes du changement de fond réel. C'est très choquant et brise complètement ma concentration.
Je pose la question par rapport à un fichier que je visite, mais il s'agit plus généralement de modifier les tampons.
Alors: comment puis-je éviter undo
de remarquer une modification spécifique d'un tampon?
undo
anéantirait les deux.atomic-change-group
.with-undo-collapse
macro qui était très utile: emacs.stackexchange.com/a/7560/2418Réponses:
La réponse de @ stsquad m'a mis sur la bonne voie. Fondamentalement, les étapes sont les suivantes:
buffer-undo-list
undo
undo
et restaurer lebuffer-undo-list
Voici donc un schéma d'une telle fonction:
Edit: en fait, il s'avère qu'une solution plus simple consiste simplement à
let
-bindbuffer-undo-list
afin que les modifications apportées à la liste dans le corps dulet
get soient écrasées lorsque la liste d'origine est restaurée:La principale limitation est que cela semble fonctionner pour les modifications qui ne changent pas le nombre de caractères dans le tampon (par exemple, changer "chatons" en "chiots", mais pas "chats"), car sinon le reste de l'annulation la liste fait maintenant référence aux mauvais points. Il ne s'agit donc que d'une solution partielle .
la source
Une opération d'annulation combine plusieurs éléments de la liste d'annulation . Une
nil
entrée dans la liste marque la frontière entre deux groupes de modifications. En supprimant lenil
au début de la liste qui est automatiquement inséré par la boucle de niveau supérieur¹, vous pouvez grouper la mise à jour de l'horodatage avec le dernier changement de tampon, ce qui ne correspond pas techniquement à votre demande mais devrait pratiquement résoudre le problème dans votre scénario.(Attention: non testé, la liste d'annulation peut nécessiter plus de massage.)
Vous pouvez également jouer avec la liste d'annulation d'une manière différente, en modifiant l' entrée de position (un entier) pour la mise à jour de l'horodatage.
¹ effectue un retrait similaire aux insertions de groupe.
self-insert-command
la source
Le problème avec ce que vous suggérez est que l'arborescence d'annulation est une liste de deltas pour aller de l'endroit où vous êtes à l'endroit où vous voulez être. Bien qu'il soit parfaitement possible de désactiver le suivi d'annulation sur un tampon, je ne suis pas sûr de l'effet de l'enregistrement non actif des modifications. J'ai actuellement une bascule pour activer / désactiver l'annulation sur un tampon particulier car cela n'a pas de sens d'avoir des informations d'annulation sur un journal en pleine croissance ou une page rafraîchissante. Cependant, il supprime les changements de bascule:
buffer-disable-undo définit en fait juste buffer-undo-list à nil . Peut-être que si vous sauvegardiez l'état de la liste des tampons-annulations sur votre bascule, vous pourriez le restaurer ensuite?
la source