Come riprendere una registrazione macro della tastiera INCOMPLETA?


10

Caso d'uso classico:

  1. Inizi a registrare una macro: C-x (
  2. Fai delle cose, diciamo hello.
  3. Esegui un comando che genera un errore, diciamo C-g(ad esempio, esegui erroneamente C-se devi annullarlo con C-g, ora il tuo lavoro è perso).

Ora la tua registrazione finora è andata persa.

Vorrei riprendere da dove avevo interrotto prima di eseguire un comando che ha interrotto la mia registrazione. Ho guardato C-h f start-kbd-macro, ma è scritto in C, quindi non posso modificarlo. Ho anche cercato una variabile simile current-kbd-macro, ma finora non ne ho trovata nessuna.

Può essere recuperato?

Aggiornare:

Non riuscivo a capire perché C-u C-x (non funzionasse per me, ma ho scoperto che era perché stavo testando C-g.

Si scopre che C-gè speciale - se si attiva un diverso tipo di errore, ad es

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

Quindi questo interromperà la registrazione, ma last-kbd-macroconterrà "M-: M-( signal 'quit nil", ma con

C-x ( C-g

Questo interrompe la registrazione e scarta qualsiasi cosa registrata. Come utente soddisfatto di Cg (come lo sono almeno due dei miei amici), questa è una distinzione piuttosto sfortunata. Ho provato a modificare keyboard-quit, ma non c'è niente che io possa fare lì.

Sembra che l'unico modo per recuperarlo sia tramite recent-keyse automaticamente capire dove è stato chiamato start-kbd-macro (o simile), come in kmacro-edit-lossage.

Risposte:


8

Ho iniziato un'implementazione qui che ti permette di associare nuovamente il vostro C-x (a resmacro-start-macro.

Supponiamo ora di passare a metà di una macro e fare un errore e colpire C-g, ad esempio corri C-sper errore e quindi colpisci C-gper annullarlo, o w / e.

C-x ( hello C-s C-g 

Ora esegui ciò C-u C-x (che verrà richiesto nel minibuffer con:

Riprendi macro con (RET: continua, DEL: rimuovi ultima): h e l l o C-s

Quindi premi backspace ( DEL) per eliminare C-se poi RETper procedere. Ora dice:

In aggiunta alla macro kbd ...

E puoi continuare.

In totale:

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!

Comodo, nessun cambio di contesto, combinazioni minime di tasti per raggiungere il compito, capisce automaticamente da dove è iniziata (a C-x () la tua macro (recent-keys).


1
Ehi, sembra davvero carino. Vuoi inviarlo come patch per Emacs?
Stefan,

Sei il benvenuto / fallo come preferisci! Lo proverò per un po 'a livello locale prima di annunciarlo ovunque, in modo che io possa sapere che è affidabile. Tuttavia, i manutentori di Emacs potrebbero pensare che sia troppo confuso. ;-)
Christopher Fatto il

Per includerlo in Emacs abbiamo bisogno che l'autore firmi documenti di copyright (gli stessi documenti coprirebbero anche la modalità god, ovviamente).
Stefan,

Il collegamento è interrotto ora :(
DirtY iCE

2

Eseguire kmacro-start-macro-or-insert-countercon il prefisso ( C-u) per aggiungere alla macro precedente.


2
Il docstring non lo dice, ma un doppio prefisso arg ( C-u C-u) imposta sia l' argomento APPENDche l' NO-EXECargomento start-kbd-macro, che consente di aggiungere senza il replay iniziale del macro-finora. Questo comportamento è documentato nel manuale, tuttavia:(emacs) Basic Keyboard Macro
phils

Prova questo con l'esempio nella mia domanda, non funziona.
Christopher Fatto il

2

Combinare le buone risposte di stsquad e artagnon fornisce (a mio avviso) una soluzione totale al problema che è del tutto ragionevole:

  • C-xC-keC-hl per modificare una macro generata dalla perdita
  • modifica la macro per ridurla alla registrazione originale
  • C-cC-c per memorizzare la macro modificata
  • In C-u<f3>primo luogo riprodurre nuovamente quella macro e quindi continuare a registrare le sequenze di tasti successive che verranno aggiunte alla definizione della macro
  • ... o C-uC-u<f3>per continuare la registrazione senza il replay iniziale del macro finora.

Forse la necessità di modificare la perdita come macro non è l' ideale , ma (a) eri tenuto a modificare la macro indipendentemente, se hai interrotto la registrazione, e (b) ciò non dovrebbe accadere molto spesso, se ricordi semplicemente come arrestare normalmente la macro (ad es. con <f4>anziché anziché C-g).

Nessuno dei quali può dire che non sarebbe utile se la macro interrotta fosse memorizzata da qualche parte; è solo che non penso che ciò accada realmente. Probabilmente varrebbe la pena M-x report-emacs-bugsuggerire questa funzione.


Questo non risolve il problema. Con la tua soluzione metà del tempo, sarebbe più semplice riavviare la macro. Ho pubblicato una risposta altrove che risolve bene il problema.
Christopher Fatto il

1
Certo, per casi semplici ricominciare da capo sarebbe più facile. È comunque utile per il resto, il che significa che alcune persone lo troveranno utile; soprattutto perché è disponibile per impostazione predefinita. Come ho indicato, penso che l'idea di un approccio più automatizzato sia valida, quindi sono felice di vederti lavorare su una soluzione e di aver votato a favore della tua risposta.
phils,

0

La soluzione canonica è C-x C-k C-e( kmacro-edit-macro) che ti permetterà di scorrere ogni volta che premi un tasto e inserire / cancellare quello che vuoi. La sintassi del comando per l'editor è un po 'concisa, ma ?farà apparire una guida. C'è un editor più naturale associato a C-x C-k e( edit-kbd-macro) che fornisce un editor di macro di testo semplice con commenti.

Un'altra opzione è M-x insert-kbd-macroche ti permetterà di modificare la macro come Lisp ma non è la cosa più leggibile al mondo.

Per quanto riguarda le variabili che stai cercando last-kbd-macroe kmacro-ring.

Come hai detto che non hai completato la tua macro, puoi semplicemente crearla dalla tua perdita. C-x C-k e C-h led elimina fino a 300 caratteri precedenti.


Questa è una brutta risposta che vorrei sottovalutare se potessi. O non hai letto la domanda o la stai ignorando. Né last-kbd-macrokmacro-ringcontenere i tasti premuti prima C-go un errore è accaduto. In particolare, ho inserito INCOMPLETE in maiuscolo nel mio titolo, anticipando risposte così negative. Grazie per aver cercato di aiutare, comunque.
Christopher Fatto il

1
@ChristopherDone: certo che puoi - ho aggiunto una nota in basso per menzionare la perdita. Puoi creare una macro da un massimo di 300 dei tuoi caratteri precedentemente digitati.
stsquad,

Sì, qualcuno ha menzionato la perdita di #emacs. Voglio solo riprendere da dove avevo interrotto. Non voglio aprire l'editor e iniziare a cancellare le cose quando sono nel mezzo di fare qualcosa.
Christopher Fatto il

2
La combinazione di questo e di risposte di Artagnon danno una soluzione raffinata: C-x C-k e C-h l, modificare, C-c C-ce poi C-u f3per portare avanti la registrazione (notare che quell'ultimo f3sarà in primo luogo riprodurre la macro-così-lontano prima in attesa di ulteriori input). Forse la necessità di modificare la perdita come macro non è l' ideale , ma (a) eri tenuto a modificare la macro indipendentemente, se hai interrotto la registrazione, e (b) ciò non dovrebbe accadere molto spesso, se ti ricordi come fermare normalmente la macro.
phils,

1
@phils +1 Forse dovresti trasformarlo in una risposta separata.
È il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.