emacs-devel
[Top][All Lists]
Advanced

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

dired-aux.el


From: Luc Teirlinck
Subject: dired-aux.el
Date: Mon, 31 May 2004 22:21:11 -0500 (CDT)

Below is a patch to dired-aux.  It corrects various problems with
reverting or auto-reverting Dired buffers, as well as various problems
in *Locate* and *Find* buffers with inserted subdirectories.

Basically, all three types of changes made by the patch are necessary
to be able to properly auto-revert dired buffers with subdirectories
(currently Dired buffers with inserted subdirectories can not be
auto-reverted).  One is necessary for several other reasons.

Currently, reverting a dired buffer overrides user specified (using
`C-u i' or `C-u l") alternate switches for subdirectories, replacing
them with the general default for the buffer.  I do not believe that
makes sense.  My patch below makes dired remember and respect those
switches.  In my opinion it corrects a misfeature in Dired itself.
The change is necessary to make updating of subdirectories work
properly in *Locate* and *Find* buffers and it is one of the three
changes necessary to make autoreverting Dired buffers work
properly even with inserted subdirectories.

One problem with auto-reverting is that auto-revert should not
auto-revert modified Dired buffers.  Otherwise dired-undo and various
other Dired functionality ceases to work.  But Dired for various
reasons inappropriately (for auto-revert) marks a Dired buffer as
"modified".  This includes inserting subdirectories.  Buffers with
inserted subdirectories stay marked modified, even after `g'.  As a
consequence, they never auto-revert.  The patch below ensures that
inserting, deleting, hiding or unhiding subdirectories will no longer
mark a Dired buffer as modified.  As a result, such dired buffers will
auto-revert.  The two other types of changes in the patch assure that
this will not cause problems.

The third change is to get rid of messages produced by reverting
subdirectories.  This could produce tons of noise if auto-reverting is
enabled.  We already discussed the involved problems for the main
directory and decided to get rid of the messages.  It would be
inconsistent (and confusing) not to do the same for subdirectories.

===File ~/dired-aux-diff====================================
*** dired-aux.el        01 May 2004 10:36:25 -0500      1.118
--- dired-aux.el        29 May 2004 20:50:00 -0500      
***************
*** 620,625 ****
--- 620,629 ----
          (forward-line -1))))
      (dired-move-to-filename)))
  
+ (defvar dired-switches-alist nil
+   "Keeps track of which switches to use for inserted subdirectories.
+ This is an alist of the form (SUBDIR . SWITCHES).")
+ 
  ;;;###autoload
  (defun dired-do-kill-lines (&optional arg fmt)
    "Kill all marked lines (not the files).
***************
*** 631,637 ****
    (interactive "P")
    (if arg
        (if (dired-get-subdir)
!         (dired-kill-subdir)
        (dired-kill-line arg))
      (save-excursion
        (goto-char (point-min))
--- 635,646 ----
    (interactive "P")
    (if arg
        (if (dired-get-subdir)
!         (let ((cons (assoc-string (dired-get-subdir) dired-switches-alist))
!               (modflag (buffer-modified-p)))
!           (when cons
!             (setq dired-switches-alist (delete cons dired-switches-alist)))
!           (dired-kill-subdir)
!           (set-buffer-modified-p modflag))
        (dired-kill-line arg))
      (save-excursion
        (goto-char (point-min))
***************
*** 894,913 ****
  a prefix arg lets you edit the `ls' switches used for the new listing."
    ;; Moves point if the next ARG files are redisplayed.
    (interactive "P\np")
!   (if (and test-for-subdir (dired-get-subdir))
!       (dired-insert-subdir
!        (dired-get-subdir)
!        (if arg (read-string "Switches for listing: " dired-actual-switches)))
!     (message "Redisplaying...")
!     ;; message much faster than making dired-map-over-marks show progress
!     (dired-uncache
!      (if (consp dired-directory) (car dired-directory) dired-directory))
!     (dired-map-over-marks (let ((fname (dired-get-filename)))
!                           (message "Redisplaying... %s" fname)
!                           (dired-update-file-line fname))
!                         arg)
!     (dired-move-to-filename)
!     (message "Redisplaying...done")))
  
  (defun dired-update-file-line (file)
    ;; Delete the current line, and insert an entry for FILE.
--- 903,926 ----
  a prefix arg lets you edit the `ls' switches used for the new listing."
    ;; Moves point if the next ARG files are redisplayed.
    (interactive "P\np")
!   (let* ((dir (dired-get-subdir))
!        (switches (cdr (assoc-string dir dired-switches-alist))))
!     (if (and test-for-subdir dir)
!       (dired-insert-subdir
!        dir
!        (when arg
!          (read-string "Switches for listing: "
!                       (or switches dired-actual-switches))))
!       (message "Redisplaying...")
!       ;; message much faster than making dired-map-over-marks show progress
!       (dired-uncache
!        (if (consp dired-directory) (car dired-directory) dired-directory))
!       (dired-map-over-marks (let ((fname (dired-get-filename)))
!                             (message "Redisplaying... %s" fname)
!                             (dired-update-file-line fname))
!                           arg)
!       (dired-move-to-filename)
!       (message "Redisplaying...done"))))
  
  (defun dired-update-file-line (file)
    ;; Delete the current line, and insert an entry for FILE.
***************
*** 1751,1762 ****
         (if current-prefix-arg
             (read-string "Switches for listing: " dired-actual-switches))))
    (setq dirname (file-name-as-directory (expand-file-name dirname)))
!   (dired-insert-subdir-validate dirname switches)
    (or no-error-if-not-dir-p
        (file-directory-p dirname)
        (error  "Attempt to insert a non-directory: %s" dirname))
    (let ((elt (assoc dirname dired-subdir-alist))
!        switches-have-R mark-alist case-fold-search buffer-read-only)
      ;; case-fold-search is nil now, so we can test for capital `R':
      (if (setq switches-have-R (and switches (string-match "R" switches)))
        ;; avoid duplicated subdirs
--- 1764,1781 ----
         (if current-prefix-arg
             (read-string "Switches for listing: " dired-actual-switches))))
    (setq dirname (file-name-as-directory (expand-file-name dirname)))
