升级到Aquamacs 3.3版(emacs 25.1.1)后,运行re-replace-region
(如下定义)时,我收到标题中提到的错误,尝试更改区域中的9s字符串(例如“99”或“999”)到0。我以前从未遇到过Aquamacs(或者通常是emacs)的早期版本的问题,而且在emacs环境或一般的机器环境(Mac OS 10.9.5)中我无法想到任何可能与之相关的问题。问题。
事实上,我在同一台机器上有一个emacs可执行文件(版本22.1.1),并且在相同的环境中调用它后(例如,相同的〜/ .emacs等),re-replace-region
可以正常工作
我可以提供的唯一其他线索是,当在一个区域中运行重新替换区域时,如果在其中设置三个9(999),尝试将9更改为0,则在错误条件被提升之前更改前9个
这是defun:
;;; RE-REPLACE-REGION replaces OLD (a regular expression) with NEW
;;; throughout the region indicated by BEGIN and END.
;;; For example, to insert a prefix ">" at the beginning of each line
;;; in the region:
;;; M-x re-replace-regionRET^RET>RET
;;; I don't know who wrote this function!
(defun re-replace-region (begin end old new)
"Replace occurrences of REGEXP with TO-STRING in region."
(interactive "*r\nsReplace string: \nswith: ")
(save-excursion
(save-restriction
(narrow-to-region begin end)
(goto-char (point-min))
(while (re-search-forward old (point-max) t)
(replace-match new nil nil)))))
答案 0 :(得分:1)
我可以告诉你,这个错误消息是在2016年7月引入的,这解释了为什么旧版本的Emacs没有提出它:
commit 3a9d6296b35e5317c497674d5725eb52699bd3b8
Author: Eli Zaretskii
Date: Mon Jul 4 18:34:40 2016 +0300
Avoid crashes when buffer modification hooks clobber match data
* src/search.c (Freplace_match): Error out if buffer modification
hooks triggered by buffer changes in replace_range, upcase-region,
and upcase-initials-region clobber the match data needed to be
adjusted for the replacement. (Bug#23869)
所以我首先假设错误中的信息正确,并尝试确认。检查before-change-functions
和after-change-functions
变量的值(在相关缓冲区中),并确定列出的其中一个函数是否负责。
据推测,其中一个确实破坏了匹配数据,然后应该将其作为相关功能的错误来解决。如果是自定义的,您很可能只需要围绕相关代码打包save-match-data
。
答案 1 :(得分:1)
问题似乎出现了,因为受影响的缓冲区中的变量matplot(seq(nrow(test)), cbind(test$y, predict(reg), rstudent(reg)), type="l")
为before-change-functions
。
一个简单的解决方法是使用(aquamacs-undo--rec-region-when-buffer-changes)
而不是replace-regexp
。实际上,它比单纯的解决方法更好,因为当按预期使用时(即交互使用时),re-replace-region
的调用方式如下:
replace-regexp
也就是说,如果定义了一个区域, (replace-regexp REGEX TOSTRING nil
(if (use-region-p) (region-beginning))
(if (use-region-p) (region-end)) nil)
只影响该区域 - 这当然是replace-regexp
的基本原理。
我仍然有兴趣了解re-replace-region
的更多信息。同时,尤其要感谢@phils。