2016-12-30 9 views
1

Aquamacsバージョン3.3(emacs 25.1.1)にアップグレードした後、re-replace-region(下記に定義)の実行時にタイトルに記載されているエラーが発生しました。ある領域(例えば "99"または "999")の9文字列を0に変更しようとしています。以前のバージョンのAquamacs(または一般的にはemacs)でこの問題が起きたことは一度もありませんでした。emacs環境や一般的なマシン環境(Mac OS 10.9.5)で考えられることはありません。問題。"re-replace-region:バッファ変更フックで噛み合ったデータとのマッチング"

実際、同じマシンにemacs実行可能ファイル(バージョン22.1.1)があり、同じ環境(たとえば〜/ .emacsなど)で起動すると、re-replace-regionが正常に動作します。

私が提供できる唯一の手がかりは、3つの9(999)がある領域でre-replace-regionを実行し、9を0に変更しようとすると、最初の9がエラー条件育った。

;;; 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

'emacs -Q'(initファイルなし)から始めて、問題を再現するためのステップバイステップのレシピを提供してください。あなたが何か間違ったことをしていないことをあなたや他の人が知ることができたら、Aquamacsの管理者やMx report-emacs-bugを使ってバグとして報告することを検討してください。あなたはそれがAquamacsを伴わないと思います。 – Drew

答えて

1

影響を受けるバッファ内の変数before-change-functions(aquamacs-undo--rec-region-when-buffer-changes)であるため、問題が発生しているようです。

簡単な回避策は、re-replace-regionの代わりにreplace-regexpを使用することです。確かに、意図したように(すなわち、対話的に使用する場合)に使用する場合、以下のように、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の根拠です。

私はまだ(aquamacs-undo--rec-region-when-buffer-changes)についてもっと知りたいと思っています。その間、特に@philsに感謝します。

+0

aquamacsの管理者にバグレポートを記録する必要があるようです。 – phils

+0

残念ながら、この問題が変更前または変更後の機能に関連していることを確認できませんでした。確かに、私は今、(a)それらがどちらもゼロであるバッファを持っています。 (b)re-replace-regionは記述どおりに失敗する。 (c)replace-regexpが成功する。私は、地域を再配置するよりはるかに良い代替手段と思われるものが存在することが、私の好奇心を圧倒し始めているのではないかと心配しています.-( – peak

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-functionsafter-change-functions変数(問題のバッファ内)の値を確認し、リストされた関数の1つが原因であるかどうかを確認します。

恐らくそれらのうちの1人が実際にマッチデータを破壊していると思われます。それは問題の関数のバグとして扱われます。カスタムの場合は、関連するコードの周りにsave-match-dataへの呼び出しをラップするだけです。

+1

n.b. @peakは 'replace-regexp'を使用する回避策を提案しましたが、これは理想とはかけ離れています - re-search-forwardを使用し、replace-matchはelispコードの*正しい*アプローチです。 regexp 'docstringもこれを指摘しています)、避けることができれば回避策を​​採用することはお勧めしません。 – phils

+1

私は同じエラーメッセージを持っていましたが、@peaksとは異なる何かをしています。「変更前機能」、「変更後機能」、「プリコマンドフック」、「コマンド後フック」を空にしてもエラーは残っていた。私はしばらく諦めていましたが、今日は「最初のチェンジフック」をチェックしていないことを発見しました。それが私の犯人であることが判明しました。 – amitp

関連する問題