]> code.delx.au - gnu-emacs/commitdiff
Add dired-hide-details-mode. (Bug#6799)
authorChristopher Schmidt <christopher@ch.ristopher.com>
Wed, 13 Feb 2013 09:42:31 +0000 (10:42 +0100)
committerChristopher Schmidt <christopher@ch.ristopher.com>
Wed, 13 Feb 2013 09:42:31 +0000 (10:42 +0100)
* locate.el (locate-mode): Set parent mode property to dired-mode.

* find-dired.el (find-dired): Call dired-insert-set-properties on
initial information line.  Set process mark on end of buffer.
(find-dired-sentinel):
Call dired-insert-set-properties on summary.

* dired.el (dired-hide-details-hide-symlink-targets)
(dired-hide-details-hide-information-lines): New options.
(dired-insert-directory):
Set properties after final treatment of output.
(dired-insert-set-properties):
Set dired-hide-details-* properties.
(dired-mode-map): Bind dired-hide-details-mode.
(dired-mode): Set buffer-invisibility-spec to a list.
(dired-next-line): Skip hidden lines.
(dired-previous-line): Use dired-next-line.
(dired-hide-details-mode): New minor mode.
(dired-hide-details-update-invisibility-spec): New function.

etc/NEWS
lisp/ChangeLog
lisp/dired.el
lisp/find-dired.el
lisp/locate.el

index 05d2f7edb060712ad4c51153e19a9a1e669ce7c3..770ebc17ac0e15e3bbd8f4e0ac01db52a3c18f75 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -120,6 +120,10 @@ on the given date.
 
 *** Support for ISO 8601 dates.
 
+** Dired
+
+*** New minor mode `dired-hide-details-mode' hides details.
+
 ** ERC
 
 *** New option `erc-accidental-paste-threshold-seconds'.
index d7c7ed7218f5ccd798ac749f9c5fd1c7523de2e8..fe5ac8803b905e61bfa4906c69d589a1d523e328 100644 (file)
@@ -1,3 +1,27 @@
+2013-02-12  Christopher Schmidt  <christopher@ch.ristopher.com>
+
+       Add dired-hide-details-mode.  (Bug#6799)
+
+       * locate.el (locate-mode): Set parent mode property to dired-mode.
+
+       * find-dired.el (find-dired): Call dired-insert-set-properties on
+       initial information line.  Set process mark on end of buffer.
+       (find-dired-sentinel):
+       Call dired-insert-set-properties on summary.
+
+       * dired.el (dired-hide-details-hide-symlink-targets)
+       (dired-hide-details-hide-information-lines): New options.
+       (dired-insert-directory):
+       Set properties after final treatment of output.
+       (dired-insert-set-properties):
+       Set dired-hide-details-* properties.
+       (dired-mode-map): Bind dired-hide-details-mode.
+       (dired-mode): Set buffer-invisibility-spec to a list.
+       (dired-next-line): Skip hidden lines.
+       (dired-previous-line): Use dired-next-line.
+       (dired-hide-details-mode): New minor mode.
+       (dired-hide-details-update-invisibility-spec): New function.
+
 2013-02-13  Glenn Morris  <rgm@gnu.org>
 
        * play/yow.el: Move to obsolete/.  (Bug#9384)
index b5fc46eb78dd3a2c8f8f618b1a89a59a0b4af3ba..28045043c82a3ad0481126591f93ff1c327c5b94 100644 (file)
@@ -230,6 +230,18 @@ new dired buffers."
   :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)
+
+(defcustom dired-hide-details-hide-information-lines t
+  "Non-nil means hide lines other than header and file/dir lines."
+  :type 'boolean
+  :version "24.4"
+  :group 'dired)
+
 ;; Internal variables
 
 (defvar dired-marker-char ?*           ; the answer is 42
@@ -1196,7 +1208,6 @@ see `dired-use-ls-dired' for more details.")
       ;; Note: adjust dired-build-subdir-alist if you change this.
       (setq dir (replace-regexp-in-string "\\\\" "\\\\" dir nil t)
             dir (replace-regexp-in-string "\n" "\\n" dir nil t)))
-    (dired-insert-set-properties opoint (point))
     ;; If we used --dired and it worked, the lines are already indented.
     ;; Otherwise, indent them.
     (unless (save-excursion
@@ -1205,18 +1216,21 @@ see `dired-use-ls-dired' for more details.")
       (let ((indent-tabs-mode nil))
        (indent-rigidly opoint (point) 2)))
     ;; Insert text at the beginning to standardize things.
-    (save-excursion
-      (goto-char opoint)
-      (if (and (or hdr wildcard)
-               (not (and (looking-at "^  \\(.*\\):$")
-                         (file-name-absolute-p (match-string 1)))))
+    (let ((content-point opoint))
+      (save-excursion
+       (goto-char opoint)
+       (when (and (or hdr wildcard)
+                  (not (and (looking-at "^  \\(.*\\):$")
+                            (file-name-absolute-p (match-string 1)))))
          ;; Note that dired-build-subdir-alist will replace the name
          ;; by its expansion, so it does not matter whether what we insert
          ;; here is fully expanded, but it should be absolute.
-         (insert "  " (directory-file-name (file-name-directory dir)) ":\n"))
-      (when wildcard
-       ;; Insert "wildcard" line where "total" line would be for a full dir.
-       (insert "  wildcard " (file-name-nondirectory dir) "\n")))))
+         (insert "  " (directory-file-name (file-name-directory dir)) ":\n")
+         (setq content-point (point)))
+       (when wildcard
+         ;; Insert "wildcard" line where "total" line would be for a full dir.
+         (insert "  wildcard " (file-name-nondirectory dir) "\n")))
+      (dired-insert-set-properties content-point (point)))))
 
 (defun dired-insert-set-properties (beg end)
   "Add various text properties to the lines in the region."
@@ -1224,15 +1238,24 @@ see `dired-use-ls-dired' for more details.")
     (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")))
+         (if (not (dired-move-to-filename))
+             (put-text-property (line-beginning-position)
+                                (1+ (line-end-position))
+                                'invisible 'dired-hide-details-information)
+           (put-text-property (+ (line-beginning-position) 1) (1- (point))
+                              'invisible 'dired-hide-details-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 (< (+ (point) 4) (line-end-position))
+             (put-text-property (+ (point) 4) (line-end-position)
+                                'invisible 'dired-hide-details-link)))
        (error nil))
       (forward-line 1))))
 \f
@@ -1496,6 +1519,7 @@ Do so according to the former subdir alist OLD-SUBDIR-ALIST."
     ;; 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)
@@ -1586,6 +1610,10 @@ Do so according to the former subdir alist OLD-SUBDIR-ALIST."
       '(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 hide-details]
+      '(menu-item "Hide Details" dired-hide-details-mode
+                 :help "Hide details in buffer"
+                 :button (:toggle . dired-hide-details-mode)))
     (define-key map [menu-bar immediate revert-buffer]
       '(menu-item "Refresh" revert-buffer
                  :help "Update contents of shown directories"))
@@ -1914,6 +1942,9 @@ Keybindings:
        selective-display t             ; for subdirectory hiding
        mode-line-buffer-identification
        (propertized-buffer-identification "%17b"))
+  ;; Ignore dired-hide-details-* 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)
@@ -1978,15 +2009,20 @@ Otherwise, call `toggle-read-only'."
   "Move down lines then position at filename.
 Optional prefix ARG says how many lines to move; default is one line."
   (interactive "p")
-  (forward-line arg)
+  (let ((line-move-visual)
+       (goal-column))
+    (line-move arg t))
+  ;; We never want to move point into an invisible line.
+  (while (and (invisible-p (point))
+             (not (if (and arg (< arg 0)) (bobp) (eobp))))
+    (forward-char (if (and arg (< arg 0)) -1 1)))
   (dired-move-to-filename))
 
 (defun dired-previous-line (arg)
   "Move up lines then position at filename.
 Optional prefix ARG says how many lines to move; default is one line."
   (interactive "p")
-  (forward-line (- arg))
-  (dired-move-to-filename))
+  (dired-next-line (- (or arg 1))))
 
 (defun dired-next-dirline (arg &optional opoint)
   "Goto ARG'th next directory file line."
@@ -2230,6 +2266,40 @@ unchanged."
       (substring file (match-end 0))
     file))
 \f
