emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: autorevert.el


From: Luc Teirlinck
Subject: Re: autorevert.el
Date: Sat, 20 Mar 2004 21:26:51 -0600 (CST)

Here is my proposed patch for dired.el supporting the auto-revert patch.

Note that, for people not using auto-revert the one visible change is
that `g' in dired would no longer print the "Reading directory %s..."
and "Reading directory %s...done" messages.  I asked before whether
this would be OK and the only reactions were from Stefan and Kai who
both agreed.  If one wants to keep those messages, then I would need
an auto-revert-flag variable to tell `dired-internal-noselect' that it
is called by auto-revert (to silence those messages), which Stefan
finds very unaesthetic.

Until somebody takes care of the portability problem mentioned by Eli,
I guess that setting global-auto-revert-non-file-buffers to t will have
essentially no effect on dired buffers for MS Windows.  (I do not know
whether there only is a portability problem for MS Windows or whether
similar problems exist for mac, VMS and/or other operating systems.)

`dired-directory-changed-p' is the exact code priorly used by
`dired-internal-noselect'.  I could actually do things differently
from the way they are done below, and incorporate
`dired-directory-changed-p' into `dired-buffer-stale-p', instead of
making it a separate function, and have `dired-internal-noselect' call
`dired-buffer-stale-p' instead of `dired-directory-changed-p'.  Then
one could give the variable buffer-stale-function an operating system
specific value.

I could document the portability problem if it would become clear that
it is not going to be solved any time soon.

===File ~/dired-diff========================================
*** dired.el.~1.272.~   Tue Feb  3 15:42:36 2004
--- dired.el    Fri Mar 19 14:05:59 2004
***************
*** 513,524 ****
        (setq dir-or-list dirname))
      (dired-internal-noselect dir-or-list switches)))
  
  ;; Separate function from dired-noselect for the sake of dired-vms.el.
  (defun dired-internal-noselect (dir-or-list &optional switches mode)
    ;; If there is an existing dired buffer for DIRNAME, just leave
    ;; buffer as it is (don't even call dired-revert).
    ;; This saves time especially for deep trees or with ange-ftp.
!   ;; The user can type `g'easily, and it is more consistent with find-file.
    ;; But if SWITCHES are given they are probably different from the
    ;; buffer's old value, so call dired-sort-other, which does
    ;; revert the buffer.
--- 513,546 ----
        (setq dir-or-list dirname))
      (dired-internal-noselect dir-or-list switches)))
  
+ ;; The following is an internal dired function.  It returns non-nil if
+ ;; the directory visited by the current dired buffer has changed on
+ ;; disk.  DIRNAME should be the directory name of that directory.
+ (defun dired-directory-changed-p (dirname)
+   (not (let ((attributes (file-attributes dirname))
+                   (modtime (visited-file-modtime)))
+               (or (eq modtime 0)
+                   (not (eq (car attributes) t))
+                   (and (= (car (nth 5 attributes)) (car modtime))
+                        (= (nth 1 (nth 5 attributes)) (cdr modtime)))))))
+ 
+ (defun dired-buffer-stale-p (&optional noconfirm)
+   "Return non-nil if current dired buffer needs updating.
+ If NOCONFIRM is non-nil, then this function always returns nil
+ for a remote directory.  This feature is used by Auto Revert Mode."
+   (let ((dirname
+        (if (consp dired-directory) (car dired-directory) dired-directory)))
+     (and (stringp dirname)
+        (not (when noconfirm (file-remote-p dirname)))
+        (file-readable-p dirname)
+        (dired-directory-changed-p dirname))))
+ 
  ;; Separate function from dired-noselect for the sake of dired-vms.el.
  (defun dired-internal-noselect (dir-or-list &optional switches mode)
    ;; If there is an existing dired buffer for DIRNAME, just leave
    ;; buffer as it is (don't even call dired-revert).
    ;; This saves time especially for deep trees or with ange-ftp.
!   ;; The user can type `g' easily, and it is more consistent with find-file.
    ;; But if SWITCHES are given they are probably different from the
    ;; buffer's old value, so call dired-sort-other, which does
    ;; revert the buffer.
***************
*** 544,563 ****
          ;; kill-all-local-variables any longer.
          (setq buffer (create-file-buffer (directory-file-name dirname)))))
      (set-buffer buffer)
!     (if (not new-buffer-p)     ; existing buffer ...
!       (cond (switches        ; ... but new switches
               ;; file list may have changed
               (setq dired-directory dir-or-list)
               ;; this calls dired-revert
               (dired-sort-other switches))
              ;; If directory has changed on disk, offer to revert.
!             ((if (let ((attributes (file-attributes dirname))
!                        (modtime (visited-file-modtime)))
!                    (or (eq modtime 0)
!                        (not (eq (car attributes) t))
!                        (and (= (car (nth 5 attributes)) (car modtime))
!                             (= (nth 1 (nth 5 attributes)) (cdr modtime)))))
!                  nil
                 (message "%s"
                          (substitute-command-keys
                           "Directory has changed on disk; type 
\\[revert-buffer] to update Dired")))))
--- 566,579 ----
          ;; kill-all-local-variables any longer.
          (setq buffer (create-file-buffer (directory-file-name dirname)))))
      (set-buffer buffer)
!     (if (not new-buffer-p)            ; existing buffer ...
!       (cond (switches                 ; ... but new switches
               ;; file list may have changed
               (setq dired-directory dir-or-list)
               ;; this calls dired-revert
               (dired-sort-other switches))
              ;; If directory has changed on disk, offer to revert.
!             ((when (dired-directory-changed-p dirname)
                 (message "%s"
                          (substitute-command-keys
                           "Directory has changed on disk; type 
\\[revert-buffer] to update Dired")))))
***************
*** 634,640 ****
        ;; based on dired-directory, e.g. with ange-ftp to a SysV host
        ;; where ls won't understand -Al switches.
        (run-hooks 'dired-before-readin-hook)
-       (message "Reading directory %s..." dirname)
        (if (consp buffer-undo-list)
          (setq buffer-undo-list nil))
        (let (buffer-read-only
--- 650,655 ----
***************
*** 643,649 ****
        (widen)
        (erase-buffer)
        (dired-readin-insert))
-       (message "Reading directory %s...done" dirname)
        (goto-char (point-min))
        ;; Must first make alist buffer local and set it to nil because
        ;; dired-build-subdir-alist will call dired-clear-alist first
--- 658,663 ----
***************
*** 1201,1206 ****
--- 1215,1222 ----
  ;; Dired mode is suitable only for specially formatted data.
  (put 'dired-mode 'mode-class 'special)
  
+ (defvar buffer-stale-function)
+ 
  (defun dired-mode (&optional dirname switches)
    "\
  Mode for \"editing\" directory listings.
***************
*** 1279,1284 ****
--- 1295,1302 ----
        (propertized-buffer-identification "%17b"))
    (set (make-local-variable 'revert-buffer-function)
         (function dired-revert))
+   (set (make-local-variable 'buffer-stale-function)
+        (function dired-buffer-stale-p))
    (set (make-local-variable 'page-delimiter)
         "\n\n")
    (set (make-local-variable 'dired-directory)
============================================================




reply via email to

[Prev in Thread] Current Thread [Next in Thread]