Package: emacs;
Reported by: Tino Calancha <tino.calancha <at> gmail.com>
Date: Mon, 2 Sep 2019 20:02:02 UTC
Severity: normal
Tags: patch
Found in version 26.3.50
Done: Tino Calancha <tino.calancha <at> gmail.com>
Bug is archived. No further changes may be made.
View this message in rfc822 format
From: Tino Calancha <tino.calancha <at> gmail.com> To: 37287 <at> debbugs.gnu.org Subject: bug#37287: 26.3.50; query-replace-regexp undo does not update next-replacement Date: Mon, 02 Sep 2019 22:00:44 +0200
emacs -Q C-x b foo RET M-: (insert "foo-1\nfoo-2\nfoo-3") RET M-< C-M-% \([0-9]\) RET \,(format "%d" (1+ (string-to-number \1))) RET SPC SPC U SPC q ;; buffer contains "foo-4\nfoo-2\nfoo-3" ;; expected "foo-2\nfoo-2\nfoo-3" --8<-----------------------------cut here---------------start------------->8--- commit ff57cbdde0ae9382e043bf335a52ed91ba1b205e Author: Tino Calancha <tino.calancha <at> gmail.com> Date: Mon Sep 2 21:58:04 2019 +0200 query-replace-regexp undo: Update next-replacement after undo * lisp/replace.el (perform-replace): Use last-replacement for the local binding to not shadow next-replacement. Update next-replacement after undo (Bug#37287). * test/lisp/replace-tests.el (query-replace-undo-bug37287): Add test. (query-replace-undo-bug37073): Tweak this test. diff --git a/lisp/replace.el b/lisp/replace.el index 0ddebb1270..dd24d8ba92 100644 --- a/lisp/replace.el +++ b/lisp/replace.el @@ -2584,7 +2584,7 @@ perform-replace (num-replacements 0) (nocasify t) ; Undo must preserve case (Bug#31073). search-string - next-replacement) + last-replacement) (while (and (< stack-idx stack-len) stack (or (null replaced) last-was-act-and-show)) @@ -2595,9 +2595,9 @@ perform-replace ;; Bind swapped values ;; (search-string <--> replacement) search-string (nth (if replaced 4 3) elt) - next-replacement (nth (if replaced 3 4) elt) + last-replacement (nth (if replaced 3 4) elt) search-string-replaced search-string - next-replacement-replaced next-replacement + last-replacement-replaced last-replacement last-was-act-and-show nil) (when (and (= stack-idx stack-len) @@ -2619,16 +2619,18 @@ perform-replace (match-data t (nth 2 elt))) noedit (replace-match-maybe-edit - next-replacement nocasify literal + last-replacement nocasify literal noedit real-match-data backward) replace-count (1- replace-count) real-match-data (save-excursion (goto-char (match-beginning 0)) (if regexp-flag - (looking-at next-replacement) - (looking-at (regexp-quote next-replacement))) + (looking-at last-replacement) + (looking-at (regexp-quote last-replacement))) (match-data t (nth 2 elt)))) + (when regexp-flag + (setq next-replacement (nth 4 elt))) ;; Set replaced nil to keep in loop (when (eq def 'undo-all) (setq replaced nil diff --git a/test/lisp/replace-tests.el b/test/lisp/replace-tests.el index cd08a522e3..2a3f207e47 100644 --- a/test/lisp/replace-tests.el +++ b/test/lisp/replace-tests.el @@ -463,7 +463,9 @@ replace-tests--query-replace-undo (should (replace-tests-with-undo input "theorem \\([0-9]+\\)" - "theorem \\\\ref{theo_\\1}" + '(replace-eval-replacement + replace-quote + (format "theorem \\\\ref{theo_%d}" (1+ (string-to-number (match-string 1))))) ((?\s . (1 2)) (?U . (3))) ?q (string= input (buffer-string))))) @@ -479,4 +481,18 @@ replace-tests--query-replace-undo ?q (string= expected (buffer-string)))))) +(ert-deftest query-replace-undo-bug37287 () + "Test for https://debbugs.gnu.org/37287 ." + (let ((input "foo-1\nfoo-2\nfoo-3") + (expected "foo-2\nfoo-2\nfoo-3")) + (should + (replace-tests-with-undo + input "\\([0-9]\\)" + '(replace-eval-replacement + replace-quote + (format "%d" (1+ (string-to-number (match-string 1))))) + ((?\s . (1 2 4)) (?U . (3))) + ?q + (string= expected (buffer-string)))))) + ;;; replace-tests.el ends here --8<-----------------------------cut here---------------end--------------->8--- In GNU Emacs 26.3.50 (build 4, x86_64-pc-linux-gnu, GTK+ Version 3.24.5) of 2019-09-02 built on calancha-pc.dy.bbexcite.jp Repository revision: 7e527af72cae65fdb3f61c7d92907cfdfd1e6ea3 Windowing system distributor 'The X.Org Foundation', version 11.0.12004000 System Description: Debian GNU/Linux 10 (buster)
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.