X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/409cc4a3ea9e7461572a04f021ff3993e9a516f6..ae8ba4092c4b068779cdd8a8705d4a7872bee9c4:/lisp/autorevert.el diff --git a/lisp/autorevert.el b/lisp/autorevert.el index 8eda9e0ece..5eb6fb07f9 100644 --- a/lisp/autorevert.el +++ b/lisp/autorevert.el @@ -1,7 +1,7 @@ ;;; 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 ;; Keywords: convenience @@ -10,10 +10,10 @@ ;; 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 @@ -21,9 +21,7 @@ ;; 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 . ;;; Commentary: @@ -276,9 +274,9 @@ the list of old buffers.") "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: @@ -334,7 +332,7 @@ Use `auto-revert-mode' for changes other than appends!" (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 @@ -348,11 +346,11 @@ Use `auto-revert-mode' for changes other than appends!" ;; 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 @@ -416,12 +414,16 @@ will use an up-to-date value of `auto-revert-interval'" "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 @@ -445,7 +447,7 @@ This is an internal function used by Auto-Revert Mode." (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. @@ -460,23 +462,26 @@ This is an internal function used by Auto-Revert Mode." (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 () @@ -523,7 +528,7 @@ the timer when no buffers need to be checked." (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. @@ -550,5 +555,5 @@ the timer when no buffers need to be checked." (run-hooks 'auto-revert-load-hook) -;;; arch-tag: f6bcb07b-4841-477e-9e44-b18678e58876 +;; arch-tag: f6bcb07b-4841-477e-9e44-b18678e58876 ;;; autorevert.el ends here