]> code.delx.au - gnu-emacs/blobdiff - lisp/autorevert.el
(comment-indent): Try to align to adjacent comments.
[gnu-emacs] / lisp / autorevert.el
index 344f230b087b65919b5d43e8f77ff3da5e1efb24..9ccb8b896416112f400e3468207df7f34c36e2e4 100644 (file)
@@ -1,10 +1,11 @@
-;; autorevert --- Revert buffers when file on disk change.
+;;; autorevert.el --- revert buffers when files on disk change
 
-;; Copyright (C) 1997 Free Software Foundation, Inc.
+;; Copyright (C) 1997, 1998, 1999, 2001 Free Software Foundation, Inc.
 
-;; Author: Anders Lindgren <andersl@csd.uu.se>
-;; Created: 1 Jun 1997
-;; Date: 3 Jul 1997
+;; Author: Anders Lindgren <andersl@andersl.com>
+;; Keywords: convenience
+;; Created: 1997-06-01
+;; Date: 1999-11-30
 
 ;; This file is part of GNU Emacs.
 
 ;; Introduction:
 ;;
 ;; Whenever a file that Emacs is editing has been changed by another
-;; program the user normally have to execute the command `revert-buffer'
+;; program the user normally has to execute the command `revert-buffer'
 ;; to load the new content of the file into Emacs.
 ;;
 ;; This package contains two minor modes: Global Auto-Revert Mode and
-;; Auto-Revert Mode.  Both modes automatically reverts buffers
+;; Auto-Revert Mode.  Both modes automatically revert buffers
 ;; whenever the corresponding files have been changed on disk.
 ;;
 ;; Auto-Revert Mode can be activated for individual buffers.
 ;; Global Auto-Revert Mode applies to all file buffers.
 ;;
