Function: cancel-change-group
cancel-change-group is a byte-compiled function defined in subr.el.gz.
Signature
(cancel-change-group HANDLE)
Documentation
Finish a change group made with prepare-change-group (which see).
This finishes the change group by reverting all of its changes.
Probably introduced at or before Emacs version 22.1.
Source Code
;; Defined in /usr/src/emacs/lisp/subr.el.gz
(defun cancel-change-group (handle)
"Finish a change group made with `prepare-change-group' (which see).
This finishes the change group by reverting all of its changes."
(dolist (elt handle)
(with-current-buffer (car elt)
(setq elt (cdr elt))
(save-restriction
;; 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 (car-safe elt))
(old-cdr (cdr-safe elt))
;; Use `pending-undo-list' temporarily since `undo-more' needs
;; it, but restore it afterwards so as not to mess with an
;; ongoing sequence of `undo's.
(pending-undo-list
;; Use `buffer-undo-list' unconditionally (bug#39680).
buffer-undo-list))
(unwind-protect
(progn
;; Temporarily truncate the undo log at ELT.
(when (consp elt)
(setcar elt nil) (setcdr elt nil))
;; 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))))))))