Caso de uso clássico:
- Você começa a gravar uma macro:
C-x (
- Você faz algumas coisas, digamos
hello
. - Você executa um comando que gera um erro, digamos
C-g
(por exemplo, você executa por enganoC-s
e precisa cancelar issoC-g
agora, agora seu trabalho está perdido).
Agora sua gravação até agora está perdida.
Gostaria de retomar de onde parei antes de executar um comando que interrompeu minha gravação. Eu olhei C-h f start-kbd-macro
, mas está escrito em C, então não posso ajustá-lo. Eu também procurei por uma variável como current-kbd-macro
, mas não encontrei nenhuma até agora.
Pode ser recuperado?
Atualizar:
Eu não conseguia descobrir por que C-u C-x (
não estava funcionando para mim, mas descobri que é porque estava testando C-g
.
Acontece que C-g
é especial - se você disparar um tipo diferente de erro, por exemplo,
C-x ( M-: (signal 'quit nil)
Então isso interromperá a gravação, mas last-kbd-macro
conterá "M-: M-( signal 'quit nil"
, mas com
C-x ( C-g
Isso interrompe a gravação e descarta qualquer coisa gravada. Como um usuário que gosta de Cg (como são pelo menos dois de meus amigos), essa é uma distinção bastante infeliz. Eu tentei editar keyboard-quit
, mas não há nada que eu possa fazer lá.
Parece que a única maneira de recuperar isso é através de recent-keys
e descobrir automaticamente onde uma macro start-kbd-macro (ou similar) foi chamada, como em kmacro-edit-lossage
.
fonte
Execute
kmacro-start-macro-or-insert-counter
com prefixo (C-u
) para anexar à macro anterior.fonte
C-u C-u
) define tanto oAPPEND
eNO-EXEC
argumentos parastart-kbd-macro
, que permite anexar , sem a repetição inicial do macro tão longe. Esse comportamento está documentado no manual, no entanto:(emacs) Basic Keyboard Macro
Combinar as boas respostas de stsquad e artagnon fornece (em minha opinião) uma solução total para o problema que é inteiramente razoável:
Talvez a necessidade de editar a perda como macro não seja ideal , mas (a) você precisará editar a macro independentemente, se interromper a gravação e (b) isso não acontecer com muita frequência, se você se lembrar de como parar a macro normalmente (por exemplo, em <f4>vez de C-g).
Nada disso significa que não seria útil se a macro abortada fosse armazenada em algum lugar; é que não acho que isso realmente aconteça. Provavelmente valeria M-x
report-emacs-bug
a pena sugerir esse recurso.fonte
A solução canônica é C-x C-k C-e(
kmacro-edit-macro
) que permitirá que você percorra cada pressionamento de tecla e insira / exclua o que quiser. A sintaxe de comando para o editor é um pouco concisa, mas?
exibirá um guia. Existe um editor mais natural vinculado a C-x C-k e(edit-kbd-macro
) que fornece um editor de macro de texto sem formatação com comentários.Outra opção é a M-x
insert-kbd-macro
que permitirá editar a macro como Lisp, mas não é a coisa mais legível do mundo.No que diz respeito às variáveis, você está procurando
last-kbd-macro
ekmacro-ring
.Como você mencionou, você não concluiu sua macro, basta criá-la a partir de sua perda. C-x C-k e C-h le exclua até 300 caracteres anteriores.
fonte
last-kbd-macro
nemkmacro-ring
conter as teclas pressionadas antesC-g
ou um erro aconteceu. Eu especificamente coloquei INCOMPLETA em maiúsculas no meu título, antecipando respostas tão ruins. Obrigado por tentar ajudar.C-x C-k e C-h l
editeC-c C-c
eC-u f3
continue a gravação (observando que essa última reproduziráf3
primeiro a macro até agora antes de aguardar mais informações). Talvez a necessidade de editar a perda como macro não seja ideal , mas (a) você precisará editar a macro independentemente, se interromper a gravação, e (b) isso não acontecer com muita frequência, se você se lembrar de como parar a macro normalmente.