搜索转发似乎在emacs宏内部无法正常工作。例如,假设我想使用宏来帮助将FOO
替换为以下字符串中的BAR
:
aoeuFOOsnutehaFOOsanotehuFOO
我可能会开始录制一个宏,向前搜索FOO
,然后点击退格几次并输入BAR
。然后我可以重播这个宏来替换其余的事件。很简单。
假设我点击了错误的密钥并向前搜索了FOOO
。我点击Backspace删除额外的O,然后完成录制宏。但是当我重播它时,没有任何反应。 FOOO
不在文档中,因此当搜索失败时,宏重播会立即中止。
这会在较长的宏中变得烦人。实际上,每当我录制宏时,我都必须确保输入搜索文本以完美地搜索我的搜索结果。如果我犯了一个错误,我必须取消录制我的宏并重新开始;否则,当我重放宏时,宏就会中止。
总而言之,如果您使用搜索转发并在录制宏时提交拼写错误,则宏将无法正常重播,因为它会在重播您的拼写错误后立即中止。
此问题的解决方法或解决方案是什么?
答案 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
ding
按advising调用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 即可切换建议。