summaryrefslogtreecommitdiff
path: root/lisp/autorevert.el
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@is.elta.co.il>2004-02-16 13:12:21 +0000
committerEli Zaretskii <eliz@is.elta.co.il>2004-02-16 13:12:21 +0000
commited35db71b41bc7189196455fb9b827d8b20001a6 (patch)
treeb54722fae7aabe4daf8c74a08f2c2b321bf20521 /lisp/autorevert.el
parentebb8cb682a16160f5b2db373f5e7276dd74f1892 (diff)
downloademacs-ed35db71b41bc7189196455fb9b827d8b20001a6.tar.gz
Added support to detect changed dired buffers.
(auto-revert-active-p): New. (auto-revert-list-diff): New. (auto-revert-dired-file-list): New. (auto-revert-dired-changed-p): New. (auto-revert-handler): New. (auto-revert-active-p): New. (auto-revert-buffers): Moved logic to `auto-revert-handler' and `auto-revert-active-p'
Diffstat (limited to 'lisp/autorevert.el')
-rw-r--r--lisp/autorevert.el97
1 files changed, 79 insertions, 18 deletions
diff --git a/lisp/autorevert.el b/lisp/autorevert.el
index fac91332a5e..9005a7c4063 100644
--- a/lisp/autorevert.el
+++ b/lisp/autorevert.el
@@ -244,6 +244,82 @@ Use `auto-revert-mode' to revert a particular buffer."
'auto-revert-buffers)
nil)))
+(defun auto-revert-active-p ()
+ "Check if auto-revert is active (in current buffer or globally)."
+ (or auto-revert-mode
+ (and
+ global-auto-revert-mode
+ (not global-auto-revert-ignore-buffer)
+ (not (memq major-mode
+ global-auto-revert-ignore-modes)))))
+
+(defun auto-revert-list-diff (a b)
+ "Check if strings in list A differ from list B."
+ (when (and a b)
+ (setq a (sort a 'string-lessp))
+ (setq b (sort b 'string-lessp))
+ (let (elt1 elt2)
+ (catch 'break
+ (while (and (setq elt1 (and a (pop a)))
+ (setq elt2 (and b (pop b))))
+ (if (not (string= elt1 elt2))
+ (throw 'break t)))))))
+
+(defun auto-revert-dired-file-list ()
+ "Return list of dired files."
+ (let (list)
+ (save-excursion
+ (goto-char (point-min))
+ (while (not (eobp))
+ (if (setq file (dired-get-filename t t))
+ (push file list))
+ (forward-line 1)))
+ list))
+
+(defun auto-revert-dired-changed-p ()
+ "Check if dired buffer has changed."
+ (when (and (stringp dired-directory)
+ ;; Exclude remote buffers, would be too slow for user
+ ;; modem, timeouts, network lag ... all is possible
+ (not (string-match "@" dired-directory))
+ (file-directory-p dired-directory))
+ (let ((files (directory-files dired-directory))
+ (dired (auto-revert-dired-file-list)))
+ (or (not (eq (length files) (length dired)))
+ (auto-revert-list-diff files dired)))))
+
+(defun auto-revert-buffer-p ()
+ "Check if current buffer should be reverted."
+ ;; Always include dired buffers to list. It would be too expensive
+ ;; to test the "revert" status here each time timer launches.
+ (or (eq major-mode 'dired-mode)
+ (and (not (buffer-modified-p))
+ (if (buffer-file-name)
+ (and (file-readable-p (buffer-file-name))
+ (not (verify-visited-file-modtime buf)))
+ (and revert-buffer-function
+ (or (and global-auto-revert-mode
+ global-auto-revert-non-file-buffers)
+ auto-revert-mode))))))
+
+(defun auto-revert-handler ()
+ "Revert current buffer."
+ (let (done)
+ (cond
+ ((eq major-mode 'dired-mode)
+ ;; Dired includes revert-buffer-function
+ (when (and revert-buffer-function
+ (auto-revert-dired-changed-p))
+ (setq done t)
+ (revert-buffer t t t)))
+ ((or (buffer-file-name)
+ revert-buffer-function)
+ (setq done t)
+ (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes)))
+ (if (and done
+ auto-revert-verbose)
+ (message "Reverting buffer `%s'." (buffer-name)))))
+
(defun auto-revert-buffers ()
"Revert buffers as specified by Auto-Revert and Global Auto-Revert Mode.
@@ -294,24 +370,9 @@ the timer when no buffers need to be checked."
(memq buf auto-revert-buffer-list))
(setq auto-revert-buffer-list
(delq buf auto-revert-buffer-list)))
- (when (and
- (or auto-revert-mode
- (and
- global-auto-revert-mode
- (not global-auto-revert-ignore-buffer)
- (not (memq major-mode
- global-auto-revert-ignore-modes))))
- (not (buffer-modified-p))
- (if (buffer-file-name)
- (and (file-readable-p (buffer-file-name))
- (not (verify-visited-file-modtime buf)))
- (and revert-buffer-function
- (or (and global-auto-revert-mode
- global-auto-revert-non-file-buffers)
- auto-revert-mode))))
- (if auto-revert-verbose
- (message "Reverting buffer `%s'." buf))
- (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes)
+ (when (and (auto-revert-active-p)
+ (auto-revert-buffer-p))
+ (auto-revert-handler)
;; `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)))