In Emacs, manchmal rufe ich Call-last-kbd-Makro versehentlich. Beim Rückgängigmachen hätte ich erwartet, dass Rückgängig den gesamten Effekt des Tastaturmakros atomar rückgängig machen würde, aber das passiert nicht. Stattdessen muss ich jeden Schritt des Makros einzeln nacheinander rückgängig machen. Wie kann ich Emacs dazu bringen, vor der Ausführung des Makros in den Pufferzustand zurückzukehren?Wie Call-last-kbd-Makro in Emacs rückgängig machen
Antwort
Ich fürchte, Sie können das nicht nur mit dem eingebauten 'undo
Mechanismus tun. Das Makrosystem in Emacs spielt tatsächlich Dinge zurück, als ob der Benutzer tatsächlich die Tastenanschläge (oder Mausereignisse) eintippte, und so wird die undo history (buffer-undo-list
) wie üblich aktualisiert.
Hier ist ein Vorschlag, wie Sie den aktuellen undo
Mechanismus erweitern können, um das zu tun, was Sie wollen.
'undo
erstrecken sich in der Undo-Liste, einemacro-begin
Marker und einmacro-end
Elementadvise/ändern, um die Makro-Wiedergabe legen Sie die Markierungen am Anfang/Ende der Makro-Wiedergabe einen neuen Eintrag zu verstehen
haben die
undo
Code behandeln alle Ereignisse zwischen den beiden Markierungen als Einheit rückgängig machen und rückgängig machen sie alle (und die entsprechenden Markierungen am Ende der Geschichte so undo hinzufügen, wenn Sieredo
Dinge, sie sind immer noch behandelt als ein einzelner Block)
Caveats:
- Dies würde für Makros nur funktionieren, die in einem einzigen Puffer arbeiten, wenn Ihre Makro Puffer eingeschaltet (oder), in anderen Puffern hatten Nebenwirkungen, die Änderungen werden nicht als Block behandelt.
- Wenn Ihr Makro in einem anderen Puffer endete als es begann, dann müssten Sie damit sauber umgehen - Sie wollen nicht "unsymmetrisch"
macro-begin
und Marker in der Rückgängig-Liste.
Unnötig zu sagen, das ist ein kompliziertes Unterfangen. Ich wünsche Ihnen Glück.
- 1. Emacs: Bereinigen rückgängig machen-Baum
- 2. In Auswahl rückgängig machen?
- 3. Wie rückgängig machen bzr hinzufügen
- 4. Wie rückgängig machen "hg qnew"?
- 5. Wie rückgängig machen `hg pull`?
- 6. Wie Teer-Operation rückgängig machen?
- 7. Wie rückgängig machen hg init?
- 8. Wie rückgängig machen npm update?
- 9. Verzweigungserstellung in Mercurial rückgängig machen
- 10. In WPF-Bindungen rückgängig machen
- 11. Vim rückgängig machen: Änderungen nach dem Schreiben rückgängig machen
- 12. Wie rückgängig machen Sie "surroundContents" in Javascript?
- 13. Wie "rückgängig machen" Übersetzungsfunktion in jQuery
- 14. Wie rückgängig machen> 1 in Squeak
- 15. Änderungen in Salesforce rückgängig machen
- 16. .NET RichTextBox rückgängig machen
- 17. iCheck rückgängig machen überprüfen
- 18. Git Clean rückgängig machen
- 19. jQuery AJAX "Hilfsprogramm rückgängig machen"
- 20. Wie rückgängig machen einer Zusammenführung auf Bitbucket?
- 21. Wie rückgängig machen git stash löschen
- 22. Wie rückgängig machen Funktionalität zu HTML5 Canvas?
- 23. Dateiänderung während Rebase rückgängig machen
- 24. Wie implementiert man Funktionalität rückgängig machen?
- 25. Einen schlechten Pull rückgängig machen
- 26. Wie rückgängig machen Git Ablauf Feature Finish?
- 27. Wie rückgängig machen Sie die letzte Checkbox?
- 28. Mercurial: Wie rückgängig machen letzten ungespeicherten Commit?
- 29. Wie ohne Transaktion rückgängig zu machen
- 30. wie git add rückgängig zu machen, bevor
Danke Trey. In der Tat eine komplexe Antwort. Eine einfachere, aber mehr hackische Lösung im gleichen Sinne wäre es, Call-Last-Kbd-Macro (oder einen Wrapper) eine Art No-Op-Marker in die Undo-Liste einzufügen. Und dann erstellen Sie eine neue Funktion Clear-to-Macro-Marker, die alle Änderungen rückgängig machen würde, bis der Marker getroffen wurde. –
Entlang dieser Zeilen ist http://www.panix.com/~harley/elisp/undo-group.el, die einen Marker, nämlich zwei 'nil's, die es dann als Grenze für eine' undo-group' Befehl verwendet . –