我正在寻找一个功能类似于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
)))
此外,如果该函数可以在函数完成后输出总替换数,那就太好了。