bug-gnu-emacs
[Top][All Lists]
Advanced

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

bug#6799: 24.0.50; Please add dired-details.el to Emacs [patch]


From: Christopher Schmidt
Subject: bug#6799: 24.0.50; Please add dired-details.el to Emacs [patch]
Date: Mon, 17 Dec 2012 13:24:31 +0000 (GMT)

Stefan Monnier <monnier@iro.umontreal.ca> writes:

Hi Stefan,

thanks for your input.  Here is a preliminary patch for the trunk.
--- lisp/dired.el
+++ lisp/dired.el
@@ -230,6 +230,12 @@
   :version "22.1"
   :group 'dired)
 
+(defcustom dired-hide-details-hide-symlink-targets t
+  "If non-nil, `dired-hide-details-mode' hides symbolic link targets."
+  :type 'boolean
+  :version "24.4"
+  :group 'dired)
+
 ;; Internal variables
 
 (defvar dired-marker-char ?*           ; the answer is 42
@@ -1222,15 +1228,22 @@
     (goto-char beg)
     (while (< (point) end)
       (condition-case nil
-         (if (dired-move-to-filename)
-             (add-text-properties
-              (point)
-              (save-excursion
-                (dired-move-to-end-of-filename)
-                (point))
-              '(mouse-face highlight
-                dired-filename t
-                help-echo "mouse-2: visit this file in other window")))
+         (when (dired-move-to-filename)
+           (put-text-property (+ (line-beginning-position) 2) (point)
+                              'invisible 'dired-detail)
+           (add-text-properties
+            (point)
+            (progn
+              (dired-move-to-end-of-filename)
+              (point))
+            '(mouse-face
+              highlight
+              dired-filename t
+              help-echo "mouse-2: visit this file in other window"))
+           (when (and dired-hide-details-hide-symlink-targets
+                      (< (+ (point) 4) (line-end-position)))
+             (put-text-property (+ (point) 4) (line-end-position)
+                                'invisible 'dired-detail)))
        (error nil))
       (forward-line 1))))
 
@@ -1494,6 +1507,7 @@
     ;; hiding
     (define-key map "$" 'dired-hide-subdir)
     (define-key map "\M-$" 'dired-hide-all)
+    (define-key map "(" 'dired-hide-details-mode)
     ;; isearch
     (define-key map (kbd "M-s a C-s")   'dired-do-isearch)
     (define-key map (kbd "M-s a M-C-s") 'dired-do-isearch-regexp)
@@ -1584,6 +1598,14 @@
       '(menu-item "Toggle Image Thumbnails in This Buffer" 
image-dired-dired-toggle-marked-thumbs
                   :help "Add or remove image thumbnails in front of marked 
file names"))
 
+    (define-key map [menu-bar immediate unhide-details]
+      '(menu-item "UnHide Details" dired-hide-details-mode
+                 :help "Unhide details in buffer"
+                 :visible dired-hide-details-mode))
+    (define-key map [menu-bar immediate hide-details]
+      '(menu-item "Hide Details" dired-hide-details-mode
+                 :help "Hide details in buffer"
+                 :visible (not dired-hide-details-mode)))
     (define-key map [menu-bar immediate revert-buffer]
       '(menu-item "Refresh" revert-buffer
                  :help "Update contents of shown directories"))
@@ -1912,6 +1934,9 @@
        selective-display t             ; for subdirectory hiding
        mode-line-buffer-identification
        (propertized-buffer-identification "%17b"))
+  ;; ignore dired-detail value of invisible text property by default
+  (when (eq buffer-invisibility-spec t)
+    (setq buffer-invisibility-spec (list t)))
   (set (make-local-variable 'revert-buffer-function)
        (function dired-revert))
   (set (make-local-variable 'buffer-stale-function)
@@ -2228,6 +2253,20 @@
       (substring file (match-end 0))
     file))
 
+;;; Minor mode for hiding details
+;;;###autoload
+(define-minor-mode dired-hide-details-mode
+  "Hide details in `dired-mode'."
+  :group 'dired
+  (unless (derived-mode-p 'dired-mode)
+    (error "Not a Dired buffer"))
+  (funcall (if dired-hide-details-mode
+              'add-to-invisibility-spec
+            'remove-from-invisibility-spec)
+          'dired-detail))
+
+(put 'dired-hide-details-mode 'safe-local-variable 'booleanp)
+
 ;;; Functions for finding the file name in a dired buffer line.
 
 (defvar dired-permission-flags-regexp
I would love to hear your feedback.

>>   (save-restriction
>>     (widen)
>
> Please add a comment explaining why widening should be used here.

Widening is not necessary any more.

>>               do (let ((buffer-read-only))
>>                    (put-text-property (point) end
>>                                       'invisible my-dired-hide-details-mode))
>
> Better bind inhibit-read-only to t.  Or better yet, use
> with-silent-modifications (but move it outside the loop).
>
> Also, rather than set the invisible property to nil or t, better set
> it to another symbol (e.g. `dired-details'), whose meaning is then
> controlled by add-to-invisibility-spec.

Right.  Obviously this simplifies the implementation.

>> (defadvice dired-insert-set-properties
>>   (after my-add-hide-props (beg end) activate)
>
> Obviously, this would have to be turned into a patch, and since it's
> not small, it would need to be moved to its own function (which would
> be called from dired-insert-set-properties).

Check the new patch.  Altogether 7 new lines are added to
dired-insert-set-properties.

>> (defadvice find-dired (after my-fix-move-process-mark-to-arg activate)
>>   (move-marker (process-mark (get-buffer-process (current-buffer)))
>>             (save-excursion
>>               (goto-char (point-min))
>>               (forward-line 1)
>>               (point))))
>
> How is that related to dired-details?

This is not necessary any more.

My former implementation hid every non-file line that
dired-insert-set-properties is called upon.  Vanilla dired calls
dired-insert-set-properties on every line except the directory
headerline so my-dired-hide-details-mode hid the information line.

    total used in directory RMS available VI

Initially find-dired inserts the directory headerline, newline and the
find arguments and set the process mark is set to 1.

In the process filter of find find-dired evals

    (dired-insert-set-properties (process-mark proc)
                                 (1+ (point)))
    (move-marker (process-mark proc) (1+ (point)))

with (point) being right before the end of the last complete line added
by find.

That is dired-insert-set-properties is called on the first and second
line so my former code added the invisible property to the directory
headerline as well.  This is why I added that advice - just move the
process mark to the second line so dired-insert-set-properties is not
called on the directory headerline.

I removed the hiding of non-file lines.  Hiding full lines via text
properties might cause confusion when it comes to interactive line
movement.  There are no changed to find-dired.el now.

        Christopher

reply via email to

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