+ (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))))
+
+(defun auto-revert-active-p ()
+ "Check if auto-revert is active (in current buffer or globally)."
+ (or auto-revert-mode
+ auto-revert-tail-mode
+ (and
+ global-auto-revert-mode
+ (not global-auto-revert-ignore-buffer)
+ (not (memq major-mode
+ global-auto-revert-ignore-modes)))))
+
+(defun auto-revert-handler ()
+ "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))
+ (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)))
+ (and (or auto-revert-mode
+ global-auto-revert-non-file-buffers)
+ revert-buffer-function
+ (boundp 'buffer-stale-function)
+ (functionp buffer-stale-function)
+ (funcall buffer-stale-function t))))
+ eob eoblist)
+ (when revert
+ (when (and auto-revert-verbose
+ (not (eq revert 'fast)))
+ (message "Reverting buffer `%s'." (buffer-name)))
+ ;; 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))
+ (if auto-revert-tail-mode
+ (auto-revert-tail-handler)
+ ;; 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.
+ (let ((buffer-read-only buffer-read-only))
+ (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes)))
+ (when buffer-file-name
+ (when eob (goto-char (point-max)))
+ (dolist (window eoblist)
+ (set-window-point window (point-max)))))
+ ;; `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)))))
+
+(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)
+ (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))