Como retomar uma gravação de macro do teclado INCOMPLETA?

10

Caso de uso clássico:

  1. Você começa a gravar uma macro: C-x (
  2. Você faz algumas coisas, digamos hello.
  3. Você executa um comando que gera um erro, digamos C-g(por exemplo, você executa por engano C-se precisa cancelar isso C-gagora, 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-macroconterá "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-keyse descobrir automaticamente onde uma macro start-kbd-macro (ou similar) foi chamada, como em kmacro-edit-lossage.

Christopher Done
fonte

Respostas:

8

Eu iniciei uma implementação aqui que permite que você volte C-x (ao seu resmacro-start-macro.

Agora, suponha que você chegue no meio da macro e cometa um erro e acerte C-g, por exemplo, você corre C-spor engano e pressiona C-gpara cancelá-la, ou não.

C-x ( hello C-s C-g 

Agora execute o C-u C-x (que solicitará no minibuffer com:

Retomar a macro com (RET: continue, DEL: remova por último): h e l l o C-s

Então você pressiona backspace ( DEL) para excluir C-se RETprosseguir. Agora diz:

Anexando à macro kbd ...

E você pode continuar.

No total:

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!

Conveniente, sem alternância de contexto, atalhos mínimos para realizar tarefas, descobre automaticamente de onde sua macro começou (às C-x () (recent-keys).

Christopher Done
fonte
11
Ei, isso parece muito bom. Gostaria de enviá-lo como um patch para o Emacs?
Stefan
Você pode fazê-lo / relicente como quiser! Vou testá-lo por um tempo localmente antes de anunciar em qualquer lugar, para que eu saiba que é confiável. Os mantenedores do Emacs podem pensar que é muito hacky, no entanto. ;-)
Christopher Done
Para incluí-lo no Emacs, precisamos que o autor assine a documentação de direitos autorais (a mesma documentação também cobriria o modo de Deus, é claro).
7288 Stefan
O link está quebrado agora :(
DirtY iCE
2

Execute kmacro-start-macro-or-insert-countercom prefixo ( C-u) para anexar à macro anterior.

artagnon
fonte
2
O docstring não dizê-lo, mas um prefixo arg double ( C-u C-u) define tanto o APPENDe NO-EXECargumentos para start-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
phils 7/11
Tente isso com o exemplo da minha pergunta, não funciona.
Christopher Feito
2

Combinar as boas respostas de stsquad e artagnon fornece (em minha opinião) uma solução total para o problema que é inteiramente razoável:

  • C-xC-keC-hl para editar uma macro gerada a partir da perda
  • editar a macro, para reduzi-la à gravação original
  • C-cC-c para armazenar a macro editada
  • Ou C-u<f3>para, em primeiro lugar repetir essa macro, e em seguida, continuar a gravar teclas digitadas subseqüentes que serão acrescentados à definição de macro
  • ... ou C-uC-u<f3>para continuar a gravação sem a reprodução inicial da macro até agora.

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-buga pena sugerir esse recurso.

phils
fonte
Isso não resolve o problema. Com a sua solução na metade do tempo, seria mais fácil iniciar a macro novamente. Eu publiquei uma resposta em outro lugar que resolve o problema muito bem.
Christopher Feito
11
Claro, para casos simples, recomeçar seria mais fácil. No entanto, ainda é útil para o restante, o que significa que algumas pessoas acharão útil; especialmente porque está disponível por padrão. Como indiquei, acho que a idéia de uma abordagem mais automatizada é boa, por isso estou feliz em vê-lo trabalhando em uma solução e certamente votei sua resposta.
Phs #
0

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-macroque 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-macroe kmacro-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.

stsquad
fonte
Esta é uma resposta ruim que eu poderia votar se pudesse. Você não leu a pergunta ou a está ignorando. Nem last-kbd-macronem kmacro-ringconter as teclas pressionadas antes C-gou um erro aconteceu. Eu especificamente coloquei INCOMPLETA em maiúsculas no meu título, antecipando respostas tão ruins. Obrigado por tentar ajudar.
Christopher Done
11
@ChristopherDone: com certeza você pode - adicionei uma nota na parte inferior para mencionar a perda. Você pode criar uma macro de até 300 dos caracteres digitados anteriormente.
Stsquad
Sim, alguém mencionou perda no #emacs. Eu só quero retomar de onde parei. Eu não quero ter que abrir o editor e começar a excluir coisas disso quando estou no meio de fazer alguma coisa.
Christopher Done
2
A combinação dessas respostas e as respostas de artagnon fornece uma boa solução:, C-x C-k e C-h ledite C-c C-ce C-u f3continue 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.
Phs #
11
@phils +1 Talvez você deva transformar isso em uma resposta separada.
precisa saber é o seguinte