From mboxrd@z Thu Jan 1 00:00:00 1970 Path: main.gmane.org!not-for-mail From: Luc Teirlinck Newsgroups: gmane.emacs.devel Subject: dired-aux.el Date: Mon, 31 May 2004 22:21:11 -0500 (CDT) Sender: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Message-ID: <200406010321.i513LBd01218@raven.dms.auburn.edu> NNTP-Posting-Host: deer.gmane.org X-Trace: sea.gmane.org 1086061530 15005 80.91.224.253 (1 Jun 2004 03:45:30 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Tue, 1 Jun 2004 03:45:30 +0000 (UTC) Original-X-From: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Tue Jun 01 05:45:21 2004 Return-path: Original-Received: from quimby.gnus.org ([80.91.224.244]) by deer.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 1BV0DI-00080i-00 for ; Tue, 01 Jun 2004 05:45:20 +0200 Original-Received: from lists.gnu.org ([199.232.76.165]) by quimby.gnus.org with esmtp (Exim 3.35 #1 (Debian)) id 1BV0DI-0005SD-00 for ; Tue, 01 Jun 2004 05:45:20 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.33) id 1BV0DV-0008Qm-EP for emacs-devel@quimby.gnus.org; Mon, 31 May 2004 23:45:33 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.33) id 1BV0DS-0008Pq-0C for emacs-devel@gnu.org; Mon, 31 May 2004 23:45:30 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.33) id 1BV0DQ-0008PI-Ak for emacs-devel@gnu.org; Mon, 31 May 2004 23:45:29 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.33) id 1BV0DQ-0008Ou-54 for emacs-devel@gnu.org; Mon, 31 May 2004 23:45:28 -0400 Original-Received: from [199.232.41.8] (helo=mx20.gnu.org) by monty-python.gnu.org with esmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.34) id 1BV0CJ-0001jX-PL for emacs-devel@gnu.org; Mon, 31 May 2004 23:44:19 -0400 Original-Received: from [131.204.53.104] (helo=manatee.dms.auburn.edu) by mx20.gnu.org with esmtp (Exim 4.34) id 1BUzra-0006lz-FT for emacs-devel@gnu.org; Mon, 31 May 2004 23:22:59 -0400 Original-Received: from raven.dms.auburn.edu (raven.dms.auburn.edu [131.204.53.29]) by manatee.dms.auburn.edu (8.12.10/8.12.10) with ESMTP id i513M4uE011625 for ; Mon, 31 May 2004 22:22:04 -0500 (CDT) Original-Received: (from teirllm@localhost) by raven.dms.auburn.edu (8.11.6+Sun/8.11.6) id i513LBd01218; Mon, 31 May 2004 22:21:11 -0500 (CDT) X-Authentication-Warning: raven.dms.auburn.edu: teirllm set sender to teirllm@dms.auburn.edu using -f Original-To: emacs-devel@gnu.org X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.4 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Xref: main.gmane.org gmane.emacs.devel:24331 X-Report-Spam: http://spam.gmane.org/gmane.emacs.devel:24331 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 ============================================================