-;; Both modes operates by checking the time stamp of all files at
-;; given intervals, the default is every five seconds.  The check is
-;; aborted whenever the user actually use Emacs.  Hopefully you will
-;; never even notice that this package is active (except that your
-;; buffers will be reverted, of course).
-
-;; Installation:
-;;
-;; To install this package, place it in somewhere on Emacs' load-path,
-;; byte-compile it (not necessary), and place the following lines in
-;; the appropriate init file:
-;;
-;; (autoload 'auto-revert-mode "autorevert" nil t)
-;; (autoload 'turn-on-auto-revert-mode "autorevert" nil nil)
-;; (autoload 'global-auto-revert-mode "autorevert" nil t)
+;; Both modes operate by checking the time stamp of all files at
+;; intervals of `auto-revert-interval'.  The default is every five
+;; seconds.  The check is aborted whenever the user actually uses
+;; Emacs.  You should never even notice that this package is active
+;; (except that your buffers will be reverted, of course).
 
 ;; Usage:
 ;;
@@ -62,8 +53,9 @@
 ;; To activate Global Auto-Revert Mode, press:
 ;;   M-x global-auto-revert-mode RET
 ;;
-;; To activate Global Auto-Revert Mode every time Emacs is started the
-;; following line could be added to your ~/.emacs:
+;; To activate Global Auto-Revert Mode every time Emacs is started
+;; customise the option `global-auto-revert-mode' or the following
+;; line could be added to your ~/.emacs:
 ;;   (global-auto-revert-mode 1)
 ;;
 ;; The function `turn-on-auto-revert-mode' could be added to any major
 ;; Files group under Emacs.
 
 (defgroup auto-revert nil
-  "Revert individual buffer when file on disk change.
+  "Revert individual buffers when files on disk change.
 
 Auto-Revert Mode can be activated for individual buffer.
 Global Auto-Revert Mode applies to all buffers."
-  :group 'files)
+  :group 'files
+  :group 'convenience)
 
 
 ;; Variables:
 
+;; Autoload for the benefit of `make-mode-line-mouse-sensitive'.
+;;;###autoload
 (defvar auto-revert-mode nil
   "*Non-nil when Auto-Revert Mode is active.
-
-Do never set this variable directly, use the command
-`auto-revert-mode' instead.")
-
-(defcustom global-auto-revert-mode nil
-  "When on, buffers are automatically reverted when files on disk change.
-
-Set this variable when using \\[customize] only.  Otherwise, use the
-command `global-auto-revert-mode' instead."
-  :group 'auto-revert
-  :initialize 'custom-initialize-default
-  :set '(lambda (symbol value)
-         (global-auto-revert-mode (or value 0)))
-  :type 'boolean
-  :require 'autorevert)
+Never set this variable directly, use the command `auto-revert-mode' instead.")
+(put 'auto-revert-mode 'permanent-local t)
 
 (defcustom auto-revert-interval 5
   "Time, in seconds, between Auto-Revert Mode file checks."
@@ -150,7 +132,7 @@ deactivated, and whenever a file is reverted."
   "String to display when Global Auto-Revert Mode is active.
 
 The default is nothing since when this mode is active this text doesn't
-vary neither over time, nor between buffers.  Hence a mode line text
+vary over time, or between buffers.  Hence mode line text
 would only waste precious space."
   :group 'auto-revert
   :type 'string)
@@ -160,14 +142,6 @@ would only waste precious space."
   :group 'auto-revert
   :type 'hook)
 
-(defcustom global-auto-revert-non-file-buffers nil
-  "*When nil only file buffers are reverted by Global Auto-Revert Mode.
-
-When non-nil, both file buffers and buffers with a custom
-`revert-buffer-function' are reverted by Global Auto-Revert Mode."
-  :group 'auto-revert
-  :type 'boolean)
-
 (defcustom global-auto-revert-non-file-buffers nil
   "When nil only file buffers are reverted by Global Auto-Revert Mode.
 
@@ -192,7 +166,7 @@ Use this option with care since it could lead to excessive reverts."
 (defvar global-auto-revert-ignore-buffer nil
   "*When non-nil, Global Auto-Revert Mode will not revert this buffer.
 
-This variable becomes buffer local when set in any faishon.")
+This variable becomes buffer local when set in any fashion.")
 (make-variable-buffer-local 'global-auto-revert-ignore-buffer)
 
 
@@ -217,21 +191,13 @@ the list of old buffers.")
 ;; Functions:
 
 ;;;###autoload
-(defun auto-revert-mode (&optional arg)
-  "Revert buffer when file on disk change.
+(define-minor-mode auto-revert-mode
+  "Toggle reverting buffer when file on disk changes.
 
-This is a minor mode that affect only the current buffer.
+With arg, turn Auto Revert mode on if and only if arg is positive.
+This is a minor mode that affects only the current buffer.
 Use `global-auto-revert-mode' to automatically revert all buffers."
-  (interactive "P")
-  (make-local-variable 'auto-revert-mode)
-  (setq auto-revert-mode
-       (if (null arg)
-           (not auto-revert-mode)
-         (> (prefix-numeric-value arg) 0)))
-  (if (and auto-revert-verbose
-          (interactive-p))
-      (message "Auto-Revert Mode is now %s."
-              (if auto-revert-mode "on" "off")))
+  nil auto-revert-mode-text nil
   (if auto-revert-mode
       (if (not (memq (current-buffer) auto-revert-buffer-list))
          (push (current-buffer) auto-revert-buffer-list))
@@ -239,8 +205,7 @@ Use `global-auto-revert-mode' to automatically revert all buffers."
          (delq (current-buffer) auto-revert-buffer-list)))
   (auto-revert-set-timer)
   (when auto-revert-mode
-    (auto-revert-buffers)
-    (run-hooks 'auto-revert-mode-hook)))
+    (auto-revert-buffers)))
 
 
 ;;;###autoload
@@ -253,36 +218,28 @@ This function is designed to be added to hooks, for example:
 
 
 ;;;###autoload
-(defun global-auto-revert-mode (&optional arg)
+(define-minor-mode global-auto-revert-mode
   "Revert any buffer when file on disk change.
 
-This is a minor mode that affect all buffers.
+With arg, turn Auto Revert mode on globally if and only if arg is positive.
+This is a minor mode that affects all buffers.
 Use `auto-revert-mode' to revert a particular buffer."
-  (interactive "P")
-  (setq global-auto-revert-mode
-       (if (null arg)
-           (not global-auto-revert-mode)
-         (> (prefix-numeric-value arg) 0)))
-  (if (and auto-revert-verbose
-          (interactive-p))
-      (message "Global Auto-Revert Mode is now %s."
-              (if global-auto-revert-mode "on" "off")))
+  :global t :group 'auto-revert :lighter global-auto-revert-mode-text
   (auto-revert-set-timer)
   (when global-auto-revert-mode
-    (auto-revert-buffers)      
-    (run-hooks 'global-auto-revert-mode-hook)))
+    (auto-revert-buffers)))
 
 
 (defun auto-revert-set-timer ()
   "Restart or cancel the timer."
   (if (timerp auto-revert-timer)
       (cancel-timer auto-revert-timer))
-  (if (or global-auto-revert-mode auto-revert-buffer-list)
-      (setq auto-revert-timer (run-with-timer auto-revert-interval
-                                             auto-revert-interval
-                                             'auto-revert-buffers))
-    (setq auto-revert-timer nil)))
-
+  (setq auto-revert-timer
+       (if (or global-auto-revert-mode auto-revert-buffer-list)
+           (run-with-timer auto-revert-interval
+                           auto-revert-interval
+                           'auto-revert-buffers)
+         nil)))
 
 (defun auto-revert-buffers ()
   "Revert buffers as specified by Auto-Revert and Global Auto-Revert Mode.
@@ -297,13 +254,13 @@ reverted either when Auto-Revert Mode is active in that buffer, or
 when the variable `global-auto-revert-non-file-buffers' is non-nil
 and Global Auto-Revert Mode is active.
 
-This function stops whenever the user use Emacs.  The buffers not
+This function stops whenever there is user input.  The buffers not
 checked are stored in the variable `auto-revert-remaining-buffers'.
 
 To avoid starvation, the buffers in `auto-revert-remaining-buffers'
 are checked first the next time this function is called.
 
-This function is also responslible for removing buffers no longer in
+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
@@ -327,8 +284,7 @@ the timer when no buffers need to be checked."
                          (input-pending-p))))
       (let ((buf (car bufs)))
        (if (buffer-name buf)           ; Buffer still alive?
-           (save-excursion
-             (set-buffer 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.
              (if (and (not auto-revert-mode)
@@ -352,7 +308,10 @@ the timer when no buffers need to be checked."
                                auto-revert-mode))))
                (if auto-revert-verbose
                    (message "Reverting buffer `%s'." buf))
-               (revert-buffer t t)))
+               (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes)
+               ;; `preserve-modes' avoids changing the (minor) modes.  But we
+               ;; do want to reset the mode for VC, so we do it explicitly.
+               (vc-find-file-hook)))
          ;; Remove dead buffer from `auto-revert-buffer-list'.
          (setq auto-revert-buffer-list
                (delq buf auto-revert-buffer-list))))
@@ -366,21 +325,8 @@ the timer when no buffers need to be checked."
 
 
 ;; The end:
-
-(unless (assq 'auto-revert-mode minor-mode-alist)
-  (push '(auto-revert-mode auto-revert-mode-text)
-       minor-mode-alist))
-(unless (assq 'global-auto-revert-mode minor-mode-alist)
-  (push '(global-auto-revert-mode global-auto-revert-mode-text)
-       minor-mode-alist))
-
 (provide 'autorevert)
 
 (run-hooks 'auto-revert-load-hook)
 
-;; This makes it possible to set Global Auto-Revert Mode from
-;; Customize.
-(if global-auto-revert-mode
-    (global-auto-revert-mode 1))
-
-;; autorevert.el ends here.
+;;; autorevert.el ends here