X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/9e559f9bda85798bffcca41d66d77df579af90af..614b38a99518cb219f3b24016ca8aa638f0581be:/lisp/autorevert.el diff --git a/lisp/autorevert.el b/lisp/autorevert.el index 45d8d2b2cc..9892dca2d4 100644 --- a/lisp/autorevert.el +++ b/lisp/autorevert.el @@ -1,6 +1,7 @@ ;;; autorevert.el --- revert buffers when files on disk change -;; Copyright (C) 1997, 1998, 1999, 2001, 2004 Free Software Foundation, Inc. +;; Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003, 2004, +;; 2005 Free Software Foundation, Inc. ;; Author: Anders Lindgren ;; Keywords: convenience @@ -21,8 +22,8 @@ ;; 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., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: @@ -150,12 +151,18 @@ next editing session." (auto-revert-set-timer)))) (defcustom auto-revert-stop-on-user-input t - "When non-nil Auto-Revert Mode stops checking files on user input." + "When non-nil, user input temporarily interrupts Auto-Revert Mode. +With this setting, Auto-Revert Mode checks for user input after +handling each buffer and does not process any further buffers +\(until the next run of the timer) if user input is available. +When nil, Auto-Revert Mode checks files and reverts buffers, +with quitting disabled, without paying attention to user input. +Thus, with this setting, Emacs might be non-responsive at times." :group 'auto-revert :type 'boolean) (defcustom auto-revert-verbose t - "When nil, Auto-Revert Mode will not generate any messages. + "When nil, Auto-Revert Mode does not generate any messages. When non-nil, a message is generated whenever a file is reverted." :group 'auto-revert :type 'boolean) @@ -174,7 +181,7 @@ When non-nil, a message is generated whenever a file is reverted." \(When the string is not empty, make sure that it has a leading space.)" :group 'auto-revert :type 'string - :version "21.4") + :version "22.1") (defcustom auto-revert-mode-hook nil "Functions to run when Auto-Revert Mode is activated." @@ -240,10 +247,10 @@ This currently works by automatically updating the version control info every `auto-revert-interval' seconds. Nevertheless, it should not cause excessive CPU usage on a reasonably fast machine, if it does not apply to too many version controlled -buffers. CPU usage depends on the version control system" +buffers. CPU usage depends on the version control system." :group 'auto-revert :type 'boolean - :version "21.4") + :version "22.1") (defvar global-auto-revert-ignore-buffer nil "*When non-nil, Global Auto-Revert Mode will not revert this buffer. @@ -284,7 +291,7 @@ This is a minor mode that affects only the current buffer. Use `global-auto-revert-mode' to automatically revert all buffers. Use `auto-revert-tail-mode' if you know that the file will only grow without being changed in the part that is already in the buffer." - nil auto-revert-mode-text nil + :group 'auto-revert :lighter auto-revert-mode-text (if auto-revert-mode (if (not (memq (current-buffer) auto-revert-buffer-list)) (push (current-buffer) auto-revert-buffer-list)) @@ -333,7 +340,7 @@ Use `auto-revert-mode' for changes other than appends!" ;; 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 - (set (make-variable-buffer-local 'auto-revert-tail-pos) + (set (make-local-variable 'auto-revert-tail-pos) (save-restriction (widen) (1- (point-max))))) ;; let auto-revert-mode set up the mechanism for us if it isn't already (or auto-revert-mode @@ -444,11 +451,13 @@ This is an internal function used by Auto-Revert Mode." (file buffer-file-name) buffer-file-name) ; ignore that file has changed (when (> size auto-revert-tail-pos) + (undo-boundary) (save-restriction (widen) (save-excursion (goto-char (point-max)) (insert-file-contents file nil auto-revert-tail-pos size))) + (undo-boundary) (setq auto-revert-tail-pos size) (set-buffer-modified-p modified))) (set-visited-file-modtime)) @@ -476,46 +485,47 @@ are checked first the next time this function is called. This function is also responsible for removing buffers no longer in Auto-Revert mode from `auto-revert-buffer-list', and for canceling the timer when no buffers need to be checked." - (let ((bufs (if global-auto-revert-mode - (buffer-list) - auto-revert-buffer-list)) - (remaining ()) - (new ())) - ;; Partition `bufs' into two halves depending on whether or not - ;; the buffers are in `auto-revert-remaining-buffers'. The two - ;; halves are then re-joined with the "remaining" buffers at the - ;; head of the list. - (dolist (buf auto-revert-remaining-buffers) - (if (memq buf bufs) - (push buf remaining))) - (dolist (buf bufs) - (if (not (memq buf remaining)) - (push buf new))) - (setq bufs (nreverse (nconc new remaining))) - (while (and bufs - (not (and auto-revert-stop-on-user-input - (input-pending-p)))) - (let ((buf (car bufs))) - (if (buffer-name buf) ; Buffer still alive? - (with-current-buffer buf - ;; Test if someone has turned off Auto-Revert Mode in a - ;; non-standard way, for example by changing major mode. - (if (and (not auto-revert-mode) - (not auto-revert-tail-mode) - (memq buf auto-revert-buffer-list)) - (setq auto-revert-buffer-list - (delq buf auto-revert-buffer-list))) - (when (auto-revert-active-p) (auto-revert-handler))) - ;; Remove dead buffer from `auto-revert-buffer-list'. - (setq auto-revert-buffer-list - (delq buf auto-revert-buffer-list)))) - (setq bufs (cdr bufs))) - (setq auto-revert-remaining-buffers bufs) - ;; Check if we should cancel the timer. - (when (and (not global-auto-revert-mode) - (null auto-revert-buffer-list)) - (cancel-timer auto-revert-timer) - (setq auto-revert-timer nil)))) + (save-match-data + (let ((bufs (if global-auto-revert-mode + (buffer-list) + auto-revert-buffer-list)) + (remaining ()) + (new ())) + ;; Partition `bufs' into two halves depending on whether or not + ;; the buffers are in `auto-revert-remaining-buffers'. The two + ;; halves are then re-joined with the "remaining" buffers at the + ;; head of the list. + (dolist (buf auto-revert-remaining-buffers) + (if (memq buf bufs) + (push buf remaining))) + (dolist (buf bufs) + (if (not (memq buf remaining)) + (push buf new))) + (setq bufs (nreverse (nconc new remaining))) + (while (and bufs + (not (and auto-revert-stop-on-user-input + (input-pending-p)))) + (let ((buf (car bufs))) + (if (buffer-name buf) ; Buffer still alive? + (with-current-buffer buf + ;; Test if someone has turned off Auto-Revert Mode in a + ;; non-standard way, for example by changing major mode. + (if (and (not auto-revert-mode) + (not auto-revert-tail-mode) + (memq buf auto-revert-buffer-list)) + (setq auto-revert-buffer-list + (delq buf auto-revert-buffer-list))) + (when (auto-revert-active-p) (auto-revert-handler))) + ;; Remove dead buffer from `auto-revert-buffer-list'. + (setq auto-revert-buffer-list + (delq buf auto-revert-buffer-list)))) + (setq bufs (cdr bufs))) + (setq auto-revert-remaining-buffers bufs) + ;; Check if we should cancel the timer. + (when (and (not global-auto-revert-mode) + (null auto-revert-buffer-list)) + (cancel-timer auto-revert-timer) + (setq auto-revert-timer nil))))) ;; The end: