[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