unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: martin rudalics <rudalics@gmx.at>
Cc: emacs-devel@gnu.org
Subject: Re: reverting buffer from non-existent file
Date: Tue, 07 Feb 2006 10:44:11 +0100	[thread overview]
Message-ID: <43E86BEB.5090105@gmx.at> (raw)
In-Reply-To: <E1F6Lzk-0005ex-7l@fencepost.gnu.org>

[-- Attachment #1: Type: text/plain, Size: 505 bytes --]

 > 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.

[-- Attachment #2: files-patch --]
[-- Type: text/plain, Size: 4433 bytes --]

	* 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

[-- Attachment #3: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

  reply	other threads:[~2006-02-07  9:44 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-02-06  7:00 reverting buffer from non-existent file Martin Rudalics
2006-02-07  6:06 ` Richard M. Stallman
2006-02-07  9:44   ` martin rudalics [this message]
2006-02-07 15:31   ` Stefan Monnier
2006-02-07 19:27     ` martin rudalics
2006-02-10  8:45       ` martin rudalics

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=43E86BEB.5090105@gmx.at \
    --to=rudalics@gmx.at \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).