autorevert.el 19.2 KB
Newer Older
1
;;; autorevert.el --- revert buffers when files on disk change
Richard M. Stallman's avatar
Richard M. Stallman committed
2

Luc Teirlinck's avatar
Luc Teirlinck committed
3
;; Copyright (C) 1997, 1998, 1999, 2001, 2004 Free Software Foundation, Inc.
Richard M. Stallman's avatar
Richard M. Stallman committed
4

5
;; Author: Anders Lindgren <andersl@andersl.com>
Dan Nicolaescu's avatar
Dan Nicolaescu committed
6
;; Keywords: convenience
7 8
;; Created: 1997-06-01
;; Date: 1999-11-30
Richard M. Stallman's avatar
Richard M. Stallman committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

;; This file is part of GNU Emacs.

;; 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 2, 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
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; 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., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;;; Commentary:

;; Introduction:
;;
;; Whenever a file that Emacs is editing has been changed by another
Dave Love's avatar
Dave Love committed
32
;; program the user normally has to execute the command `revert-buffer'
Richard M. Stallman's avatar
Richard M. Stallman committed
33 34 35
;; to load the new content of the file into Emacs.
;;
;; This package contains two minor modes: Global Auto-Revert Mode and
Dave Love's avatar
Dave Love committed
36
;; Auto-Revert Mode.  Both modes automatically revert buffers
37 38
;; whenever the corresponding files have been changed on disk and the
;; buffer contains no unsaved changes.
Richard M. Stallman's avatar
Richard M. Stallman committed
39
;;
Luc Teirlinck's avatar
Luc Teirlinck committed
40 41 42 43 44 45
;; Auto-Revert Mode can be activated for individual buffers.  Global
;; Auto-Revert Mode applies to all file buffers. (If the user option
;; `global-auto-revert-non-file-buffers' is non-nil, it also applies
;; to some non-file buffers.  This option is disabled by default.)
;; Since checking a remote file is too slow, these modes do not check
;; or revert remote files.
Richard M. Stallman's avatar
Richard M. Stallman committed
46
;;
Dave Love's avatar
Dave Love committed
47 48 49 50 51
;; 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).
52 53 54 55 56 57 58 59 60 61 62
;;
;; After reverting a file buffer, Auto Revert Mode normally puts point
;; at the same position that a regular manual revert would.  However,
;; there is one exception to this rule.  If point is at the end of the
;; buffer before reverting, it stays at the end.  Similarly if point
;; is displayed at the end of a file buffer in any window, it will stay
;; at the end of the buffer in that window, even if the window is not
;; selected.  This way, you can use Auto Revert Mode to `tail' a file.
;; Just put point at the end of the buffer and it will stay there.
;; These rules apply to file buffers. For non-file buffers, the
;; behavior may be mode dependent.
63 64 65 66 67 68 69
;;
;; While you can use Auto Revert Mode to tail a file, this package
;; contains a third minor mode, Auto Revert Tail Mode, which does so
;; more efficiently, as long as you are sure that the file will only
;; change by growing at the end.  It only appends the new output,
;; instead of reverting the entire buffer.  It does so even if the
;; buffer contains unsaved changes.  (Because they will not be lost.)
Richard M. Stallman's avatar
Richard M. Stallman committed
70 71 72

;; Usage:
;;
73
;; Go to the appropriate buffer and press either of:
Richard M. Stallman's avatar
Richard M. Stallman committed
74
;;   M-x auto-revert-mode RET
75
;;   M-x auto-revert-tail-mode RET
Richard M. Stallman's avatar
Richard M. Stallman committed
76 77 78 79
;;
;; To activate Global Auto-Revert Mode, press:
;;   M-x global-auto-revert-mode RET
;;
Dave Love's avatar
Dave Love committed
80 81 82
;; 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:
Richard M. Stallman's avatar
Richard M. Stallman committed
83 84 85 86 87 88 89 90 91 92 93 94 95 96
;;   (global-auto-revert-mode 1)
;;
;; The function `turn-on-auto-revert-mode' could be added to any major
;; mode hook to activate Auto-Revert Mode for all buffers in that
;; mode.  For example, the following line will activate Auto-Revert
;; Mode in all C mode buffers:
;;
;; (add-hook 'c-mode-hook 'turn-on-auto-revert-mode)

;;; Code:

;; Dependencies:

