Function: dired-build-subdir-alist

dired-build-subdir-alist is an interactive and byte-compiled function defined in dired.el.gz.

Signature

(dired-build-subdir-alist &optional SWITCHES)

Documentation

Build dired-subdir-alist by parsing the buffer.

Returns the new value of the alist. If optional arg SWITCHES is non-nil, use its value instead of dired-actual-switches.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/dired.el.gz
(defun dired-build-subdir-alist (&optional switches)
  "Build `dired-subdir-alist' by parsing the buffer.
Returns the new value of the alist.
If optional arg SWITCHES is non-nil, use its value
instead of `dired-actual-switches'."
  (interactive nil dired-mode)
  (dired-clear-alist)
  (save-excursion
    (let* ((count 0)
	   (inhibit-read-only t)
	   (buffer-undo-list t)
	   (switches (or switches dired-actual-switches))
	   new-dir-name
	   (R-ftp-base-dir-regex
	    ;; Used to expand subdirectory names correctly in recursive
	    ;; ange-ftp listings.
	    (and (dired-switches-recursive-p switches)
		 (string-match "\\`/.*:\\(/.*\\)" default-directory)
		 (concat "\\`" (match-string 1 default-directory))))
           ;; Regexp that describes the beginning of line of a
           ;; file/directory entry (as opposed to a subdirectory
           ;; heading), including the optional mark, inode, and size.
           (file-entry-beg-re (concat dired-re-maybe-mark
                                      dired-re-inode-size
                                      dired-re-perms)))
      (goto-char (point-min))
      (setq dired-subdir-alist nil)
      (while (re-search-forward dired-subdir-regexp nil t)
	;; Avoid taking a file name ending in a colon
	;; as a subdir name.
	(unless (save-excursion
		  (goto-char (match-beginning 0))
		  (beginning-of-line)
		  (looking-at-p file-entry-beg-re))
	  (save-excursion
	    (goto-char (match-beginning 1))
	    (setq new-dir-name
		  (buffer-substring-no-properties (point) (match-end 1))
		  new-dir-name
		  (save-match-data
		    (if (and R-ftp-base-dir-regex
			     (not (string= new-dir-name default-directory))
			     (string-match R-ftp-base-dir-regex new-dir-name))
			(concat default-directory
				(substring new-dir-name (match-end 0)))
		      (expand-file-name new-dir-name))))
	    (delete-region (point) (match-end 1))
            (let ((new-dir-name-pos (point))
                  (hideable-location
                   (and dired-hide-details-hide-absolute-location
                        (not (string-empty-p
                              (file-name-nondirectory new-dir-name))))))
              (insert new-dir-name)
              (when hideable-location
                (put-text-property
                 new-dir-name-pos
                 (+ new-dir-name-pos
                    (length (file-name-directory new-dir-name)))
		 'invisible 'dired-hide-details-absolute-location))))
	  (setq count (1+ count))
	  ;; Undo any escaping of newlines and \ by dired-insert-directory.
	  ;; Convert "n" preceded by odd number of \ to newline, and \\ to \.
	  (when (and (dired-switches-escape-p switches)
		     (string-match-p "\\\\" new-dir-name))
	    (let (temp res)
	      (mapc (lambda (char)
		      (cond ((equal char ?\\)
			     (if temp
				 (setq res (concat res "\\")
				       temp nil)
			       (setq temp "\\")))
			    ((and temp (equal char ?n))
			     (setq res (concat res "\n")
				   temp nil))
			    (t
			     (setq res (concat res temp (char-to-string char))
				   temp nil))))
		    new-dir-name)
	      (setq new-dir-name res)))
	  (dired-alist-add-1 new-dir-name
                             ;; Place a sub directory boundary between lines.
                             (save-excursion
                               (goto-char (match-beginning 0))
                               (beginning-of-line)
                               (point-marker)))))
      (if (and (> count 1) (called-interactively-p 'interactive))
	  (message "Buffer includes %d directories" count)))
    ;; We don't need to sort it because it is in buffer order per
    ;; constructionem.  Return new alist:
    dired-subdir-alist))