Function: ls-lisp--insert-directory

ls-lisp--insert-directory is a byte-compiled function defined in ls-lisp.el.gz.

Signature

(ls-lisp--insert-directory FILE SWITCHES WILDCARD FULL-DIRECTORY-P)

Documentation

Insert directory listing for FILE, formatted according to SWITCHES.

This implementation of insert-directory works using Lisp functions rather than insert-directory-program.

This Lisp emulation does not run any external programs or shells.
 It supports ordinary shell wildcards if ls-lisp-support-shell-wildcards
is non-nil; otherwise, it interprets wildcards as regular expressions to match file names. It does not support all ls switches -- those that work are: A a B C c F G g h i n R r S s t U u v X. The l switch is assumed to be always present and cannot be turned off. Long variants of the above switches, as documented for GNU ls, are also supported; unsupported long options are silently ignored.

Probably introduced at or before Emacs version 30.1.

Source Code

;; Defined in /usr/src/emacs/lisp/ls-lisp.el.gz
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun ls-lisp--insert-directory (file switches wildcard full-directory-p)
  "Insert directory listing for FILE, formatted according to SWITCHES.
This implementation of `insert-directory' works using Lisp functions rather
than `insert-directory-program'.

This Lisp emulation does not run any external programs or shells.
 It supports ordinary shell wildcards if `ls-lisp-support-shell-wildcards'
is non-nil; otherwise, it interprets wildcards as regular expressions
to match file names.  It does not support all `ls' switches -- those
that work are: A a B C c F G g h i n R r S s t U u v X.  The l switch
is assumed to be always present and cannot be turned off.
Long variants of the above switches, as documented for GNU `ls',
are also supported; unsupported long options are silently ignored."
  (setq switches (or switches ""))
  (let ((orig-file file)
	wildcard-regexp
	(ls-lisp-dirs-first
         (or ls-lisp-dirs-first
             (string-match "--group-directories-first" switches))))
    (when (string-match "--group-directories-first" switches)
      ;; if ls-lisp-dirs-first is nil, dirs are grouped but come out in
      ;; reverse order:
      (setq ls-lisp-dirs-first t)
      (setq switches (replace-match "" nil nil switches)))
    ;; Remove unrecognized long options, and convert the
    ;; recognized ones to their short variants.
    (setq switches (ls-lisp--sanitize-switches switches))
    ;; Convert SWITCHES to a list of characters.
    (setq switches (delete ?\  (delete ?- (append switches nil))))
    ;; Sometimes we get ".../foo*/" as FILE.  While the shell and
    ;; `ls' don't mind, we certainly do, because it makes us think
    ;; there is no wildcard, only a directory name.
    (if (and ls-lisp-support-shell-wildcards
	     (string-match "[[?*]" file)
	     ;; Prefer an existing file to wildcards, like
	     ;; dired-noselect does.
	     (not (file-exists-p file)))
	(progn
	  (or (not (eq (aref file (1- (length file))) ?/))
	      (setq file (substring file 0 (1- (length file)))))
	  (setq wildcard t)))
    (if wildcard
	(setq wildcard-regexp
	      (if ls-lisp-support-shell-wildcards
		  (wildcard-to-regexp (file-name-nondirectory file))
		(file-name-nondirectory file))
	      file (file-name-directory file))
      (if (memq ?B switches) (setq wildcard-regexp "[^~]\\'")))
    (condition-case err
	(ls-lisp-insert-directory
	 file switches (ls-lisp-time-index switches)
	 wildcard-regexp full-directory-p)
      (invalid-regexp
       ;; Maybe they wanted a literal file that just happens to
       ;; use characters special to shell wildcards.
       (if (equal (cadr err) "Unmatched [ or [^")
	   (progn
	     (setq wildcard-regexp (if (memq ?B switches) "[^~]\\'")
		   file (file-relative-name orig-file))
	     (ls-lisp-insert-directory
	      file switches (ls-lisp-time-index switches)
	      nil full-directory-p))
	 (signal (car err) (cdr err)))))))