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)
(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)))))
(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)
(forward-char 2)
(looking-at-p dired-re-perms))
(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))
(insert new-dir-name))
(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))