mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-21 12:27:33 +00:00
* lisp/subr.el (cancel-change-group): Reset cell in case of error
Since the setcdr/setcdr is supposed to be temporary, use unwind-protect to make sure we properly undo the temporary change even in case of error.
This commit is contained in:
parent
c54238db6a
commit
682fdae7ef
1 changed files with 21 additions and 20 deletions
41
lisp/subr.el
41
lisp/subr.el
|
|
@ -2535,26 +2535,27 @@ This finishes the change group by reverting all of its changes."
|
|||
;; Widen buffer temporarily so if the buffer was narrowed within
|
||||
;; the body of `atomic-change-group' all changes can be undone.
|
||||
(widen)
|
||||
(let ((old-car
|
||||
(if (consp elt) (car elt)))
|
||||
(old-cdr
|
||||
(if (consp elt) (cdr elt))))
|
||||
;; Temporarily truncate the undo log at ELT.
|
||||
(when (consp elt)
|
||||
(setcar elt nil) (setcdr elt nil))
|
||||
(unless (eq last-command 'undo) (undo-start))
|
||||
;; Make sure there's no confusion.
|
||||
(when (and (consp elt) (not (eq elt (last pending-undo-list))))
|
||||
(error "Undoing to some unrelated state"))
|
||||
;; Undo it all.
|
||||
(save-excursion
|
||||
(while (listp pending-undo-list) (undo-more 1)))
|
||||
;; Reset the modified cons cell ELT to its original content.
|
||||
(when (consp elt)
|
||||
(setcar elt old-car)
|
||||
(setcdr elt old-cdr))
|
||||
;; Revert the undo info to what it was when we grabbed the state.
|
||||
(setq buffer-undo-list elt))))))
|
||||
(let ((old-car (car-safe elt))
|
||||
(old-cdr (cdr-safe elt)))
|
||||
(unwind-protect
|
||||
(progn
|
||||
;; Temporarily truncate the undo log at ELT.
|
||||
(when (consp elt)
|
||||
(setcar elt nil) (setcdr elt nil))
|
||||
(unless (eq last-command 'undo) (undo-start))
|
||||
;; Make sure there's no confusion.
|
||||
(when (and (consp elt) (not (eq elt (last pending-undo-list))))
|
||||
(error "Undoing to some unrelated state"))
|
||||
;; Undo it all.
|
||||
(save-excursion
|
||||
(while (listp pending-undo-list) (undo-more 1)))
|
||||
;; Revert the undo info to what it was when we grabbed
|
||||
;; the state.
|
||||
(setq buffer-undo-list elt))
|
||||
;; Reset the modified cons cell ELT to its original content.
|
||||
(when (consp elt)
|
||||
(setcar elt old-car)
|
||||
(setcdr elt old-cdr))))))))
|
||||
|
||||
;;;; Display-related functions.
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue