emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: reverting buffer from non-existent file


From: martin rudalics
Subject: Re: reverting buffer from non-existent file
Date: Tue, 07 Feb 2006 10:44:11 +0100
User-agent: Mozilla Thunderbird 1.0 (Windows/20041206)

> I think it is cleaner to bind
> buffer-read-only and buffer-undo-list only once.

On the one hand I don't want to compromise the original behavior for
`revert-buffer-insert-file-contents-function' non-nil.  On the other I
don't want to bind `buffer-undo-list' when generating the "File no
longer exists ..." errors.  With `debug-on-error' non-nil, switching to
*Backtrace* would leave me without undo information again.  Hence the -
admittedly ugly - two bindings.  I added a comment to explain this.
        * files.el (revert-buffer): Do not discard undo list when buffer
        cannot be reverted because file does not exist.

*** files.el    Wed Feb  1 10:17:44 2006
--- files.el    Tue Feb  7 10:32:00 2006
***************
*** 3815,3821 ****
                               buffer-auto-save-file-name
                               (file-readable-p buffer-auto-save-file-name)
                               (y-or-n-p
!      "Buffer has been auto-saved recently.  Revert from auto-save file? ")))
             (file-name (if auto-save-p
                            buffer-auto-save-file-name
                          buffer-file-name)))
--- 3815,3821 ----
                               buffer-auto-save-file-name
                               (file-readable-p buffer-auto-save-file-name)
                               (y-or-n-p
!                               "Buffer has been auto-saved recently.  Revert 
from auto-save file? ")))
             (file-name (if auto-save-p
                            buffer-auto-save-file-name
                          buffer-file-name)))
***************
*** 3840,3845 ****
--- 3840,3848 ----
                    (setq buffer-backed-up nil))
               ;; Get rid of all undo records for this buffer.
               (or (eq buffer-undo-list t)
+                  ;; Do not clear buffer-undo-list if reverting will fail.
+                  (and (not (file-readable-p file-name))
+                       (not revert-buffer-insert-file-contents-function))
                   (setq buffer-undo-list nil))
               ;; Effectively copy the after-revert-hook status,
               ;; since after-find-file will clobber it.
***************
*** 3847,3863 ****
                     (local-hook-p (local-variable-p 'after-revert-hook))
                     (local-hook (and (local-variable-p 'after-revert-hook)
                                      after-revert-hook)))
!                (let (buffer-read-only
!                      ;; Don't make undo records for the reversion.
!                      (buffer-undo-list t))
!                  (if revert-buffer-insert-file-contents-function
!                      (funcall revert-buffer-insert-file-contents-function
!                               file-name auto-save-p)
!                    (if (not (file-exists-p file-name))
!                        (error (if buffer-file-number
!                                   "File %s no longer exists!"
!                                 "Cannot revert nonexistent file %s")
!                               file-name))
                     ;; Bind buffer-file-name to nil
                     ;; so that we don't try to lock the file.
                     (let ((buffer-file-name nil))
--- 3850,3876 ----
                     (local-hook-p (local-variable-p 'after-revert-hook))
                     (local-hook (and (local-variable-p 'after-revert-hook)
                                      after-revert-hook)))
!                (cond
!                 (revert-buffer-insert-file-contents-function
!                  (let (buffer-read-only
!                        ;; Don't make undo records for the reversion.
!                        (buffer-undo-list t))
!                    (funcall revert-buffer-insert-file-contents-function
!                             file-name auto-save-p)))
!                 ;; Don't bind buffer-undo-list around the error reporting
!                 ;; clauses to avoid that undo information gets lost when
!                 ;; calling the debugger.
!                 ((not (file-exists-p file-name))
!                  (error (if buffer-file-number
!                             "File %s no longer exists!"
!                           "Cannot revert nonexistent file %s")
!                         file-name))
!                 ((not (file-readable-p file-name))
!                  (error "File %s is not readable" file-name))
!                 (t
!                  (let (buffer-read-only
!                        ;; Don't make undo records for the reversion.
!                        (buffer-undo-list t))
                     ;; Bind buffer-file-name to nil
                     ;; so that we don't try to lock the file.
                     (let ((buffer-file-name nil))
***************
*** 3865,3871 ****
                           (unlock-buffer)))
                     (widen)
                     (let ((coding-system-for-read
!                           ;; Auto-saved file shoule be read by Emacs'
                            ;; internal coding.
                            (if auto-save-p 'auto-save-coding
                              (or coding-system-for-read
--- 3878,3884 ----
                           (unlock-buffer)))
                     (widen)
                     (let ((coding-system-for-read
!                           ;; Auto-saved file should be read by Emacs'
                            ;; internal coding.
                            (if auto-save-p 'auto-save-coding
                              (or coding-system-for-read
***************
*** 3881,3887 ****
                             (insert-file-contents file-name (not auto-save-p)
                                                   nil nil t))
                         (insert-file-contents file-name (not auto-save-p)
!                                              nil nil t)))))
                 ;; Recompute the truename in case changes in symlinks
                 ;; have changed the truename.
                 (setq buffer-file-truename
--- 3894,3900 ----
                             (insert-file-contents file-name (not auto-save-p)
                                                   nil nil t))
                         (insert-file-contents file-name (not auto-save-p)
!                                              nil nil t))))))
                 ;; Recompute the truename in case changes in symlinks
                 ;; have changed the truename.
                 (setq buffer-file-truename

reply via email to

[Prev in Thread] Current Thread [Next in Thread]