From 82f8cd940f097af95cb1100f7f38a1f08778cb1d Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Sat, 22 Sep 2012 11:07:39 +0800 Subject: [PATCH] Fix auto-save and locking for indirect buffers. * lisp/simple.el (undo): Handle indirect buffers. * buffer.c (Fset_buffer_modified_p): Handle indirect buffers. Fixes: debbugs:8207 --- lisp/ChangeLog | 4 ++++ lisp/simple.el | 13 +++++++++---- src/ChangeLog | 5 +++++ src/buffer.c | 8 ++++++-- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index e6fa549e867..950e7e4b4da 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2012-09-22 Chong Yidong + + * simple.el (undo): Handle indirect buffers (Bug#8207). + 2012-09-21 Leo Liu IDO: Disable match re-ordering for buffer switching. diff --git a/lisp/simple.el b/lisp/simple.el index d87ae3c5c15..3e11e6838c7 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -1855,9 +1855,13 @@ as an argument limits undo to changes within the current region." ;; another undo command will find the undo history empty ;; and will get another error. To begin undoing the undos, ;; you must type some other command. - (let ((modified (buffer-modified-p)) - (recent-save (recent-auto-save-p)) - message) + (let* ((modified (buffer-modified-p)) + ;; For an indirect buffer, look in the base buffer for the + ;; auto-save data. + (base-buffer (or (buffer-base-buffer) (current-buffer))) + (recent-save (with-current-buffer base-buffer + (recent-auto-save-p))) + message) ;; If we get an error in undo-start, ;; the next command should not be a "consecutive undo". ;; So set `this-command' to something other than `undo'. @@ -1935,7 +1939,8 @@ as an argument limits undo to changes within the current region." ;; Record what the current undo list says, ;; so the next command can tell if the buffer was modified in between. (and modified (not (buffer-modified-p)) - (delete-auto-save-file-if-necessary recent-save)) + (with-current-buffer base-buffer + (delete-auto-save-file-if-necessary recent-save))) ;; Display a message announcing success. (if message (message "%s" message)))) diff --git a/src/ChangeLog b/src/ChangeLog index 0d441761ce5..439b5c06e27 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2012-09-22 Chong Yidong + + * buffer.c (Fset_buffer_modified_p): Handle indirect buffers + (Bug#8207). + 2012-09-22 Kenichi Handa * composite.c (composition_reseat_it): Handle the case that a diff --git a/src/buffer.c b/src/buffer.c index b020edb9962..22624e33a4b 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1341,9 +1341,13 @@ A non-nil FLAG means mark the buffer modified. */) /* If buffer becoming modified, lock the file. If buffer becoming unmodified, unlock the file. */ - fn = BVAR (current_buffer, file_truename); + struct buffer *b = current_buffer->base_buffer + ? current_buffer->base_buffer + : current_buffer; + + fn = BVAR (b, file_truename); /* Test buffer-file-name so that binding it to nil is effective. */ - if (!NILP (fn) && ! NILP (BVAR (current_buffer, filename))) + if (!NILP (fn) && ! NILP (BVAR (b, filename))) { bool already = SAVE_MODIFF < MODIFF; if (!already && !NILP (flag)) -- 2.39.2