Wie können Sie Änderungen nach dem Rückgängigmachen mit Emacs wiederholen?

268

In diesem Artikel heißt es: "Emacs hat eine Wiederholung, weil Sie beim Rückgängigmachen die Richtung umkehren können, wodurch das Rückgängigmachen rückgängig gemacht wird."

Was bedeutet das? Wie kann ein Benutzer mit Emacs "wiederholen"?

prosseek
quelle
3
Die Antwort unter der akzeptierten Antwort sagt Ihnen, wie , wenn Sie deshalb diese Antwort betrachten, und angesichts der Art und Weise, wie sie geschrieben ist, würde ich erwarten, dass die meisten Leute tatsächlich danach suchen.
Aaron Hall
Ich drücke einfach die Leertaste und mache danach das Leerzeichen rückgängig und mache das Rückgängigmachen rückgängig, bis es zu Ende ist, und gehe dann wieder zurück ... Ich weiß, dass es viel kompliziertere Wege gibt, aber das geht schnell und einfach, und so rolle ich.
Nroose

Antworten:

294

Kurzfassung: durch Rückgängigmachen des Rückgängigmachens. Wenn Sie rückgängig machen und dann einen nicht bearbeitenden Befehl ausführen, z. B. C-f, macht das nächste Rückgängigmachen das Rückgängigmachen rückgängig, was zu einem Wiederherstellen führt.

Längere Version:

Sie können sich das Rückgängigmachen als Vorgang für einen Stapel von Vorgängen vorstellen. Wenn Sie C-fnach einer Folge von Rückgängig-Vorgängen einen Befehl (auch einen Navigationsbefehl wie ) ausführen, werden alle Rückgängig-Vorgänge auf den Vorgangsstapel übertragen. Das nächste Rückgängigmachen macht also den letzten Befehl rückgängig. Angenommen, Sie haben eine Operationssequenz, die folgendermaßen aussieht:

  1. Fügen Sie "foo" ein
  2. "Leiste" einfügen
  3. Fügen Sie "Ich liebe Spam" ein.

Jetzt machst du rückgängig. Die letzte Aktion wird rückgängig gemacht, was zu der folgenden Liste führt:

  1. Fügen Sie "foo" ein
  2. "Leiste" einfügen

Wenn Sie an dieser Stelle etwas anderes als Rückgängig machen, sagen wir, C-fsieht der Operationsstapel folgendermaßen aus:

  1. Fügen Sie "foo" ein
  2. "Leiste" einfügen
  3. Fügen Sie "Ich liebe Spam" ein.
  4. Rückgängig machen "Ich liebe Spam"

Wenn Sie jetzt rückgängig machen, ist das erste, was rückgängig gemacht wird, das Rückgängigmachen. Ergebnis in Ihrem ursprünglichen Stapel (und Dokumentstatus):

  1. Fügen Sie "foo" ein
  2. "Leiste" einfügen
  3. Fügen Sie "Ich liebe Spam" ein.

Wenn Sie einen Änderungsbefehl ausführen, um die Rückgängig-Sequenz zu unterbrechen, wird dieser Befehl nach dem Rückgängigmachen hinzugefügt und ist daher das erste, was danach rückgängig gemacht wird. Angenommen, Sie haben einen Abstand zwischen "Balken", anstatt zu schlagen C-f. Dann hättest du gehabt

  1. Fügen Sie "foo" ein
  2. "Leiste" einfügen
  3. Fügen Sie "Ich liebe Spam" ein.
  4. Rückgängig machen "Ich liebe Spam"
  5. "Balken" löschen

Dieses Hinzufügen / erneute Hinzufügen erfolgt ad infinitum. Es ist etwas gewöhnungsbedürftig, aber es gibt Emacs wirklich einen hochflexiblen und leistungsstarken Rückgängig- / Wiederherstellungsmechanismus.

