Preserve case in query-replace undo

If the user query and replaces 'foo' with 'BAR', then
undo must comeback to 'foo', not to 'FOO' (Bug#31073).
* lisp/replace.el (perform-replace): Bind nocasify to non-nil
value during undo/undo-all actions.
* test/lisp/replace-tests.el (query-replace-undo-bug31073): Add test.
This commit is contained in:
Tino Calancha 2018-04-09 11:47:47 +09:00
parent 24f7defaf7
commit 32dc0cb1b5
2 changed files with 21 additions and 0 deletions

View file

@ -2619,6 +2619,7 @@ It must return a string."
(let ((stack-idx 0)
(stack-len (length stack))
(num-replacements 0)
(nocasify t) ; Undo must preserve case (Bug#31073).
search-string
next-replacement)
(while (and (< stack-idx stack-len)

View file

@ -380,4 +380,24 @@ Each element has the format:
(should (string= "211" (replace-tests--query-replace-undo)))
(should (string= "211" (replace-tests--query-replace-undo 'comma))))
(ert-deftest query-replace-undo-bug31073 ()
"Test for https://debbugs.gnu.org/31073 ."
(let ((text "aaa aaa")
(count 0))
(with-temp-buffer
(insert text)
(goto-char 1)
(cl-letf (((symbol-function 'read-event)
(lambda (&rest args)
(cl-incf count)
(let ((val (pcase count
((or 1 2 3) ?\s) ; replace current and go next
(4 ?U) ; undo-all
(_ ?q)))) ; exit
val))))
(perform-replace "a" "B" t nil nil))
;; After undo text must be the same.
(should (string= text (buffer-string))))))
;;; replace-tests.el ends here