Fix undo boundary in recursive edit (Bug#23632)

* src/keyboard.c (recursive_edit_1): specbind
   undo-auto--undoably-changed-buffers.
 * lisp/simple.el (undo-auto--undoably-changed-buffers):
   fix docstring.
This commit is contained in:
Phillip Lord 2016-06-06 09:35:17 +01:00
parent 1f85b7ca03
commit a813487f1a
3 changed files with 43 additions and 3 deletions

View file

@ -2910,9 +2910,7 @@ REASON describes the reason that the boundary is being added; see
This list is maintained by `undo-auto--undoable-change' and
`undo-auto--boundaries' and can be affected by changes to their
default values.
See also `undo-auto--buffer-undoably-changed'.")
default values.")
(defun undo-auto--add-boundary ()
"Add an `undo-boundary' in appropriate buffers."

View file

@ -681,6 +681,14 @@ recursive_edit_1 (void)
specbind (Qinhibit_redisplay, Qnil);
redisplaying_p = 0;
/* This variable stores buffers that have changed so that an undo
boundary can be added. specbind this so that changes in the
recursive edit will not result in undo boundaries in buffers
changed before we entered there recursive edit.
See Bug #23632.
*/
specbind (Qundo_auto__undoably_changed_buffers, Qnil);
val = command_loop ();
if (EQ (val, Qt))
Fsignal (Qquit, Qnil);
@ -10956,6 +10964,8 @@ syms_of_keyboard (void)
DEFSYM (Qpost_command_hook, "post-command-hook");
DEFSYM (Qundo_auto__add_boundary, "undo-auto--add-boundary");
DEFSYM (Qundo_auto__undoably_changed_buffers,
"undo-auto--undoably-changed-buffers");
DEFSYM (Qdeferred_action_function, "deferred-action-function");
DEFSYM (Qdelayed_warnings_hook, "delayed-warnings-hook");

View file

@ -310,6 +310,38 @@
(= 6
(undo-test-point-after-forward-kill))))
(defmacro simple-test-undo-with-switched-buffer (buffer &rest body)
(let ((before-buffer (make-symbol "before-buffer")))
`(let ((,before-buffer (current-buffer)))
(unwind-protect
(progn
(switch-to-buffer ,buffer)
,@body)
(switch-to-buffer ,before-buffer)))))
;; This tests for a regression in emacs 25.0 see bug #23632
(ert-deftest simple-test-undo-extra-boundary-in-tex ()
(should
(string=
""
(simple-test-undo-with-switched-buffer
"temp.tex"
(latex-mode)
;; This macro calls `latex-insert-block'
(execute-kbd-macro
(read-kbd-macro
"
C-c C-o ;; latex-insert-block
RET ;; newline
C-/ ;; undo
"
))
(buffer-substring-no-properties
(point-min)
(point-max))))))
(provide 'simple-test)
;;; simple-test.el ends here