如图,想替换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-forward
和 replace-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))