Michael Ekstrand
quelle
117
Nur für den Fall, dass dies ärgerlich klingt, besteht der Hauptvorteil darin, dass Sie jederzeit einen vorherigen Zustand wiederherstellen können. In den meisten Editoren führt das Rückgängigmachen mehrerer Änderungen und das versehentliche Eingeben eines Zeichens dazu, dass Sie nicht mehr in der Lage sind, das, was Sie rückgängig gemacht haben, zu wiederholen. Emacs macht das trivial.
Phils
3
Ich nehme an, wenn eine Person es in Ihrer Konstruktion auf Papier machen wollte, würden Sie zwei Stapel benötigen. Zum Beispiel an dem Punkt, an dem Sie geschrieben haben: "Jetzt machen Sie rückgängig. Es macht die letzte Aktion rückgängig, was zu folgendem führt." list: "Sie haben (verständlicherweise) das Rückgängigmachen nicht angezeigt, und wenn er viele Rückgängigmachungen durchgeführt hätte, würden Sie sie nicht anzeigen, bis etwas getan wurde, um die Rückgängig-Sequenz zu unterbrechen, dann würden Sie sie hinzufügen. Eine andere Möglichkeit, dies anzuzeigen, besteht darin, eine Liste zu haben und der Liste Undos hinzuzufügen, noch bevor sie beschädigt sind. Beachten Sie jedoch, wo sich der Cursor in der Liste befindet, damit wir wissen, wo die Undos rückwärts funktionieren
barlop
24
Es klingt nervig.
Felipe
13
Ich weiß nicht , warum diese Antwort akzeptiert wurde , wenn es nicht einmal Ihnen nicht sagen , WIE .
Aaron Hall
8
Leider sagt diese Antwort nichts über den Wiederherstellungsbefehl aus, der Cg C- / lautet.
Vishnuprasanth
211

Rückgängig machen: C-_

So wiederholen Sie nach dem Rückgängigmachen: C-g C-_

Geben Sie mehrmals ein C-_ , um das zu wiederholen, was durch rückgängig gemacht wurde. C-_ Um einen emacs-Befehl mehrmals zu wiederholen , führen Sie Ihren Befehl aus, geben Sie ihn ein C-xzund geben Sie dann mehrmals die zTaste ein, um den Befehl zu wiederholen (interessant, wenn Sie ein Makro mehrmals ausführen möchten).

Jérôme Radix
quelle
4
Zum Wiederholen von Dingen können Sie C-uzum Beispiel auch verwenden C-u 8 *(fügt acht * ein, wo sich das Caret befindet). Sie können also x Schritte C-u x C-_rückgängig machen .
Patrick
10
Dies hat nichts mit der ursprünglichen Frage zu tun, aber direkt nach dem Ausführen eines Tastaturmakros (mit C-x e) können Sie einfach eso oft drücken, wie Sie es erneut ausführen müssen.
Christian Berg
7
Auch C-/und C-x usind alternative Rückgängigmachen von Schlüsselbindungen, äquivalent zu C-_. Ich bevorzuge, C-/da es leichter zu schlagen ist.
Rory O'Kane
8
Warnung: Wenn diese Antwort besagt, dass C-g C-_"nach einem Rückgängigmachen wiederholt" wird, gilt dies nur, wenn Sie die Kombination zum ersten Mal treffen. Wiederholen Sie danach Ihren Rückgängig-Schlüssel ohne C-g. Geben Sie also dreimal nach dem Rückgängigmachen dreimal ein C-g C-_ C-_ C-_. Wenn Sie tippen C-g C-_ C-g C-_ C-g C-_, werden Sie nur im Kreis herumlaufen und Ihre Wiederholung rückgängig machen ...
Rory O'Kane
@ RoryO'Kane Ich weiß nicht viel über Emacs, also korrigiere mich bitte, wo ich falsch liege, aber da Cg C-_ nach einem Wiederherstellen keine Wirkung hat, könnte es sein, dass es nur danach funktioniert ein Rückgängigmachen (wie Ihre Beschreibung "Wiederholen nach einem Rückgängigmachen" nahelegt. Es geht also nicht so sehr darum, dass es im Kreis läuft, um ein Rückgängigmachen oder ein Wiederherstellen usw. zu wiederholen. Es macht nichts, weil ein Rückgängigmachen nicht nur vorher durchgeführt wurde. Also Cg C- _ Cg C-_ geht nicht in einem Kreis nach dem ersten, es tut buchstäblich nichts.
Barlop
56
  • Um rückgängig machen einmal:C-/
  • Zweimal rückgängig machen: C-/ C-/
  • Um Redo einmal unmittelbar nach dem Verhängnis:C-g C-/
  • Zweimal wiederholen, unmittelbar nach dem Rückgängigmachen : C-g C-/ C-/. Beachten Sie, dass dies C-gnicht wiederholt wird.
  • Um rückgängig machen sofort wieder , sobald:C-g C-/
  • Zweimal sofort wieder rückgängig machen: C-g C-/ C-/
  • Um es noch einmal zu wiederholen , das gleiche…

