summaryrefslogtreecommitdiff
path: root/lisp/subr.el
diff options
context:
space:
mode:
authorMartin Rudalics <rudalics@gmx.at>2008-09-07 09:16:56 +0000
committerMartin Rudalics <rudalics@gmx.at>2008-09-07 09:16:56 +0000
commitd21cba62f0b647ad7ec7ac298f0dae59e06bc381 (patch)
tree269e9b1ead7dba7a0ee26426d608cc1b2321faa2 /lisp/subr.el
parent126f1fc1a37a64bce9f5be9bead3b49cec8825b3 (diff)
downloademacs-d21cba62f0b647ad7ec7ac298f0dae59e06bc381.tar.gz
(cancel-change-group): Widen buffer temporarily when
undoing changes. (Bug#810)
Diffstat (limited to 'lisp/subr.el')
-rw-r--r--lisp/subr.el44
1 files changed, 24 insertions, 20 deletions
diff --git a/lisp/subr.el b/lisp/subr.el
index b7b6b2c38de..2aa802cd03e 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1993,26 +1993,30 @@ This finishes the change group by reverting all of its changes."
(dolist (elt handle)
(with-current-buffer (car elt)
(setq elt (cdr elt))
- (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)))))
+ (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
+ (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))))))
;;;; Display-related functions.