我正在寻找一个与query-replace
类似的功能,但不是一遍又一遍地使用相同的替换字符串,每次找到匹配项时都会要求替换字符串。也就是说,一旦找到匹配,您可以跳过此匹配或进入替换模式,您可以在其中指定要用于替换匹配的字符串(具有先前替换的历史记录)。
更有用的是query-replace-regexp
变体,它允许使用搜索字符串的分组。
我已经编写了一些代码用于非正则表达式版本,但是,我已经停留在实际替换某些内容的部分,并在替换完成后重复整个搜索/跳过匹配。到目前为止的代码是:
(defun query-replace-ask (search)
(interactive "sQuery replace: ")
(if (search-forward search nil t)
(let ((beg (match-beginning 0))
(end (match-end 0))
(if (y-or-n-p "Replace?")
(replacement (read-string "Replacement: "))
(
;; Do the next search
)))
;; Replace from beg to end with replacement
;; do the next search
)))
此外,如果函数完成后函数可以输出总替换次数,那将会很不错。
答案 0 :(得分:6)
此功能已经是query-replace
的一部分。
你可以用 E 来调用它。要查看所有选项,请在替换时按?。
答案 1 :(得分:3)
对于query-replace-regexp
,您可能希望在替换字符串中使用\?
。它会在您决定采取行动的每一次出现时要求输入,并且您可以将其与其他正则表达式功能(例如分组和elisp(\,
))结合使用。这在this manual page。
答案 2 :(得分:1)
是的,查询替换的答案是e
(或E
)。
但您可能也对另一种选择感兴趣:使用按需替换进行搜索。
在 Icicles 中,您可以按任意顺序访问搜索匹配 - 访问(或重新访问)您感兴趣的搜索命中。您可以看到选择匹配的一些周围环境,无需访问他们。你可以单独访问其中的一些,或者以不同的周期顺序在它们中的一些或全部循环。
当您访问某个事件时,您可以按一个键告诉冰柱您想要替换匹配中的文本,如果是,则是否提示您输入新的替换文字。
IOW,需要更换。您无需按特定顺序访问所有匹配(在缓冲区中出现),并且您没有义务为每个命中指示要做什么(跳过/替换/编辑等)。
直接进入您感兴趣的比赛,并在适当时进行替换。你告诉Emacs你想要什么;它没有问你“你想要这个吗?这个?这个?这一个?......”“
只是提到这个作为替代品,可以用于某些用途。它不是所有用途的查询替换的替代品。
http://www.emacswiki.org/emacs/Icicles_-_Search_Commands%2c_Overview
答案 3 :(得分:1)