From mboxrd@z Thu Jan 1 00:00:00 1970 Path: main.gmane.org!not-for-mail From: jari.aalto@poboxes.com (Jari Aalto+mail.emacs) Newsgroups: gmane.emacs.bugs Subject: [patch] 21.3 autorevert.el - Added dired buffer support Date: Sat, 24 Jan 2004 22:41:16 +0200 Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Message-ID: <65f1gjv7.fsf@blue.sea.net> NNTP-Posting-Host: deer.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1074976295 31450 80.91.224.253 (24 Jan 2004 20:31:35 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Sat, 24 Jan 2004 20:31:35 +0000 (UTC) Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Jan 24 21:31:24 2004 Return-path: Original-Received: from monty-python.gnu.org ([199.232.76.173]) by deer.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 1AkURA-0003do-00 for ; Sat, 24 Jan 2004 21:31:24 +0100 Original-Received: from localhost ([127.0.0.1] helo=monty-python.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.24) id 1AkUQq-0006tL-1v for geb-bug-gnu-emacs@m.gmane.org; Sat, 24 Jan 2004 15:31:04 -0500 Original-Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.24) id 1AkUQn-0006tG-Pm for bug-gnu-emacs@prep.ai.mit.edu; Sat, 24 Jan 2004 15:31:01 -0500 Original-Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.24) id 1AkUQH-0006W7-IY for bug-gnu-emacs@prep.ai.mit.edu; Sat, 24 Jan 2004 15:31:00 -0500 Original-Received: from [193.229.0.60] (helo=fep22-app.kolumbus.fi) by monty-python.gnu.org with esmtp (Exim 4.24) id 1AkUQG-0006Ui-Fm for bug-gnu-emacs@prep.ai.mit.edu; Sat, 24 Jan 2004 15:30:28 -0500 Original-Received: from poboxes.com ([81.197.3.110]) by fep22-app.kolumbus.fi with ESMTP id <20040124203027.KZME3524.fep22-app.kolumbus.fi@poboxes.com> for ; Sat, 24 Jan 2004 22:30:27 +0200 Original-To: gnu.emacs.bug X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.2 Precedence: list List-Id: Bug reports for GNU Emacs, the Swiss army knife of text editors List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: main.gmane.org gmane.emacs.bugs:6732 X-Report-Spam: http://spam.gmane.org/gmane.emacs.bugs:6732 2004-01-24 Sat Jari Aalto * autorevert.el 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' Index: autorevert.el =================================================================== RCS file: /cygdrive/h/data/version-control/cvsroot/emacs/gnu-emacs/lisp213/autorevert.el,v retrieving revision 1.1.1.1 diff -u -IId: -b -w -u -r1.1.1.1 autorevert.el --- autorevert.el 26 Jun 2003 18:06:05 -0000 1.1.1.1 +++ autorevert.el 24 Jan 2004 20:36:08 -0000 @@ -273,6 +273,81 @@ 'auto-revert-buffers)) (setq auto-revert-timer 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 t t t))) + (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. @@ -325,24 +400,9 @@ (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 t t t))) + (when (and (auto-revert-active-p) + (auto-revert-buffer-p)) + (auto-revert-handler))) ;; Remove dead buffer from `auto-revert-buffer-list'. (setq auto-revert-buffer-list (delq buf auto-revert-buffer-list)))) @@ -360,6 +420,7 @@ (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))