;;; autorevert.el --- revert buffers when files on disk change
;; Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
;; Author: Anders Lindgren <andersl@andersl.com>
;; Keywords: convenience
;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
"Position of last known end of file.")
(add-hook 'find-file-hook
- (lambda ()
- (set (make-local-variable 'auto-revert-tail-pos)
- (nth 7 (file-attributes buffer-file-name)))))
+ (lambda ()
+ (set (make-local-variable 'auto-revert-tail-pos)
+ (nth 7 (file-attributes buffer-file-name)))))
;; Functions:
(auto-revert-tail-mode 0)
(error "This buffer is not visiting a file"))
(if (and (buffer-modified-p)
- (not auto-revert-tail-pos) ; library was loaded only after finding file
+ (zerop auto-revert-tail-pos) ; library was loaded only after finding file
(not (y-or-n-p "Buffer is modified, so tail offset may be wrong. Proceed? ")))
(auto-revert-tail-mode 0)
;; a-r-tail-pos stores the size of the file at the time of the
;; revert, then you might miss some output then happened
;; between visiting the file and activating a-r-t-mode.
(and (zerop auto-revert-tail-pos)
- (not (verify-visited-file-modtime (current-buffer)))
- (y-or-n-p "File changed on disk, content may be missing. \
+ (not (verify-visited-file-modtime (current-buffer)))
+ (y-or-n-p "File changed on disk, content may be missing. \
Perform a full revert? ")
- ;; Use this (not just revert-buffer) for point-preservation.
- (auto-revert-handler))
+ ;; Use this (not just revert-buffer) for point-preservation.
+ (auto-revert-handler))
;; else we might reappend our own end when we save
(add-hook 'before-save-hook (lambda () (auto-revert-tail-mode 0)) nil t)
(or (local-variable-p 'auto-revert-tail-pos) ; don't lose prior position
"Revert current buffer, if appropriate.
This is an internal function used by Auto-Revert Mode."
(when (or auto-revert-tail-mode (not (buffer-modified-p)))
- (let* ((buffer (current-buffer))
+ (let* ((buffer (current-buffer)) size
(revert
(or (and buffer-file-name
(not (file-remote-p buffer-file-name))
(file-readable-p buffer-file-name)
- (not (verify-visited-file-modtime buffer)))
+ (if auto-revert-tail-mode
+ (/= auto-revert-tail-pos
+ (setq size
+ (nth 7 (file-attributes buffer-file-name))))
+ (not (verify-visited-file-modtime buffer))))
(and (or auto-revert-mode
global-auto-revert-non-file-buffers)
revert-buffer-function
(push window eoblist)))
'no-mini t))
(if auto-revert-tail-mode
- (auto-revert-tail-handler)
+ (auto-revert-tail-handler size)
;; Bind buffer-read-only in case user has done C-x C-q,
;; so as not to forget that. This gives undesirable results
;; when the file's mode changes, but that is less common.
(when (or revert auto-revert-check-vc-info)
(vc-find-file-hook)))))
-(defun auto-revert-tail-handler ()
- (let ((size (nth 7 (file-attributes buffer-file-name)))
- (modified (buffer-modified-p))
- buffer-read-only ; ignore
+(defun auto-revert-tail-handler (size)
+ (let ((modified (buffer-modified-p))
+ (inhibit-read-only t) ; Ignore.
(file buffer-file-name)
- buffer-file-name) ; ignore that file has changed
- (when (> size auto-revert-tail-pos)
+ (buffer-file-name nil)) ; Ignore that file has changed.
+ (when (/= auto-revert-tail-pos size)
+ (run-hooks 'before-revert-hook)
(undo-boundary)
(save-restriction
(widen)
(save-excursion
(goto-char (point-max))
- (insert-file-contents file nil auto-revert-tail-pos size)))
- (run-mode-hooks 'after-revert-hook)
+ (insert-file-contents file nil
+ (and (< auto-revert-tail-pos size)
+ auto-revert-tail-pos)
+ size)))
+ (run-hooks 'after-revert-hook)
(undo-boundary)
(setq auto-revert-tail-pos size)
- (set-buffer-modified-p modified)))
+ (restore-buffer-modified-p modified)))
(set-visited-file-modtime))
(defun auto-revert-buffers ()
(not (and auto-revert-stop-on-user-input
(input-pending-p))))
(let ((buf (car bufs)))
- (if (buffer-name buf) ; Buffer still alive?
+ (if (buffer-live-p buf)
(with-current-buffer buf
;; Test if someone has turned off Auto-Revert Mode in a
;; non-standard way, for example by changing major mode.
(run-hooks 'auto-revert-load-hook)
-;;; arch-tag: f6bcb07b-4841-477e-9e44-b18678e58876
+;; arch-tag: f6bcb07b-4841-477e-9e44-b18678e58876
;;; autorevert.el ends here