replace-regexp如何在minibuffer里调用

如图,想替换world 为 everybody, 但是却失败了。 请教大家,谢谢。

捕获

应该用命令,而不是 eval

试试 M-x query-replace-regexp

或者 M-x replace-regexp

(query-replace-regexp REGEXP TO-STRING &optional DELIMITED START END
BACKWARD REGION-NONCONTIGUOUS-P)

现在的问题是,我希望 TO-STRING 通过 elisp 计算出来,有什么好办法不?

用 elisp 的话要确保当前点在要替换的点前面

类似这种:

(replace-regexp "\\(something\\)" "\\1 else")

就是把下面接着的 something 替换成 something else ,注意 \\1 的使用,数字 1 代表第一组,就是正则表达式里用 \\(...\\) 括住的部分。

1 个赞

比如,TO-STRING 保存在寄存器里面,然后调用 M-x replace-regexp, 如何从寄存器里面把TO-STRING 取出来?

从 Lisp 调用命令时,其中的 interactive 不会执行,你需要自己补齐参数,有可能像这样:

(replace-regexp "world" "everyboday" nil (region-beginning) (region-end))

不过你应该依照 C-h f replace-regexp 给出的提示,使用 re-search-forwardreplace-match,或许像这样:

(save-restriction
  (narrow-to-region (region-beginning) (region-end))
  (goto-char (point-min))
  (while (re-search-forward "world" nil t)
    (replace-match "everyboday")))
1 个赞

为什么中途换了一个问题,原来的问题解决了吗?

没换问题啊,就是想通过一个简单直接的问题来了解如何使用 elisp 做替换。后面是不断的将问题具象化。

对于TO-STRING 存放在寄存器里的情况,将答案贴在这里,以方便有相同困惑的道友。

假设将"everybody" 存放在了 register a, 可以通过如下方法进行替换,

(replace-regexp "world" (get-register 97) nil (region-beginning) (region-end))