2016-12-30 17 views
1

После обновления до версии Aquamacs версии 3.3 (emacs 25.1.1), я получаю ошибку, указанную в заголовке при запуске re-replace-region (как определено ниже), пытаясь изменить строку из 9s в области (например, «99» или «999») на 0 с. У меня никогда не было этой проблемы с предыдущими версиями Aquamacs (или emacs вообще), и я ничего не могу придумать, как в среде emacs, так и в среде компьютера (Mac OS 10.9.5), которая может быть связана с проблема.«re-replace-region: сопоставить данные, сбитые крючками модификации буфера»

Фактически, у меня есть исполняемый файл 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

Просьба предоставить пошаговый рецепт, чтобы воспроизвести проблему, начиная с 'emacs -Q' (без файла инициализации). Покажите, какие команды и ввод вы используете, и т. Д. Если вы или люди здесь можете сказать, что вы не делаете что-то неправильно, подумайте о том, как сообщать о поведении как об ошибке, либо для поддерживающих Aquamacs, либо с помощью 'Mx report-emacs-bug', если вы думаете, что это не касается Aquamacs. – Drew

ответ

1

Проблема возникает из-за того, что переменная 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.

Мне все еще интересно узнать больше о (aquamacs-undo--rec-region-when-buffer-changes). Между тем, спасибо особенно @phils.

+0

Похоже, вы должны зарегистрировать отчет об ошибке с сопровождающими аквамаками. – phils

+0

К сожалению, я не смог проверить, связана ли проблема с функциями перед или после замены. Действительно, теперь у меня есть буфер, в котором (а) они равны нулю; (b) область повторной замены не работает, как описано; (c) replace-regexp преуспевает. Я боюсь, что существование того, что кажется намного лучшей альтернативой re-replace-region, начинает подавлять мое любопытство :-( – peak

1

Я могу вам сказать, что это сообщение об ошибке была введена в июле 2016 года, что объясняет, почему старые версии 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

n.b. @peak предложил обходное решение для использования 'replace-regexp', но это далеко не идеально - использование' re-search-forward' и 'replace-match' является * правильным * подходом для elisp-кода (и' replace- regexp' docstring даже указывает на это), поэтому я не рекомендую использовать это обходное решение, если вы можете его избежать. – phils

+1

У меня было такое же сообщение об ошибке, но я делаю что-то отличное от @peaks.Я устанавливал 'before-change-functions',' after-change-functions', 'pre-command-hook',' post-command-hook' для пустых и до сих пор ошибок. Некоторое время я отказался, но сейчас обнаружил, что я не проверял «первый сменный крючок». Это оказалось для меня виновником. – amitp

 Смежные вопросы

  • Нет связанных вопросов^_^