Wenn Sie seit Ihrem letzten Rückgängig-Befehl eine beliebige Taste gedrückt haben (ob Sie Zeichen eingeben oder nur den Cursor bewegen), müssen Sie C-gvor dem nächsten Rückgängigmachen / Wiederherstellen keine Eingabe vornehmen. C-gist nur eine sichere Taste zum Drücken, die nichts für sich tut, sondern als Nicht-Rückgängig-Taste zählt, um das Ende Ihrer Rückgängig-Sequenz zu signalisieren. Drücken Sie einen anderen Befehl, der C-fauch funktionieren würde. Es ist nur so, dass es den Cursor von der Stelle bewegt, an der Sie ihn hatten.

Wenn Sie einen C-ganderen Befehl drücken, als Sie es nicht wollten, und jetzt in die falsche Richtung C-grückgängig machen, drücken Sie einfach , um Ihre Richtung erneut umzukehren. Sie müssen Ihre versehentlichen Wiederherstellungen und Rückgängigmachungen vollständig rückgängig machen, bevor Sie zu den gewünschten Rückgängigmachungen gelangen. Wenn Sie jedoch weiter schlagen C-/, erreichen Sie schließlich den gewünschten Status. Tatsächlich ist jeder Zustand, in dem sich der Puffer jemals befand, erreichbar, wenn Sie C-geinmal drücken und dann C-/genügend oft drücken .

Alternative Verknüpfungen für undoandere als C-/sind C-_, C-x uund M-x undo.

Weitere Informationen zum Rückgängig-System von Emacs finden Sie unter Rückgängig im Emacs-Handbuch.

Rory O'Kane
quelle
38

Für diejenigen, die die allgemeinere Funktion zum Rückgängigmachen / Wiederherstellen verwenden möchten, hat jemand geschrieben undo-tree.el. Es bietet das Erscheinungsbild von Nicht-Emacs-Rückgängigmachungen, bietet jedoch Zugriff auf den gesamten "Baum" der Rückgängig-Geschichte.

Ich mag das in Emacs integrierte Rückgängig-System, finde dieses Paket jedoch sehr intuitiv.

Hier ist der Kommentar aus der Datei selbst:

Emacs verfügt über ein leistungsstarkes Rückgängig-System. Im Gegensatz zum Standard-Rückgängig / Wiederherstellen-System in den meisten Programmen können Sie damit jeden früheren Status eines Puffers wiederherstellen (während das Standard-Rückgängig / Wiederherstellen-System frühere Zustände verlieren kann, sobald Sie das Wiederherstellen durchführen). Diese Leistung hat jedoch ihren Preis: Viele Leute finden das Rückgängig-System von Emacs verwirrend und schwierig zu bedienen, und es entstehen eine Reihe von Paketen, die es durch das weniger leistungsstarke, aber intuitivere Rückgängig- / Wiederherstellungssystem ersetzen.

Sowohl der Datenverlust beim Standard-Rückgängigmachen / Wiederherstellen als auch die Verwirrung beim Rückgängigmachen von Emacs resultieren aus dem Versuch, den Rückgängig-Verlauf als lineare Folge von Änderungen zu behandeln. Es ist nicht. Der in diesem Paket bereitgestellte Undo-Tree-Modus ersetzt das Undo-System von Emacs durch ein System, das den Undo-Verlauf als das behandelt, was er ist: einen verzweigten Baum von Änderungen. Diese einfache Idee ermöglicht es, das intuitivere Verhalten des Standard-Rückgängig- / Wiederherstellungssystems mit der Fähigkeit zu kombinieren, niemals einen Verlauf zu verlieren. Ein zusätzlicher Nebeneffekt ist, dass der Rückgängig-Verlauf in einigen Fällen effizienter gespeichert werden kann, sodass sich mehr Änderungen ansammeln können, bevor Emacs den Verlauf verwirft.

Trey Jackson
quelle
3
Fantastisch! Wer hat gesagt, dass Emacs Undo unergründlich ist? :-)
Peter.O
Tolle! konzeptionell solide und benutzerintuitiv. Dies sollte in den Standardpaketen sein. Ein Kommentar: Ich wünschte, eine Warnmeldung würde auch beim Wiederherstellen von einem Verzweigungspunkt angezeigt, nicht nur beim Zurücksetzen. Wenn der Benutzer beispielsweise ein Wiederherstellen aufruft: "Wiederherstellen von einem Verzweigungspunkt" oder "Standard-Wiederherstellungszweig verwendet" - nur um den Benutzer darauf aufmerksam zu machen, dass mehr als ein Zweig vorhanden ist.
Basel Shishani
1
Ein anderer Ansatz für dieses Problem, der viel einfacher zu implementieren ist und keinen Visualizer erfordert, besteht darin, NUR den letzten Verzweigungspunkt beizubehalten und drei Befehle bereitzustellen: Rückgängig machen, Wiederherstellen, Verzweigen wechseln. Rückgängig / Wiederherstellen alarmiert, wenn DER Zweig getroffen wird, und Schalter-Zweig wechselt nur, wenn in einem Zweig nur eine Meldung "Nicht in einem Zweig" ausgegeben wird. Wenn zu irgendeinem Zeitpunkt eine Verzweigung auftritt, geht der vorherige Verzweigungspunkt verloren. Dies würde das Problem des Zustandsverlusts ziemlich gut und bei minimaler Komplexität lösen.
Basel Shishani
1
Beachten Sie, dass dies ein langjähriger Fehler beim Wiederherstellen ist, der zufällig fehlschlagen kann: github.com/syl20bnr/spacemacs/issues/9903 - bekannt seit 2014
ideasman42
@ ideasman42 Anscheinend ist dies ein "Non-Bug": dr-qubit.org/Lost_undo-tree_history.html
Dalker
19

