一个`query-replace`,它要求每次出现一个新的替换字符串

时间:2013-08-10 15:05:19

标签: emacs elisp

我正在寻找一个与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
        )))

此外,如果函数完成后函数可以输出总替换次数,那将会很不错。

4 个答案:

答案 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)

Isearch+现在提供与Icicles提供的类似按需替换功能。

当您访问任何搜索匹配时,可以使用C-u C-M-RET提示您输入替换文字。 (如果没有前缀arg,则重复使用最后一个替换文本。)

替换也可以使用query-replace-regexp允许的特殊正则表达式结构:\&\=\N',, \,and \?`。

例如,假设您使用的是regexp-search模式 \(e\)\|a以及\,(if \1 "a" "e")的替换模式。 然后,每个C-M-RETe换成a,反之亦然。