!   (let ((cons (assoc-string dirname dired-switches-alist)))
!     (if switches
!       (if cons
!           (setcdr cons switches)
!         (push (cons dirname switches) dired-switches-alist)))
!     (when cons (setq switches (cdr cons))))
    (or no-error-if-not-dir-p
        (file-directory-p dirname)
        (error  "Attempt to insert a non-directory: %s" dirname))
    (let ((elt (assoc dirname dired-subdir-alist))
!       (modflag (buffer-modified-p))
!       switches-have-R mark-alist case-fold-search buffer-read-only)
      ;; case-fold-search is nil now, so we can test for capital `R':
      (if (setq switches-have-R (and switches (string-match "R" switches)))
        ;; avoid duplicated subdirs
***************
*** 1769,1775 ****
       dirname elt (dired-insert-subdir-doinsert dirname switches))
      (if switches-have-R (dired-build-subdir-alist switches))
      (dired-initial-position dirname)
!     (save-excursion (dired-mark-remembered mark-alist))))
  
  ;; This is a separate function for dired-vms.
  (defun dired-insert-subdir-validate (dirname &optional switches)
--- 1788,1795 ----
       dirname elt (dired-insert-subdir-doinsert dirname switches))
      (if switches-have-R (dired-build-subdir-alist switches))
      (dired-initial-position dirname)
!     (save-excursion (dired-mark-remembered mark-alist))
!     (set-buffer-modified-p modflag)))
  
  ;; This is a separate function for dired-vms.
  (defun dired-insert-subdir-validate (dirname &optional switches)
***************
*** 1855,1861 ****
    ;; Return the boundary of the inserted text (as list of BEG and END).
    (save-excursion
      (let ((begin (point)))
-       (message "Reading directory %s..." dirname)
        (let ((dired-actual-switches
             (or switches
                 (dired-replace-in-string "R" "" dired-actual-switches))))
--- 1875,1880 ----
***************
*** 1864,1870 ****
            ;; redo it as specified in dired-directory.
            (dired-readin-insert)
          (dired-insert-directory dirname dired-actual-switches nil nil t)))
-       (message "Reading directory %s...done" dirname)
        (list begin (point)))))
  
  (defun dired-insert-subdir-doupdate (dirname elt beg-end)
--- 1883,1888 ----
***************
*** 2077,2095 ****
  Use \\[dired-hide-all] to (un)hide all directories."
    (interactive "p")
    (dired-hide-check)
!   (while (>=  (setq arg (1- arg)) 0)
!     (let* ((cur-dir (dired-current-directory))
!          (hidden-p (dired-subdir-hidden-p cur-dir))
!          (elt (assoc cur-dir dired-subdir-alist))
!          (end-pos (1- (dired-get-subdir-max elt)))
!          buffer-read-only)
!       ;; keep header line visible, hide rest
!       (goto-char (dired-get-subdir-min elt))
!       (skip-chars-forward "^\n\r")
!       (if hidden-p
!         (subst-char-in-region (point) end-pos ?\r ?\n)
!       (subst-char-in-region (point) end-pos ?\n ?\r)))
!     (dired-next-subdir 1 t)))
  
  ;;;###autoload
  (defun dired-hide-all (arg)
--- 2095,2115 ----
  Use \\[dired-hide-all] to (un)hide all directories."
    (interactive "p")
    (dired-hide-check)
!   (let ((modflag (buffer-modified-p)))
!     (while (>=  (setq arg (1- arg)) 0)
!       (let* ((cur-dir (dired-current-directory))
!            (hidden-p (dired-subdir-hidden-p cur-dir))
!            (elt (assoc cur-dir dired-subdir-alist))
!            (end-pos (1- (dired-get-subdir-max elt)))
!            buffer-read-only)
!       ;; keep header line visible, hide rest
!       (goto-char (dired-get-subdir-min elt))
!       (skip-chars-forward "^\n\r")
!       (if hidden-p
!           (subst-char-in-region (point) end-pos ?\r ?\n)
!         (subst-char-in-region (point) end-pos ?\n ?\r)))
!       (dired-next-subdir 1 t))
!     (set-buffer-modified-p modflag)))
  
  ;;;###autoload
  (defun dired-hide-all (arg)
***************
*** 2098,2104 ****
  Use \\[dired-hide-subdir] to (un)hide a particular subdirectory."
    (interactive "P")
    (dired-hide-check)
!   (let (buffer-read-only)
      (if (save-excursion
          (goto-char (point-min))
          (search-forward "\r" nil t))
--- 2118,2125 ----
  Use \\[dired-hide-subdir] to (un)hide a particular subdirectory."
    (interactive "P")
    (dired-hide-check)
!   (let ((modflag (buffer-modified-p))
!       buffer-read-only)
      (if (save-excursion
          (goto-char (point-min))
          (search-forward "\r" nil t))
***************
*** 2107,2113 ****
        ;; hide
        (let ((pos (point-max))         ; pos of end of last directory
            (alist dired-subdir-alist))
!       (while alist                    ; while there are dirs before pos
          (subst-char-in-region (dired-get-subdir-min (car alist)) ; pos of 
prev dir
                                (save-excursion
                                  (goto-char pos) ; current dir
--- 2128,2134 ----
        ;; hide
        (let ((pos (point-max))         ; pos of end of last directory
            (alist dired-subdir-alist))
!       (while alist                 ; while there are dirs before pos
          (subst-char-in-region (dired-get-subdir-min (car alist)) ; pos of 
prev dir
                                (save-excursion
                                  (goto-char pos) ; current dir
***************
*** 2116,2122 ****
                                  (point))
                                ?\n ?\r)
          (setq pos (dired-get-subdir-min (car alist))) ; prev dir gets current 
dir
!         (setq alist (cdr alist)))))))
  
  ;;;###end dired-ins.el
  
--- 2137,2144 ----
                                  (point))
                                ?\n ?\r)
          (setq pos (dired-get-subdir-min (car alist))) ; prev dir gets current 
dir
!         (setq alist (cdr alist)))))
!     (set-buffer-modified-p modflag)))
  
  ;;;###end dired-ins.el
  
============================================================




reply via email to

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