请问 如何定制宏使其停在query-replace-regexp的输入表达式阶段

我希望对我的文件内容进行精确的查找替换

2022-09-29-171252_522x49_scrot

使用上面的正则表达式可以做到,但是每次都这么输入有点麻烦,所以我想为它定制一个宏。

在定制宏时输入以上内容并使用 C-x ) 出现以下提示:

但是当我通过 C-x e 命令运行上面的宏时,没有任何反应,只是提示:

我也试了给这个宏添加名字,然后再运行命令,但也还是没有用。请问这是为什么?或者有别的不通过宏的方式也可以达到我的目的吗?

应该是「录制宏」。

在我作为十多年资深菜鸡 Emacser 的生涯中,真的没用过几次 kmacro。

这东西,一顿操作结束,你自己心里都没底,到底操作对不对,也没法跟人解释,别人也不帮不上你。侥幸录制成功,如果下一个场景稍微有点差别,这段 kmacro 就用不上。可重用性极低。

而代码,你可以自己调试,可以贴出来请教别人,有问题一目了然。换个场景,稍加修改,即可重用。

代码恒久远,一段永流传。

1 个赞

我的理解是 kmacro 的执行单位是单个命令,在运行 kmacro 的时候 emacs 会尝试完成 query-replace-regexp,因此不生效。

可以在录制的时候使用 C-x qC-u C-x q 来插入断点,这样每次到断点就会询问(详见 Keyboard Macro Query ):

(defalias 'my-replace
   (kmacro "C-M-% \\ < \\ > C-x q <return> t e s t C-x q <return> !"))

不过这样好像并没有简单多少,另一种方法是包装一下 query-replace-regexp

请问一下,您代码中的kmacro函数是什么,我的emacs显示未定义该函数

我也尝试过用以下代码

(define-key evil-normal-state-map (kbd "C-r") (kbd ":query-replace-regexp RET \ < \ > <left> <left>"))

但是不知道为什么,可能是emacs默认在后面加RET?这段代码并没有作用

抱歉,忘记说明 emacs 版本了,我用的是 29.05 。

这是用 insert-kbd-macro 把命名了的宏打印出来的代码,我看了一下 kmacro 好像是 emacs 29 引入的。

你可以自己录制一遍就明白了。

2 个赞

哦哦,我懂了,感谢您的帮助,我的问题已经解决了