+;;; 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"))
+  (dired-hide-details-update-invisibility-spec)
+  (if dired-hide-details-mode
+      (add-hook 'wdired-mode-hook
+               'dired-hide-details-update-invisibility-spec
+               nil
+               t)
+    (remove-hook 'wdired-mode-hook
+                'dired-hide-details-update-invisibility-spec
+                t)))
+
+(defun dired-hide-details-update-invisibility-spec ()
+  (funcall (if dired-hide-details-mode
+              'add-to-invisibility-spec
+            'remove-from-invisibility-spec)
+          'dired-hide-details-detail)
+  (funcall (if (and dired-hide-details-mode
+                   dired-hide-details-hide-information-lines)
+              'add-to-invisibility-spec
+            'remove-from-invisibility-spec)
+          'dired-hide-details-information)
+  (funcall (if (and dired-hide-details-mode
+                   dired-hide-details-hide-symlink-targets
+                   (not (derived-mode-p 'wdired-mode)))
+              'add-to-invisibility-spec
+            'remove-from-invisibility-spec)
+          'dired-hide-details-link))
+\f
 ;;; Functions for finding the file name in a dired buffer line.
 
 (defvar dired-permission-flags-regexp
index ae7cc1c8629351af5763e3f0d0bac23687d33cee..f9a0c015bf73d8dd5fc61e2c1a0eef5f579b2e7f 100644 (file)
@@ -210,13 +210,15 @@ use in place of \"-ls\" as the final argument."
     (insert "  " dir ":\n")
     ;; Make second line a ``find'' line in analogy to the ``total'' or
     ;; ``wildcard'' line.
-    (insert "  " args "\n")
+    (let ((point (point)))
+      (insert "  " args "\n")
+      (dired-insert-set-properties point (point)))
     (setq buffer-read-only t)
     (let ((proc (get-buffer-process (current-buffer))))
       (set-process-filter proc (function find-dired-filter))
       (set-process-sentinel proc (function find-dired-sentinel))
       ;; Initialize the process marker; it is used by the filter.
-      (move-marker (process-mark proc) 1 (current-buffer)))
+      (move-marker (process-mark proc) (point) (current-buffer)))
     (setq mode-line-process '(":%s"))))
 
 (defun kill-find ()
@@ -337,10 +339,11 @@ use in place of \"-ls\" as the final argument."
          (let ((buffer-read-only nil))
            (save-excursion
              (goto-char (point-max))
-             (insert "\n  find " state)
-             (forward-char -1)         ;Back up before \n at end of STATE.
-             (insert " at " (substring (current-time-string) 0 19))
-             (forward-char 1)
+             (let ((point (point)))
+               (insert "\n  find " state)
+               (forward-char -1)               ;Back up before \n at end of STATE.
+               (insert " at " (substring (current-time-string) 0 19))
+               (dired-insert-set-properties point (point)))
              (setq mode-line-process
                    (concat ":"
                            (symbol-name (process-status proc))))
index 804260969ee8188d608ca05cb0371a3d7d9dfea9..ab0417070e7e47758796a9b42bbd40f36c3fa7c0 100644 (file)
@@ -496,6 +496,7 @@ do not work in subdirectories.
   (setq revert-buffer-function 'locate-update)
   (set (make-local-variable 'page-delimiter) "\n\n")
   (run-mode-hooks 'locate-mode-hook))
+(put 'locate-mode 'derived-mode-parent 'dired-mode)
 
 (defun locate-do-setup (search-string)
   (goto-char (point-min))