changeset 98071:c94db6d7eda9

(cancel-change-group): Widen buffer temporarily when undoing changes. (Bug#810)
author Martin Rudalics <rudalics@gmx.at>
date Sun, 07 Sep 2008 09:15:43 +0000
parents b0d74e2658b7
children f52bded946ed
files lisp/subr.el
diffstat 1 files changed, 24 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/subr.el	Sun Sep 07 01:22:25 2008 +0000
+++ b/lisp/subr.el	Sun Sep 07 09:15:43 2008 +0000
@@ -1993,26 +1993,30 @@
   (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.