Download
(defgroup dired-details nil
"Settings for the dired-details package."
:group 'dired
:prefix "dired-details-")
(defcustom dired-details-hidden-string "[...]"
"*This string will be shown in place of file details and symbolic links."
:group 'dired-details
:type 'string)
(defcustom dired-details-hide-link-targets t
"*Hide symbolic link target paths."
:group 'dired-details
:type 'boolean)
(defcustom dired-details-initially-hide t
"*Hide dired details on entry to dired buffers."
:group 'dired-details
:type 'boolean)
(defcustom dired-details-hide-extra-lines t
"*Hides lines matching any regex in `dired-details-invisible-lines'.
Changing this variable will not affect existing dired buffers."
:group 'dired-details
:type 'boolean)
(defcustom dired-details-invisible-lines
'("total used in directory" "^\\s-*$" "find finished" "find \\." " wildcard ")
"*Hide dired details on entry to dired buffers."
:group 'dired-details
:type 'list)
(defvar dired-details-debug nil)
(defvar dired-details-internal-overlay-list nil)
(make-variable-buffer-local 'dired-details-internal-overlay-list)
(defvar dired-details-state nil
"Three possible values: nil (has not been set), 'hidden (details are
hidden), 'shown (details are visible).")
(make-variable-buffer-local 'dired-details-state)
(defun dired-details-install ()
(eval-after-load "dired"
'(progn
(add-hook 'dired-after-readin-hook 'dired-details-activate)
(define-key dired-mode-map "(" 'dired-details-hide)
(define-key dired-mode-map ")" 'dired-details-show)
(defadvice dired-revert (before remember-the-details activate)
(dired-details-delete-overlays)))))
(defun dired-details-activate ()
"Set up dired-details in the current dired buffer. Called by
dired-after-readin-hook on initial display and when a subdirectory is
inserted (with `i')."
(if dired-details-state
(when (eq 'hidden dired-details-state)
(dired-details-hide))
(when dired-details-initially-hide
(dired-details-hide))))
(defun dired-details-delete-overlays ()
(mapc '(lambda (list) (mapc 'delete-overlay
(cdr list)))
dired-details-internal-overlay-list)
(setq dired-details-internal-overlay-list nil))
(defun dired-details-toggle ( &optional arg default-too )
"Toggle visibility of dired details.
With positive prefix argument ARG hide the details, with negative
show them."
(interactive "P")
(let ((hide (if (null arg)
(not (eq 'hidden dired-details-state))
(> (prefix-numeric-value arg) 0))))
(if default-too
(setq dired-details-initially-hide hide))
(if hide (dired-details-hide)
(dired-details-show))))
(defun dired-details-hide ()
"Make an invisible, evaporable overlay for each file-line's details
in this dired buffer."
(interactive)
(unless (memq major-mode '(dired-mode vc-dired-mode sr-mode))
(error "dired-details-hide can only be called in dired mode"))
(when dired-details-debug
(let ((b (get-buffer-create "dired-details-debug")))
(append-to-buffer b (point) (point-max))))
(save-excursion
(save-restriction
(widen)
(mapc
'(lambda (dir-and-pos)
(let ((cached-overlays (assoc (car dir-and-pos)
dired-details-internal-overlay-list)))
(if cached-overlays
(dired-details-frob-overlays t)
(let ((cache (list (car dir-and-pos)))
(subdir-start (cdr dir-and-pos))
(subdir-end (1- (dired-get-subdir-max dir-and-pos))))
(goto-char subdir-start)
(forward-line 1)
(while (< (point) subdir-end)
(dired-details-make-current-line-overlay cache)
(forward-line 1))
(setq dired-details-internal-overlay-list
(cons cache dired-details-internal-overlay-list))))))
dired-subdir-alist)))
(setq dired-details-state 'hidden))
(defun dired-details-show ()
"Show whatever details a call to `dired-details-hide' may have
hidden in this buffer."
(interactive)
(dired-details-frob-overlays nil)
(setq dired-details-state 'shown))
(defun dired-details-make-current-line-overlay ( cache )
(let* ((bol (progn (beginning-of-line) (point)))
(totally-hide nil)
(details
(cond ((ignore-errors (dired-move-to-filename t))
(make-overlay (+ 2 bol) (point)))
((and dired-details-hide-extra-lines
(let ((line (buffer-substring (point-at-bol) (point-at-eol))))
(when (delq nil (mapcar (lambda (x) (string-match x line))
dired-details-invisible-lines))
(let ((o (make-overlay bol (1+ (point-at-eol)))))
(overlay-put o 'make-intangible t)
(overlay-put o 'suppress-before t)
o)))))))
(ln-target
(when dired-details-hide-link-targets
(if (progn (beginning-of-line)
(search-forward-regexp
"-> \\(.*\\)"
(save-excursion (end-of-line) (point)) t))
(make-overlay (match-beginning 1) (match-end 1))))))
(when details
(overlay-put details 'evaporate t)
(dired-details-hide-overlay details)
(when ln-target
(overlay-put ln-target 'evaporate t)
(dired-details-hide-overlay ln-target))
(setcdr cache (append (if ln-target
(list ln-target details)
(list details))
(cdr cache))))))
(defun dired-details-hide-overlay (o)
(overlay-put o 'invisible t)
(if (overlay-get o 'make-intangible) (overlay-put o 'intangible t))
(unless (overlay-get o 'suppress-before)
(overlay-put o 'before-string dired-details-hidden-string)))
(defun dired-details-show-overlay (o)
(overlay-put o 'invisible nil)
(overlay-put o 'before-string nil))
(defun dired-details-frob-overlays ( hide )
(if dired-details-internal-overlay-list
(mapc '(lambda (list)
(mapc (if hide 'dired-details-hide-overlay 'dired-details-show-overlay)
(cdr list)))
dired-details-internal-overlay-list)))
(provide 'dired-details)