如何恢复不完整的键盘宏录制?


10

经典用例:

  1. 您开始记录宏: C-x (
  2. 假设您正在做一些事情hello
  3. 假设您运行了一个引发错误的命令C-g(例如,您错误地运行了该命令,C-s而您必须使用取消该操作C-g,那么您的工作将会丢失)。

现在,您到目前为止的录制已丢失。

我想恢复我中断的地方,然后再运行一条命令中断录音。我看着C-h f start-kbd-macro,但是它是用C编写的,所以我无法对其进行调整。我还current-kbd-macro搜寻了类似的变量,但到目前为止没有找到。

可以恢复吗?

更新:

我不知道为什么C-u C-x (对我不起作用,但是我发现这是因为我正在使用进行测试C-g

事实证明这C-g很特别-如果您触发其他类型的错误,例如

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

然后,这将停止录制,但last-kbd-macro将包含"M-: M-( signal 'quit nil",但带有

C-x ( C-g

这将停止记录并丢弃任何记录的内容。作为对Cg满意的用户(至少有两个我的朋友),这是一个非常不幸的区别。我尝试编辑keyboard-quit,但在那里我无能为力。

看来,恢复此错误的唯一方法是通过recent-keys并自动确定在何处调用了start-kbd-macro(或类似名称),如中所示kmacro-edit-lossage

Answers:


8

在这里开始了一个实现,可以让您重新绑定C-x (resmacro-start-macro

现在,假设您进入了宏的一半,并犯了一个错误并命中了C-g,例如,您C-s由于错误运行而被命中C-g以取消它,或w / e。

C-x ( hello C-s C-g 

现在运行C-u C-x (,它将在迷你缓冲区中提示:

使用(RET:继续,DEL:删除最后一个)恢复宏: h e l l o C-s

因此,您按Backspace(DEL)删除C-s,然后RET继续。现在它说:

正在附加到kbd宏...

您可以继续。

总共:

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!

方便,无上下文切换,完成任务所需的最小键数,可自动找出您的宏从(C-x ()开始的位置(recent-keys)


1
嘿,听起来真不错。打算将其作为补丁提交给Emacs吗?
Stefan 2014年

欢迎您随意这样做/许可!我打算先在本地试用一段时间,然后再在任何地方宣布它,以便我知道它的可靠性。但是,Emacs维护人员可能认为它太过分了。;-)
Christopher Done

为了将其包含在Emacs中,我们需要作者签署版权文件(当然,相同的文件也将覆盖上帝模式)。
Stefan 2014年

链接现在已断开:(
DirtY iCE

2

kmacro-start-macro-or-insert-counter使用前缀(C-u)执行以附加到上一个宏。


2
文档字符串都没有这么说,但双前缀ARG( C-u C-u)设置APPENDNO-EXEC参数start-kbd-macro,它可以让你添加,而不宏观那么远的初始重播。但是,此行为在手册中记录:(emacs) Basic Keyboard Macro
phils 2014年

用我的问题中的示例尝试此操作,不起作用。
Christopher Done 2014年

2

结合stsquad和artagnon的良好答案,(在我看来)可以完全解决该问题,这是完全合理的:

  • C-xC-keC-hl 编辑从损失生成的宏
  • 编辑宏,以将其还原为原始记录
  • C-cC-c 存储编辑后的宏
  • 任一C-u<f3>给首先重播宏,然后继续记录将被附加到宏定义后续击键
  • ...或者C-uC-u<f3>继续录制而没有宏远播的最初回放。

也许需要编辑“宏观损失法”的需求并不理想,但是(a)无论是否中止了录制,都势必需要编辑宏,并且(b)这种情况不应该经常发生,如果您只记得如何正常停止宏(例如,使用<f4>而不是C-g)。

没有一个是说如果将中止的宏存储在某个位置,它将没有用;只是我不认为这确实发生了。可能值得M-x report-emacs-bug建议这个功能。


这不能解决问题。使用您的解决方案一半的时间,重新开始宏会更容易。我在其他地方张贴了答案,确实可以很好地解决问题。
Christopher Done

1
当然,对于简单的情况,重新开始会更容易。不过,它对于其余部分仍然有用,这意味着有些人会发现它很有帮助;特别是默认情况下可用。正如我指出的那样,我认为采用更自动化的方法的想法是一个好方法,因此,我很高兴看到您正在开发一种解决方案,并且肯定会投票给您答案。
菲尔2014年

0

规范的解决方案是C-x C-k C-ekmacro-edit-macro),它使您可以逐步完成每次按键操作并插入/删除所需的任何内容。编辑器的命令语法有点简洁,但是?会带出一个指南。C-x C-k eedit-kbd-macro)绑定了一个更自然的编辑器,它为纯文本宏编辑器提供了注释。

另一个选择是M-x insert-kbd-macro,您可以将宏编辑为Lisp,但这不是世界上最易读的东西。

就变量而言,您正在寻找last-kbd-macrokmacro-ring

正如您提到的,您还没有完成宏,您可以从丢失中创建它。C-x C-k e C-h l并删除最多300个前面的字符。


如果可以的话,这是我会否决的错误答案。您要么没有阅读问题,要么就忽略了它。既不包含之前未按下的键,last-kbd-macro也不kmacro-ring包含C-g发生错误。我特别在标题中将INCOMPLETE列为大写字母,以预料会有如此糟糕的答案。不过,感谢您的帮助。
Christopher Done

1
@ChristopherDone:当然可以。我在底部添加了注释以提及损失。您最多可以使用300个以前输入的字符来创建宏。
stsquad 2014年

是的,有人提到#emacs发生损失。我只想从我停下来的地方继续。在执行某项操作时,我不需要打开编辑器并开始从中删除内容。
Christopher Done 2014年

2
将此答案与artagnon的答案结合起来可以提供一个很好的解决方案:C-x C-k e C-h l,编辑,C-c C-c然后C-u f3进行记录(请注意,最后一个f3将首先播放宏-远,然后再等待进一步的输入)。也许需要编辑“宏观损失法”是不理想的,但是(a)无论是否中止了录制,都势必需要编辑宏,并且(b)这种情况不应该经常发生,如果您只记得如何正常停止宏。
phils 2014年

1
@phils +1也许您应该将其转换为单独的答案。
itsjeyd 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.