Hüten Sie sich vor einer Undo-Tree- Eigenart zum Wiederherstellen !

Viele beliebte „Starter-Kits“ (Vorspiel, Purcell, Spacemacs) werden mit Undo-Tree geliefert. Die meisten (alle?) Aktivieren es sogar automatisch. Wie bereits erwähnt, ist der Undo-Baum eine praktische Möglichkeit, den Undo / Redo-Baum zu visualisieren und zu durchlaufen. Prelude gibt ihm sogar einen Key-Akkord ( uu) und auch C-x u.

Das Problem ist: Undo-Tree scheint Emacs 'Standardbindung und bekannte Bindung für Redo zu zerstören :C-g C-/ .

Stattdessen können Sie diese symmetrischen Tasten zum Rückgängigmachen / Wiederherstellen verwenden :

C-/     undo
C-S-/   redo

Diese sind nützlich, da Sie manchmal schnell wiederholen möchten, ohne den Visualizer zu öffnen.

Micah Elliott
quelle
Dies. Ich benutze Spacemacs und konnte nicht herausfinden, warum es bei mir nicht funktioniert hat. Vielen Dank!
mghaoui
11

Ich finde es redo.eläußerst praktisch , "normales" Rückgängigmachen / Wiederherstellen durchzuführen, und ich binde es normalerweise an CSz und rückgängig machen an Cz, wie folgt:

(when (require 'redo nil 'noerror)
    (global-set-key (kbd "C-S-z") 'redo))

(global-set-key (kbd "C-z") 'undo)

Laden Sie einfach die Datei herunter, fügen Sie sie in Ihren Lisp-Pfad ein und fügen Sie die oben genannten Dateien in Ihren ein .emacs.

Monotux
quelle
Die Kommentare in der Kopfzeile von redo.el besagen, dass es für XEmacs gemacht ist. Gibt es Probleme bei der Verwendung in GNU Emacs und anderen verwandten Emacsen?
A. Levy
Ich hatte noch keine Probleme und benutze es seit mindestens 6 Monaten :)
Monotux
4
Von emacswiki.org/emacs/RedoMode : redo.el ist jedoch veraltet und zerstört häufig den Inhalt von "buffer", da sich das Verhalten von "primitive-rückgängig machen" seit Emacs 22 geringfügig von dem alten unterscheidet. RedoPlus ist eine Gabelung von redo.el und funktioniert korrekt in einer neueren Version von Emacs. Sie können RedoPlus hier erhalten: emacswiki.org/emacs/redo+.el
rofrol
2

Emacs 28 fügt einen Wiederherstellungsbefehl (aufgerufen undo-redo) hinzu.

Wenn Sie ein typischeres Rückgängigmachen / Wiederherstellen wünschen, können die folgenden Befehle verwendet werden.

(global-set-key (kbd "C-z") 'undo-only)
(global-set-key (kbd "C-S-z") 'undo-redo)
ideasman42
quelle
1

Wenn Sie den letzten Vorgang wiederholen möchten, gehen Sie wie folgt vor.

  1. ESC
  2. Mach ein weiteres Rückgängigmachen ( C + /)
Vineeshvs
quelle
0

Standardmäßig muss für das Wiederherstellen in Emacs Cg gedrückt und dann rückgängig gemacht werden.

Es ist jedoch möglich, das in Emacs integrierte Rückgängigmachen zu verwenden, um auch einen Wiederherstellungsbefehl zu implementieren.

Das Paket Undo-Fu verwendet die in Emacs integrierte Undo-Funktion, um sowohl Undo als auch Redo verfügbar zu machen.

ideasman42
quelle