搜索转发拼写错误中止宏

时间:2014-06-16 15:15:14

标签: emacs macros

搜索转发似乎在emacs宏内部无法正常工作。例如,假设我想使用宏来帮助将FOO替换为以下字符串中的BAR

aoeuFOOsnutehaFOOsanotehuFOO

我可能会开始录制一个宏,向前搜索FOO,然后点击退格几次并输入BAR。然后我可以重播这个宏来替换其余的事件。很简单。

假设我点击了错误的密钥并向前搜索了FOOO。我点击Backspace删除额外的O,然后完成录制宏。但是当我重播它时,没有任何反应。 FOOO不在文档中,因此当搜索失败时,宏重播会立即中止。

这会在较长的宏中变得烦人。实际上,每当我录制宏时,我都必须确保输入搜索文本以完美地搜索我的搜索结果。如果我犯了一个错误,我必须取消录制我的宏并重新开始;否则,当我重放宏时,宏就会中止。


总而言之,如果您使用搜索转发并在录制宏时提交拼写错误,则宏将无法正常重播,因为它会在重播您的拼写错误后立即中止。

此问题的解决方法或解决方案是什么?

2 个答案:

答案 0 :(得分:4)

您不必中止宏:最简单的方法是简单地完成录制宏(拼写错误和所有内容),然后通过 Cx Ck Ce 编辑kmacro-edit-macro-repeat)删除拼写错误。

例如,在定义一个宏之后调用此命令时,该宏应该只搜索当前缓冲区中foo的出现但在搜索中包含拼写错误(您键入fooo而不是在修复拼写错误之前foo,用于编辑它的缓冲区将如下所示:

C-s         ;; isearch-forward
f           ;; self-insert-command
ooo         ;; self-insert-command * 3
DEL         ;; delete-backward-char
RET         ;; newline

要修复宏,请从第三行删除其中一个o并删除第四行:

C-s         ;; isearch-forward
f           ;; self-insert-command
oo          ;; self-insert-command * 2
RET         ;; newline

请注意,您不必将self-insert-command * 3更改为self-insert-command * 2,我这样做是为了避免混淆。

完成后,点击 C-c C-c 重新编译宏并关闭*Edit macro*缓冲区。

答案 1 :(得分:4)

ding函数的文档说(强调我的):

  

(ding &optional ARG)

     

发出哔声或闪烁屏幕。   此外,除非给出参数,否则终止当前正在执行的任何键盘宏。

深入source我们可以看到调用isearch-*的所有ding函数都执行传递非nil {{ 1}}。你可以重新定义这些函数来改变他们调用ARG的方式(不确定是否完全删除对ding的调用),但是有一种更简单的方法来实现你想要的:

您可以确保始终使用非ding dingadvising调用nil,如下所示:

ARG

记录here(defadvice ding (before be-nice activate compile) (ad-set-arg 0 t))

  

位置的实际参数值设置为

所以建议的作用是告诉Emacs将ad-set-arg设置为ARG t运行原始before函数的主体,从而导致ding < strong>很好,不再终止键盘宏。


根据建议,您现在可以转换

ding

aoeuFOOsnutehaFOOsanotehuFOO

&#34;错误&#34;包含更正的拼写错误的宏:

aoeuBARsnutehaBARsanotehuBAR

修改

正如@phils在下面的评论中提到的,允许宏执行继续而不管错误都会导致不必要的后果,因此小心使用此解决方案。如果您希望能够快速启用或禁用建议,以便您可以有选择地使用它(例如,在您确定它不会搞砸的情况下),请按以下方式定义:

C-s         ;; isearch-forward
F           ;; self-insert-command
OOO         ;; self-insert-command * 3
DEL         ;; delete-backward-char
RET         ;; newline
3*DEL       ;; delete-backward-char
BAR         ;; self-insert-command * 3

并添加一个命令,将其打开和关闭到(defadvice ding (before be-nice) ; advice not activated by default (ad-set-arg 0 t))

.emacs

然后,您只需按 C-c a 即可切换建议。