我有这段代码来查找区域中的空字符串。
(defun replace-in-region (start end)
(interactive "r")
(let ((region-text (buffer-substring start end))
(temp nil))
(delete-region start end)
(setq temp (replace-regexp-in-string "\\_>" "X" region-text))
(insert temp)))
当我在一个区域上使用它时,无论所述区域的内容如何,它都会将其擦除,并给出错误“Args超出范围:4,4”。
当我在包含以下内容的区域中使用query-replace-regexp
时
abcd abcd
abcd 11.11
正则表达式 \_>
(请注意,只有一个反斜杠)和 rep X
替换后发生的4个结果区域是:
abcdX abcdX
abcdX 11.11X
我在这里缺少什么?
答案 0 :(得分:2)
它看起来像replace-regexp-in-string
中的错误。
它首先匹配原始字符串中的正则表达式。例如,它找到“abcd”的结尾。然后它选出匹配的子字符串,由于某些原因我不知道,重做子字符串上的匹配。在这种情况下,匹配失败(因为它不再跟着一个单词),但是它后面的代码假定它成功并且匹配数据已经更新。
请使用M-x report-emacs-bug
报告此错误。
我建议你用简单的循环替换对replace-regexp-in-string
的调用。事实上,我建议你不要删除字符串并执行以下操作:
(defun my-replace-in-region (start end)
(interactive "r")
(save-excursion
(goto-char start)
(setq end (copy-marker end))
(while (re-search-forward "\\_>" end t)
(insert "X")
;; Ensure that the regexp doesn't match the newly inserted
;; character.
(forward-char))))