3

我正在寻找一个功能类似于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

4 回答 4

6

此功能已经是query-replace. 你可以用E. 要查看所有选项,请?在更换时按。

于 2013-08-10T15:14:18.230 回答
3

对于query-replace-regexp,您可能希望\?在替换字符串中使用。它会在您决定采取行动的每次发生时询问输入,并且您可以将其与其他正则表达式功能(例如分组和 elisp ( \,))结合使用。本手册页对此进行了描述。

于 2013-08-10T18:36:34.193 回答
1

是的,查询替换的答案是e(或E)。


但您可能还对另一种选择感兴趣:按需替换搜索。

Icicles中,您可以按任何顺序访问搜索命中 - 访问(或重新访问)您感兴趣的搜索结果。您可以查看一些周围的上下文来选择命中,而无需访问它们。您可以单独访问其中一些,也可以按不同的循环顺序在其中一些或全部之间循环。

当您访问某个事件时,您可以按一个键告诉Icicles您要替换匹配中的文本,如果是,是否提示您输入新的替换文本。

IOW,按需更换。您不需要以特定顺序访问所有命中(在缓冲区中出现),并且您没有义务为每个命中指明要做什么(跳过/替换/编辑等)。

直接转到您感兴趣的匹配项,并在适当的时候进行替换。你告诉 Emacs 你想要什么;它不会问你“你想要这个吗?这个?这个?这个?这个?......)”

只是提到它作为一种替代方案,它对某些用途可能很强大。它不能替代所有用途的查询替换。

http://www.emacswiki.org/emacs/Icicles_-_Search_Commands%2c_Overview

于 2013-08-10T17:02:41.873 回答
1

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

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

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

例如,假设您使用 的正则表达式搜索模式 \(e\)\|a和 的替换模式\,(if \1 "a" "e")。然后每个C-M-RET人都会交换ea反之亦然。

于 2013-10-21T00:18:45.383 回答