Wie kann ich eine UNVOLLSTÄNDIGE Tastaturmakroaufnahme fortsetzen?

10

Klassischer Anwendungsfall:

  1. Sie beginnen mit der Aufnahme eines Makros: C-x (
  2. Du machst ein paar Sachen, sagen wir mal hello.
  3. Sie führen einen Befehl aus, der einen Fehler auslöst, C-gz. B. (z. B. Sie führen versehentlich einen Fehler aus C-sund müssen diesen abbrechen C-g, jetzt ist Ihre Arbeit verloren).

Jetzt ist Ihre bisherige Aufnahme verloren.

Ich möchte dort weitermachen, wo ich aufgehört habe, bevor ich einen Befehl ausgeführt habe, der meine Aufnahme unterbrochen hat. Ich habe es angeschaut C-h f start-kbd-macro, aber es ist in C geschrieben, also kann ich es nicht optimieren. Ich habe auch nach einer Variablen wie gesucht current-kbd-macro, aber bisher keine gefunden.

Kann es wiederhergestellt werden?

Aktualisieren:

Ich konnte nicht herausfinden, warum C-u C-x (ich nicht arbeitete, aber ich habe festgestellt, dass ich damit getestet habe C-g.

Es stellt sich heraus, dass dies etwas C-gBesonderes ist - wenn Sie eine andere Art von Fehler auslösen, z

C-x ( M-: (signal 'quit nil) 

Dann stoppt dies die Aufnahme, last-kbd-macroenthält "M-: M-( signal 'quit nil"aber, aber mit

C-x ( C-g

Dies stoppt die Aufnahme und verwirft alles, was aufgezeichnet wurde. Als Cg-glücklicher Benutzer (wie mindestens zwei meiner Freunde) ist dies eine ziemlich unglückliche Unterscheidung. Ich habe versucht zu bearbeiten keyboard-quit, aber ich kann dort nichts tun.

Es sieht so aus, als ob die einzige Möglichkeit, dies wiederherzustellen, darin besteht, recent-keysautomatisch herauszufinden, wo ein Start-KBD-Makro (oder ähnliches) aufgerufen wurde, wie in kmacro-edit-lossage.

Christopher Done
quelle

Antworten:

8

Ich begann hier eine Implementierung , die können Sie Ihre neu binden C-x (zu resmacro-start-macro.

Angenommen, Sie haben die Hälfte eines Makros hinter sich und machen einen Fehler und treffen C-g, z. B. Sie laufen C-sversehentlich und treffen C-g, um es abzubrechen, oder w / e.

C-x ( hello C-s C-g 

Führen Sie nun aus, C-u C-x (was im Minibuffer auffordert mit:

Makro fortsetzen mit (RET: Weiter, DEL: Letzte entfernen): h e l l o C-s

Sie drücken also die Rücktaste ( DEL), um das zu löschen C-sund dann RETfortzufahren. Jetzt heißt es:

Anhängen an kbd Makro ...

Und du kannst weitermachen.

Insgesamt:

C-x (      -- start macro
hello
C-s        -- mistake
C-g        -- cancel mistake (and macro)
C-u C-x (  -- recover lost macro
DEL        -- remove mistake
RET        -- continue recording
world!

Praktisch, kein Kontextwechsel, minimale Tastenkombinationen, um die Aufgabe zu erfüllen, findet automatisch heraus, wo Ihr Makro gestartet ist (um C-x () (recent-keys).

Christopher Done
quelle
1
Hey, das hört sich wirklich gut an. Möchten Sie es als Patch an Emacs senden?
Stefan
Sie können dies gerne tun / neu lizenzieren, wie Sie möchten! Ich werde es eine Weile vor Ort testen, bevor ich es irgendwo ankündige, damit ich weiß, dass es zuverlässig ist. Die Emacs-Betreuer könnten jedoch denken, dass es zu hackig ist. ;-)
Christopher Done
Um es in Emacs aufzunehmen, muss der Autor die urheberrechtlichen Unterlagen unterschreiben (die gleichen Unterlagen würden natürlich auch den Gott-Modus abdecken).
Stefan
Die Verbindung ist jetzt unterbrochen :(
DirtY iCE
2

Execute kmacro-start-macro-or-insert-countermit Prefix ( C-u) zum vorhergehenden Makroanzuhängen.

Artagnon
quelle
2
Die Dokumentzeichenfolge sagt dies nicht aus, aber ein doppeltes Präfix arg ( C-u C-u) setzt sowohl das APPENDals auch die NO-EXECArgumente auf start-kbd-macro, sodass Sie ohne die anfängliche Wiedergabe des Makros bis jetzt anhängen können . Dieses Verhalten ist jedoch im Handbuch dokumentiert:(emacs) Basic Keyboard Macro
Phils
Versuchen Sie dies mit dem Beispiel in meiner Frage, funktioniert nicht.
Christopher Done
2

Die Kombination der guten Antworten von stsquad und artagnon ergibt (meiner Meinung nach) eine Gesamtlösung für das Problem, die völlig vernünftig ist:

  • C-xC-keC-hl um ein aus dem Verlust erzeugtes Makro zu bearbeiten
  • Bearbeiten Sie das Makro, um es auf die ursprüngliche Aufnahme zu reduzieren
  • C-cC-c um das bearbeitete Makro zu speichern
  • Entweder, C-u<f3>um zuerst dieses Makro wiederzugeben, und dann, um nachfolgende Tastenanschläge aufzuzeichnen, die an die Makrodefinition angehängt werden
  • ... oder C-uC-u<f3>um die Aufnahme ohne die erste Wiedergabe des Makros fortzusetzen .

Möglicherweise ist die Notwendigkeit, den Verlust als Makro zu bearbeiten, nicht ideal , aber (a) Sie mussten das Makro unabhängig davon bearbeiten, unabhängig davon, ob Sie die Aufnahme abgebrochen haben, und (b) dies sollte nicht sehr oft vorkommen. Wenn Sie sich nur daran erinnern, wie Sie das Makro normal stoppen können (z. B. mit <f4>statt C-g).

Nichts davon bedeutet, dass es nicht nützlich wäre, wenn das abgebrochene Makro irgendwo gespeichert würde. Es ist nur so, dass ich nicht glaube, dass dies tatsächlich passiert. Es wäre wahrscheinlich wert M-x report-emacs-bug, diese Funktion vorzuschlagen.

Phils
quelle
Dies behebt das Problem nicht. Mit Ihrer Lösung ist es in der Hälfte der Fälle einfacher, das Makro erneut zu starten. Ich habe an anderer Stelle eine Antwort gepostet, die das Problem gut löst.
Christopher Done
1
Sicher, für einfache Fälle wäre es einfacher, von vorne zu beginnen. Für den Rest ist es jedoch immer noch nützlich, was bedeutet, dass einige Leute es hilfreich finden werden. zumal es standardmäßig verfügbar ist. Wie ich bereits angedeutet habe, ist die Idee eines stärker automatisierten Ansatzes meiner Meinung nach gut. Ich freue mich, dass Sie an einer Lösung arbeiten, und habe Ihre Antwort mit Sicherheit positiv bewertet.
Phils
0

Die kanonische Lösung ist C-x C-k C-e( kmacro-edit-macro), mit der Sie jeden Tastendruck durchlaufen und alles einfügen / löschen können, was Sie möchten. Die Befehlssyntax für den Editor ist etwas knapp, ?zeigt jedoch eine Anleitung an. Es gibt einen natürlicheren Editor, der an C-x C-k e( edit-kbd-macro) gebunden ist und einen Nur-Text-Makro-Editor mit Kommentaren liefert.

Eine andere Option ist, mit M-x insert-kbd-macroder Sie das Makro als Lisp bearbeiten können, aber es ist nicht die am besten lesbare Sache der Welt.

Was Variablen betrifft, suchen Sie nach last-kbd-macround kmacro-ring.

Wie Sie bereits erwähnt haben, haben Sie Ihr Makro noch nicht fertiggestellt. Sie können es einfach aus Ihrem Verlust erstellen. C-x C-k e C-h lund löschen Sie bis zu 300 vorhergehende Zeichen.

stsquad
quelle
Dies ist eine schlechte Antwort, die ich ablehnen würde, wenn ich könnte. Sie haben die Frage entweder nicht gelesen oder ignorieren sie. Weder enthalten last-kbd-macronoch kmacro-ringenthalten die zuvor gedrückten Tasten C-goder ein Fehler ist aufgetreten. Ich habe INCOMPLETE in meinem Titel ausdrücklich in Großbuchstaben gesetzt, um solche schlechten Antworten zu erwarten. Vielen Dank, dass Sie versucht haben zu helfen.
Christopher Done
1
@ChristopherDone: Sicher können Sie - ich habe unten eine Notiz hinzugefügt, um den Verlust zu erwähnen. Sie können ein Makro aus bis zu 300 Ihrer zuvor eingegebenen Zeichen erstellen.
stsquad
Ja, jemand hat einen Verlust bei #emacs erwähnt. Ich möchte nur dort weitermachen, wo ich aufgehört habe. Ich möchte nicht den Editor öffnen und anfangen müssen, Dinge daraus zu löschen, wenn ich gerade dabei bin, etwas zu tun.
Christopher Done
2
Die Kombination dieser und Antworten der Artagnan geben eine feine Lösung: C-x C-k e C-h l, bearbeiten C-c C-c, dann C-u f3auf die Aufnahme zu tragen ( unter Hinweis darauf , dass das letzte f3wird zunächst spielen die Makro so weit vor Erwartung weiterer Eingang). Möglicherweise ist die Notwendigkeit, den Verlust als Makro zu bearbeiten, nicht ideal , aber (a) Sie mussten das Makro unabhängig davon bearbeiten, unabhängig davon, ob Sie die Aufnahme abgebrochen haben, und (b) dies sollte nicht sehr oft vorkommen. Wenn Sie sich nur daran erinnern, wie Sie das Makro normal stoppen können.
Phils
1
@phils +1 Vielleicht solltest du das in eine separate Antwort verwandeln.
Itsjeyd