Cas d'utilisation classique:
- Vous commencez à enregistrer une macro:
C-x (
- Vous faites des trucs, disons
hello
. - Vous exécutez une commande qui génère une erreur, disons
C-g
(par exemple, vous exécutez par erreurC-s
et vous devez l'annuler avecC-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-g
c'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-macro
contiendra "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-keys
et de déterminer automatiquement où une macro start-kbd (ou similaire) a été appelée, comme dans kmacro-edit-lossage
.
la source
Exécutez
kmacro-start-macro-or-insert-counter
avec prefix (C-u
) pour ajouter à la macro précédente.la source
C-u C-u
) définit à la fois les argumentsAPPEND
et , 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-EXEC
start-kbd-macro
(emacs) Basic Keyboard Macro
La combinaison des bonnes réponses de stsquad et artagnon donne (à mon avis) une solution totale au problème qui est tout à fait raisonnable:
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-bug
de suggérer cette fonctionnalité.la source
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-macro
qui 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-macro
etkmacro-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.
la source
last-kbd-macro
nikmacro-ring
appuyer sur les touches avantC-g
ou 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.C-x C-k e C-h l
, modifier,C-c C-c
puisC-u f3
de procéder à l' enregistrement ( en notant que ce dernierf3
va 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.