2010-10-27 5 views
6

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

2

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.

  1. 'undo erstrecken sich in der Undo-Liste, eine macro-begin Marker und ein macro-end Element

  2. advise/ändern, um die Makro-Wiedergabe legen Sie die Markierungen am Anfang/Ende der Makro-Wiedergabe einen neuen Eintrag zu verstehen

  3. 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 Sie redo 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

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. –

+2

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 . –

Verwandte Themen