F: Wie füge ich Text in einen Puffer ein / ändere ihn, ohne es zu undo
merken?
Hier ist der Anwendungsfall. Ich habe am Anfang jeder Datei einen Kommentarblock, der unter anderem einen Zeitstempel für die letzte Änderung an einer Datei aktualisiert. Ich möchte diesen Zeitstempel ändern können, ohne dass die undo
Einrichtungen dies bemerken.
Der Grund, warum ich undo
hier kurzschließen möchte, ist der folgende Randfall, der beim Bearbeiten / Kompilieren von LaTeX-Dokumenten auftritt (und wahrscheinlich auch andere, aber dies ist derjenige, der mich am häufigsten verrückt macht):
- Nehmen Sie eine kleine Änderung an der Datei vor, um zu sehen, wie sich dies auf das kompilierte Dokument auswirkt
- Speichern Sie die Datei (wodurch der Zeitstempel aktualisiert wird).
- Führen Sie
latex
die Datei aus - Entscheide, dass die Änderung schlecht ist
undo
die Veränderungen
Das Problem in Schritt (5) ( undo
) besteht darin, dass die in Schritt (1) vorgenommene Änderung nicht rückgängig gemacht wird, sondern die in Schritt (2) aktualisierte Zeitstempel-Aktualisierung rückgängig gemacht wird. Das würde mich nicht stören (ich könnte es einfach noch undo
einmal tun ), außer dass es sich auch bis zum Zeitstempel oben in der Datei bewegt, was fast immer viele, viele Zeilen von der eigentlichen inhaltlichen Änderung entfernt ist. Es ist sehr irritierend und bricht meine Konzentration völlig.
Ich stelle die Frage in Bezug auf eine Datei, die ich besuche, aber es geht allgemeiner darum, Puffer zu ändern.
Also: Wie kann ich verhindern, undo
dass eine bestimmte Änderung an einem Puffer bemerkt wird?
undo
würden beide rückgängig gemacht.atomic-change-group
.with-undo-collapse
Makro, das sehr nützlich war: emacs.stackexchange.com/a/7560/2418Antworten:
Die Antwort von @ stsquad hat mich auf den richtigen Weg gebracht. Grundsätzlich sind die Schritte:
buffer-undo-list
undo
undo
und wiederherstellen Sie diebuffer-undo-list
Hier ist eine Skizze einer solchen Funktion:
Bearbeiten:
let
Tatsächlich stellt sich heraus, dass eine einfachere Lösung immer noch darin besteht, einfach zu binden,buffer-undo-list
sodass Änderungen an der Liste im Hauptteil deslet
Get Clobbers auftreten, wenn die ursprüngliche Liste wiederhergestellt wird:Die Hauptbeschränkung dabei ist, dass es für Modifikationen zu funktionieren scheint, die die Anzahl der Zeichen im Puffer nicht ändern (z. B. "Kätzchen" in "Welpen" ändern, aber nicht "Katzen"), da sonst der Rest rückgängig gemacht wird Liste bezieht sich jetzt auf die falschen Punkte. Daher ist dies nur eine Teillösung .
quelle
Eine Rückgängig-Operation kombiniert mehrere Elemente aus der Rückgängig-Liste . Ein
nil
Eintrag in der Liste markiert die Grenze zwischen zwei Änderungsgruppen. Durch Entfernen dernil
am Anfang der Liste automatisch eingefügten Liste, die automatisch von der Toplevel-Schleife¹ eingefügt wird, können Sie die Zeitstempelaktualisierung mit der letzten Pufferänderung gruppieren, die technisch nicht Ihrer Anforderung entspricht, das Problem in Ihrem Szenario jedoch praktisch lösen sollte.(Warnung: ungetestet, die Rückgängig-Liste erfordert möglicherweise mehr Massage.)
Sie können auch auf andere Weise mit der Rückgängig-Liste spielen, indem Sie den Positionseintrag (eine Ganzzahl) für die Zeitstempelaktualisierung ändern.
¹ entfernt ähnlich wie Gruppeninsertionen.
self-insert-command
quelle
Das Problem mit dem, was Sie vorschlagen, ist, dass der Rückgängig-Baum eine Liste von Deltas ist, um von Ihrem Standort zu Ihrem gewünschten Standort zu gelangen. Obwohl es durchaus möglich ist, das Rückgängigmachen der Nachverfolgung für einen Puffer zu deaktivieren, bin ich mir nicht sicher, wie sich eine nicht aktive Aufzeichnung von Änderungen auswirken würde. Ich habe derzeit einen Schalter zum Ein- und Ausschalten eines bestimmten Puffers, da es nicht sinnvoll ist, Informationen in einem wachsenden Protokoll oder einer aktualisierten Seite rückgängig zu machen. Die Änderungen beim Umschalten werden jedoch nicht berücksichtigt:
buffer-disable-rückgängig macht die Puffer-Rückgängig-Liste eigentlich nur auf Null . Wenn Sie den Status der Puffer-Rückgängig-Liste auf Ihrem Umschalter gespeichert haben, können Sie ihn möglicherweise später wiederherstellen?
quelle