(require 'timer)
97

98
(eval-when-compile (require 'cl))
Richard M. Stallman's avatar
Richard M. Stallman committed
99 100 101 102 103 104 105 106


;; Custom Group:
;;
;; The two modes will be placed next to Auto Save Mode under the
;; Files group under Emacs.

(defgroup auto-revert nil
Dave Love's avatar
Dave Love committed
107
  "Revert individual buffers when files on disk change.
Richard M. Stallman's avatar
Richard M. Stallman committed
108 109 110

Auto-Revert Mode can be activated for individual buffer.
Global Auto-Revert Mode applies to all buffers."
Dan Nicolaescu's avatar
Dan Nicolaescu committed
111 112
  :group 'files
  :group 'convenience)
Richard M. Stallman's avatar
Richard M. Stallman committed
113 114 115 116


;; Variables:

117 118
;;; What's this?: ;; Autoload for the benefit of `make-mode-line-mouse-sensitive'.
;;; What's this?: ;;;###autoload
Richard M. Stallman's avatar
Richard M. Stallman committed
119 120
(defvar auto-revert-mode nil
  "*Non-nil when Auto-Revert Mode is active.
121 122
Never set this variable directly, use the command `auto-revert-mode' instead.")
(put 'auto-revert-mode 'permanent-local t)
Richard M. Stallman's avatar
Richard M. Stallman committed
123

124 125
(defvar auto-revert-tail-mode nil
  "*Non-nil when Auto-Revert Tail Mode is active.
126 127
Never set this variable directly, use the command
`auto-revert-tail-mode' instead.")
128 129
(put 'auto-revert-tail-mode 'permanent-local t)

130 131 132
(defvar auto-revert-timer nil
  "Timer used by Auto-Revert Mode.")

Richard M. Stallman's avatar
Richard M. Stallman committed
133
(defcustom auto-revert-interval 5
134
  "Time, in seconds, between Auto-Revert Mode file checks.
135 136 137 138 139 140 141 142 143
The value may be an integer or floating point number.

If a timer is already active, there are two ways to make sure
that the new value will take effect immediately.  You can set
this variable through Custom or you can call the command
`auto-revert-set-timer' after setting the variable.  Otherwise,
the new value will take effect the first time Auto Revert Mode
calls `auto-revert-set-timer' for internal reasons or in your
next editing session."
Richard M. Stallman's avatar
Richard M. Stallman committed
144
  :group 'auto-revert
145 146 147 148 149 150
  :type 'number
  :set (lambda (variable value)
	 (set-default variable value)
	 (and (boundp 'auto-revert-timer)
	      auto-revert-timer
	      (auto-revert-set-timer))))
Richard M. Stallman's avatar
Richard M. Stallman committed
151 152 153 154 155 156 157 158

(defcustom auto-revert-stop-on-user-input t
  "When non-nil Auto-Revert Mode stops checking files on user input."
  :group 'auto-revert
  :type 'boolean)

(defcustom auto-revert-verbose t
  "When nil, Auto-Revert Mode will not generate any messages.
159
When non-nil, a message is generated whenever a file is reverted."
Richard M. Stallman's avatar
Richard M. Stallman committed
160 161 162 163 164 165 166 167 168 169 170
  :group 'auto-revert
  :type 'boolean)

(defcustom auto-revert-mode-text " ARev"
  "String to display in the mode line when Auto-Revert Mode is active.

\(When the string is not empty, make sure that it has a leading space.)"
  :tag "Auto Revert Mode Text"		; To separate it from `global-...'
  :group 'auto-revert
  :type 'string)

171 172 173 174 175
(defcustom auto-revert-tail-mode-text " Tail"
  "String to display in the mode line when Auto-Revert Tail Mode is active.

\(When the string is not empty, make sure that it has a leading space.)"
  :group 'auto-revert
176 177
  :type 'string
  :version "21.4")
178

Richard M. Stallman's avatar
Richard M. Stallman committed
179 180 181 182 183 184 185 186 187 188
(defcustom auto-revert-mode-hook nil
  "Functions to run when Auto-Revert Mode is activated."
  :tag "Auto Revert Mode Hook"		; To separate it from `global-...'
  :group 'auto-revert
  :type 'hook)

(defcustom global-auto-revert-mode-text ""
  "String to display when Global Auto-Revert Mode is active.

The default is nothing since when this mode is active this text doesn't
Dave Love's avatar
Dave Love committed
189
vary over time, or between buffers.  Hence mode line text
Richard M. Stallman's avatar
Richard M. Stallman committed
190 191 192 193 194 195 196 197 198 199
would only waste precious space."
  :group 'auto-revert
  :type 'string)

(defcustom global-auto-revert-mode-hook nil
  "Hook called when Global Auto-Revert Mode is activated."
  :group 'auto-revert
  :type 'hook)

(defcustom global-auto-revert-non-file-buffers nil
200
  "When nil, Global Auto-Revert mode operates only on file-visiting buffers.
Richard M. Stallman's avatar
Richard M. Stallman committed
201 202

When non-nil, both file buffers and buffers with a custom
203
`revert-buffer-function' and a `buffer-stale-function' are
204 205 206 207 208
reverted by Global Auto-Revert mode.  These include the Buffer
List buffer, and Dired buffers showing complete local
directories.  Dired buffers do not auto-revert as a result of
changes in subdirectories or in the contents, size, modes, etc.,
of files.  You may still sometimes want to revert them manually.
209

210
Use this option with care since it could lead to excessive auto-reverts.
211
For more information, see Info node `(emacs-xtra)Autorevert'."
Richard M. Stallman's avatar
Richard M. Stallman committed
212
  :group 'auto-revert
213 214
  :type 'boolean
  :link '(info-link "(emacs-xtra)Autorevert"))
Richard M. Stallman's avatar
Richard M. Stallman committed
215

216
(defcustom global-auto-revert-ignore-modes ()
Richard M. Stallman's avatar
Richard M. Stallman committed
217 218 219 220 221 222 223 224 225 226
  "List of major modes Global Auto-Revert Mode should not check."
  :group 'auto-revert
  :type '(repeat sexp))

(defcustom auto-revert-load-hook nil
  "Functions to run when Auto-Revert Mode is first loaded."
  :tag "Load Hook"
  :group 'auto-revert
  :type 'hook)

227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
(defcustom auto-revert-check-vc-info nil
  "If non-nil Auto Revert Mode reliably updates version control info.
Auto Revert Mode updates version control info whenever the buffer
needs reverting, regardless of the value of this variable.
However, the version control state can change without changes to
the work file.  If the change is made from the current Emacs
session, all info is updated.  But if, for instance, a new
version is checked in from outside the current Emacs session, the
version control number in the mode line, as well as other version
control related information, may not be properly updated.  If you
are worried about this, set this variable to a non-nil value.

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"
  :group 'auto-revert
  :type 'boolean
  :version "21.4")

Richard M. Stallman's avatar
Richard M. Stallman committed
248
(defvar global-auto-revert-ignore-buffer nil
249
  "*When non-nil, Global Auto-Revert Mode will not revert this buffer.
Richard M. Stallman's avatar
Richard M. Stallman committed
250

Dave Love's avatar
Dave Love committed
251
This variable becomes buffer local when set in any fashion.")
Richard M. Stallman's avatar
Richard M. Stallman committed
252 253 254 255
(make-variable-buffer-local 'global-auto-revert-ignore-buffer)

;; Internal variables:

256
(defvar auto-revert-buffer-list ()
Richard M. Stallman's avatar
Richard M. Stallman committed
257 258 259 260 261 262 263 264
  "List of buffers in Auto-Revert Mode.

Note that only Auto-Revert Mode, never Global Auto-Revert Mode, adds
buffers to this list.

The timer function `auto-revert-buffers' is responsible for purging
the list of old buffers.")

265
(defvar auto-revert-remaining-buffers ()
Richard M. Stallman's avatar
Richard M. Stallman committed
266 267
  "Buffers not checked when user input stopped execution.")

268 269 270 271 272 273 274
(defvar auto-revert-tail-pos 0
  "Position of last known end of file.")

(add-hook 'find-file-hook
	  (lambda ()
	    (set (make-local-variable 'auto-revert-tail-pos)
		 (save-restriction (widen) (1- (point-max))))))
Richard M. Stallman's avatar
Richard M. Stallman committed
275 276 277 278

;; Functions:

;;;###autoload
279
(define-minor-mode auto-revert-mode
Dave Love's avatar
Dave Love committed
280
  "Toggle reverting buffer when file on disk changes.
Richard M. Stallman's avatar
Richard M. Stallman committed
281

Dave Love's avatar
Dave Love committed
282 283
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.
284 285 286
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."
287
  nil auto-revert-mode-text nil
Richard M. Stallman's avatar
Richard M. Stallman committed
288 289 290 291 292 293 294
  (if auto-revert-mode
      (if (not (memq (current-buffer) auto-revert-buffer-list))
	  (push (current-buffer) auto-revert-buffer-list))
    (setq auto-revert-buffer-list
	  (delq (current-buffer) auto-revert-buffer-list)))
  (auto-revert-set-timer)
  (when auto-revert-mode
295 296
    (auto-revert-buffers)
    (setq auto-revert-tail-mode nil)))
Richard M. Stallman's avatar
Richard M. Stallman committed
297 298 299 300 301 302 303 304 305 306 307


;;;###autoload
(defun turn-on-auto-revert-mode ()
  "Turn on Auto-Revert Mode.

This function is designed to be added to hooks, for example:
  (add-hook 'c-mode-hook 'turn-on-auto-revert-mode)"
  (auto-revert-mode 1))


308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
;;;###autoload
(define-minor-mode auto-revert-tail-mode
  "Toggle reverting tail of buffer when file on disk grows.
With arg, turn Tail mode on iff arg is positive.

When Tail mode is enabled, the tail of the file is constantly
followed, as with the shell command `tail -f'.  This means that
whenever the file grows on disk (presumably because some
background process is appending to it from time to time), this is
reflected in the current buffer.

You can edit the buffer and turn this mode off and on again as
you please.  But make sure the background process has stopped
writing before you save the file!

Use `auto-revert-mode' for changes other than appends!"
  :group 'find-file :lighter auto-revert-tail-mode-text
  (when auto-revert-tail-mode
    (unless buffer-file-name
      (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
	     (not (y-or-n-p "Buffer is modified, so tail offset may be wrong.  Proceed? ")))
	(auto-revert-tail-mode 0)
      ;; 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)
	       (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
	  (let ((auto-revert-tail-mode t))
	    (auto-revert-mode 1)))
      (setq auto-revert-mode nil))))


;;;###autoload
(defun turn-on-auto-revert-tail-mode ()
  "Turn on Auto-Revert Tail Mode.

This function is designed to be added to hooks, for example:
  (add-hook 'my-logfile-mode-hook 'turn-on-auto-revert-tail-mode)"
  (auto-revert-tail-mode 1))


Richard M. Stallman's avatar
Richard M. Stallman committed
354
;;;###autoload
355
(define-minor-mode global-auto-revert-mode
356
  "Revert any buffer when file on disk changes.
Richard M. Stallman's avatar
Richard M. Stallman committed
357

Dave Love's avatar
Dave Love committed
358 359
With arg, turn Auto Revert mode on globally if and only if arg is positive.
This is a minor mode that affects all buffers.
Richard M. Stallman's avatar
Richard M. Stallman committed
360
Use `auto-revert-mode' to revert a particular buffer."
361
  :global t :group 'auto-revert :lighter global-auto-revert-mode-text
Richard M. Stallman's avatar
Richard M. Stallman committed
362 363
  (auto-revert-set-timer)
  (when global-auto-revert-mode
364
    (auto-revert-buffers)))
Richard M. Stallman's avatar
Richard M. Stallman committed
365 366 367


(defun auto-revert-set-timer ()
368
  "Restart or cancel the timer used by Auto-Revert Mode.
369
If such a timer is active, cancel it.  Start a new timer if
370 371 372
Global Auto-Revert Mode is active or if Auto-Revert Mode is active
in some buffer.  Restarting the timer ensures that Auto-Revert Mode
will use an up-to-date value of `auto-revert-interval'"
373
  (interactive)
Richard M. Stallman's avatar
Richard M. Stallman committed
374 375
  (if (timerp auto-revert-timer)
      (cancel-timer auto-revert-timer))
376 377 378 379
  (setq auto-revert-timer
	(if (or global-auto-revert-mode auto-revert-buffer-list)
	    (run-with-timer auto-revert-interval
			    auto-revert-interval
380
			    'auto-revert-buffers))))
Richard M. Stallman's avatar
Richard M. Stallman committed
381

382 383 384
(defun auto-revert-active-p ()
  "Check if auto-revert is active (in current buffer or globally)."
  (or auto-revert-mode
385
      auto-revert-tail-mode
386 387 388 389 390 391 392
      (and
       global-auto-revert-mode
       (not global-auto-revert-ignore-buffer)
       (not (memq major-mode
		  global-auto-revert-ignore-modes)))))

(defun auto-revert-handler ()
393 394
  "Revert current buffer, if appropriate.
This is an internal function used by Auto-Revert Mode."
395 396 397 398 399 400 401
  (when (or auto-revert-tail-mode (not (buffer-modified-p)))
    (let* ((buffer (current-buffer))
	   (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)))
402
		(and (or auto-revert-mode
403 404 405 406 407 408
			 global-auto-revert-non-file-buffers)
		     revert-buffer-function
		     (boundp 'buffer-stale-function)
		     (functionp buffer-stale-function)
		     (funcall buffer-stale-function t))))
	   eob eoblist)
409
      (when revert
410 411
	(when (and auto-revert-verbose
		   (not (eq revert 'fast)))
412
	  (message "Reverting buffer `%s'." (buffer-name)))
413 414 415 416 417 418 419 420 421 422 423
	;; If point (or a window point) is at the end of the buffer,
	;; we want to keep it at the end after reverting.  This allows
	;; to tail a file.
	(when buffer-file-name
	  (setq eob (eobp))
	  (walk-windows
	   #'(lambda (window)
	       (and (eq (window-buffer window) buffer)
		    (= (window-point window) (point-max))
		    (push window eoblist)))
	   'no-mini t))
424 425
	(if auto-revert-tail-mode
	    (auto-revert-tail-handler)
Richard M. Stallman's avatar
Richard M. Stallman committed
426 427 428
	  ;; 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.
429 430
	  (let ((buffer-read-only buffer-read-only))
	    (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes)))
431 432 433 434
	(when buffer-file-name
	  (when eob (goto-char (point-max)))
	  (dolist (window eoblist)
	    (set-window-point window (point-max)))))
435 436 437 438
      ;; `preserve-modes' avoids changing the (minor) modes.  But we
      ;; do want to reset the mode for VC, so we do it manually.
      (when (or revert auto-revert-check-vc-info)
	(vc-find-file-hook)))))
439

440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
(defun auto-revert-tail-handler ()
  (let ((size (nth 7 (file-attributes buffer-file-name)))
	(modified (buffer-modified-p))
	buffer-read-only		; ignore
	(file buffer-file-name)
	buffer-file-name)		; ignore that file has changed
    (when (> size auto-revert-tail-pos)
      (save-restriction
	(widen)
	(save-excursion
	  (goto-char (point-max))
	  (insert-file-contents file nil auto-revert-tail-pos size)))
      (setq auto-revert-tail-pos size)
      (set-buffer-modified-p modified)))
  (set-visited-file-modtime))

Richard M. Stallman's avatar
Richard M. Stallman committed
456 457 458 459 460 461 462 463
(defun auto-revert-buffers ()
  "Revert buffers as specified by Auto-Revert and Global Auto-Revert Mode.

Should `global-auto-revert-mode' be active all file buffers are checked.

Should `auto-revert-mode' be active in some buffers, those buffers
are checked.

464 465 466 467 468
Non-file buffers that have a custom `revert-buffer-function' and
a `buffer-stale-function' are 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.
Richard M. Stallman's avatar
Richard M. Stallman committed
469

Dave Love's avatar
Dave Love committed
470
This function stops whenever there is user input.  The buffers not
Richard M. Stallman's avatar
Richard M. Stallman committed
471 472 473 474 475
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.

Dave Love's avatar
Dave Love committed
476
This function is also responsible for removing buffers no longer in
Richard M. Stallman's avatar
Richard M. Stallman committed
477 478 479 480 481
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))
482 483
	(remaining ())
	(new ()))
Richard M. Stallman's avatar
Richard M. Stallman committed
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
    ;; 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?
500
	    (with-current-buffer buf
Richard M. Stallman's avatar
Richard M. Stallman committed
501 502 503
	      ;; 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)
504
		       (not auto-revert-tail-mode)
Richard M. Stallman's avatar
Richard M. Stallman committed
505 506 507
		       (memq buf auto-revert-buffer-list))
		  (setq auto-revert-buffer-list
			(delq buf auto-revert-buffer-list)))
508
	      (when (auto-revert-active-p) (auto-revert-handler)))
Richard M. Stallman's avatar
Richard M. Stallman committed
509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525
	  ;; 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:
(provide 'autorevert)

(run-hooks 'auto-revert-load-hook)

Miles Bader's avatar
Miles Bader committed
526
;;; arch-tag: f6bcb07b-4841-477e-9e44-b18678e58876
527
;;; autorevert.el ends here