Comment reprendre un enregistrement de macro clavier INCOMPLETE?

10

Cas d'utilisation classique:

  1. Vous commencez à enregistrer une macro: C-x (
  2. Vous faites des trucs, disons hello.
  3. Vous exécutez une commande qui génère une erreur, disons C-g(par exemple, vous exécutez par erreur C-set vous devez l'annuler avec C-g, maintenant votre travail est perdu).

Jusqu'à présent, votre enregistrement est perdu.

Je voudrais reprendre là où je m'étais arrêté avant d'exécuter une commande qui a interrompu mon enregistrement. J'ai regardé C-h f start-kbd-macro, mais c'est écrit en C, donc je ne peux pas le modifier. J'ai également cherché une variable comme current-kbd-macro, mais je n'en ai pas trouvé jusqu'à présent.

Peut-il être récupéré?

Mettre à jour:

Je ne pouvais pas comprendre pourquoi C-u C-x (ne fonctionnait pas pour moi, mais j'ai découvert que c'était parce que je testais avec C-g.

Il s'avère que C-gc'est spécial - si vous déclenchez un autre type d'erreur, par exemple

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

Ensuite, cela arrêtera l'enregistrement, mais last-kbd-macrocontiendra "M-: M-( signal 'quit nil", mais avec

C-x ( C-g

Cela arrête l'enregistrement et supprime tout ce qui a été enregistré. En tant qu'utilisateur Cg-happy (comme au moins deux de mes amis), c'est une distinction plutôt malheureuse. J'ai essayé le montage keyboard-quit, mais je ne peux rien y faire.

Il semble que la seule façon de récupérer cela est via recent-keyset de déterminer automatiquement où une macro start-kbd (ou similaire) a été appelée, comme dans kmacro-edit-lossage.

Christopher Done
la source

Réponses:

8

J'ai commencé une implémentation ici qui vous permet de REBIND votre C-x (à resmacro-start-macro.

Supposons maintenant que vous arrivez à mi-chemin d'une macro et que vous faites une erreur et que vous frappiez C-g, par exemple, vous exécutez C-spar erreur et que vous frappiez C-gpour l'annuler, ou w / e.

C-x ( hello C-s C-g 

Maintenant, lancez C-u C-x (ce qui vous demandera dans le mini-tampon avec:

Reprendre la macro avec (RET: continuer, DEL: supprimer en dernier): h e l l o C-s

Donc, vous appuyez sur backspace ( DEL) pour supprimer le C-spuis RETpour continuer. Maintenant, il dit:

Ajout à la macro kbd ...

Et vous pouvez continuer.

Au 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!

Pratique, pas de changement de contexte, raccourcis clavier minimum pour réaliser la tâche, détermine automatiquement d'où votre macro a commencé (à C-x () (recent-keys).

Christopher Done
la source
1
Hé, ça a l'air vraiment sympa. Vous souhaitez l'envoyer sous forme de patch à Emacs?
Stefan
Vous êtes invités à le faire / à redistribuer à votre guise! Je vais l'essayer localement pendant un certain temps avant de l'annoncer n'importe où, afin que je sache qu'il est fiable. Les responsables d'Emacs pourraient penser que c'est trop hacky, cependant. ;-)
Christopher Done
Pour l'inclure dans Emacs, nous avons besoin que l'auteur signe les documents du droit d'auteur (les mêmes documents couvriraient également le mode divin, bien sûr).
Stefan
Le lien est rompu maintenant :(
DirtY iCE
2

Exécutez kmacro-start-macro-or-insert-counteravec prefix ( C-u) pour ajouter à la macro précédente.

artagnon
la source
2
La docstring ne le dit pas, mais un double préfixe arg ( C-u C-u) définit à la fois les arguments APPENDet , ce qui vous permet d'ajouter sans la relecture initiale de la macro jusqu'à présent. Ce comportement est cependant documenté dans le manuel:NO-EXECstart-kbd-macro(emacs) Basic Keyboard Macro
phils
Essayez ceci avec l'exemple dans ma question, ne fonctionne pas.
Christopher Fait
2

La combinaison des bonnes réponses de stsquad et artagnon donne (à mon avis) une solution totale au problème qui est tout à fait raisonnable:

  • C-xC-keC-hl modifier une macro générée à partir de la perte
  • éditez la macro, pour la réduire à l'enregistrement original
  • C-cC-c pour stocker la macro modifiée
  • Soit C-u<f3>pour rejouer d'abord cette macro, puis continuer d'enregistrer les frappes suivantes qui seront ajoutées à la définition de la macro
  • ... ou C-uC-u<f3>pour continuer l'enregistrement sans la relecture initiale de la macro jusqu'à présent.

Peut-être que la nécessité de modifier la perte en tant que macro n'est pas idéale , mais (a) vous deviez nécessairement modifier la macro, si vous aviez interrompu l'enregistrement, et (b) cela ne devrait pas se produire très souvent, si vous vous souvenez juste comment arrêter la macro normalement (par exemple avec <f4>plutôt que C-g).

Rien de tout cela ne veut dire qu'il ne serait pas utile si la macro abandonnée était stockée quelque part; c'est juste que je ne pense pas que cela se produise réellement. Il vaudrait probablement la peine M-x report-emacs-bugde suggérer cette fonctionnalité.

phils
la source
Cela ne résout pas le problème. Avec votre solution la moitié du temps, il serait plus facile de simplement recommencer la macro. J'ai posté une réponse ailleurs qui résout bien le problème.
Christopher Fait
1
Bien sûr, pour les cas simples, recommencer serait plus facile. Il est toujours utile pour le reste, cependant, ce qui signifie que certaines personnes le trouveront utile; d'autant plus qu'il est disponible par défaut. Comme je l'ai indiqué, je pense que l'idée d'une approche plus automatisée est bonne, alors je suis heureux de vous voir travailler sur une solution et j'ai certainement voté pour votre réponse.
phils
0

La solution canonique est C-x C-k C-e( kmacro-edit-macro) qui vous permettra de parcourir chaque pression de touche et d'insérer / supprimer ce que vous voulez. La syntaxe de commande pour l'éditeur est un peu laconique mais ?fera apparaître un guide. Il existe un éditeur plus naturel lié à C-x C-k e( edit-kbd-macro) qui donne un éditeur de macro de texte brut avec des commentaires.

Une autre option est celle M-x insert-kbd-macroqui vous permettra d'éditer la macro en Lisp mais ce n'est pas la chose la plus lisible au monde.

En ce qui concerne les variables que vous recherchez last-kbd-macroet kmacro-ring.

Comme vous mentionnez que vous n'avez pas terminé votre macro, vous pouvez simplement la créer à partir de votre perte. C-x C-k e C-h let supprimez jusqu'à 300 caractères précédents.

stsquad
la source
C'est une mauvaise réponse que je voterais si je pouvais. Soit vous n'avez pas lu la question, soit vous l'ignorez. Ni contenir last-kbd-macroni kmacro-ringappuyer sur les touches avant C-gou une erreur s'est produite. Je mets spécifiquement INCOMPLETE en majuscules dans mon titre en anticipant ces mauvaises réponses. Merci d'avoir essayé d'aider, cependant.
Christopher Done
1
@ChristopherDone: bien sûr que vous pouvez - j'ai ajouté une note en bas pour mentionner la perte. Vous pouvez créer une macro contenant jusqu'à 300 de vos caractères précédemment saisis.
stsquad
Oui, quelqu'un a mentionné la perte sur #emacs. Je veux juste reprendre là où je m'étais arrêté. Je ne veux pas avoir à ouvrir l'éditeur et commencer à supprimer des choses lorsque je suis en train de faire quelque chose.
Christopher Done
2
La combinaison de ces réponses et de donner Artagnon une solution fine: C-x C-k e C-h l, modifier, C-c C-cpuis C-u f3de procéder à l' enregistrement ( en notant que ce dernier f3va d' abord jouer la macro-ainsi-bien avant l' attente d'autres commentaires ). Peut-être que la nécessité de modifier la perte en tant que macro n'est pas idéale , mais (a) vous deviez nécessairement modifier la macro, si vous aviez interrompu l'enregistrement, et (b) cela ne devrait pas se produire très souvent, si vous vous souvenez juste comment arrêter la macro normalement.
phils
1
@phils +1 Vous devriez peut-être transformer cela en une réponse distincte.
itsjeyd