Function: dired-add-entry
dired-add-entry is a byte-compiled function defined in
dired-aux.el.gz.
Signature
(dired-add-entry FILENAME &optional MARKER-CHAR RELATIVE)
Documentation
Add a new Dired entry for FILENAME.
Optionally mark it with MARKER-CHAR (a character, else uses
dired-marker-char). Note that this adds the entry out of order
if files are sorted by time, etc.
Skips files that match dired-trivial-filenames.
Exposes hidden subdirectories if a file is added there.
If dired-x is loaded and dired-omit-mode(var)/dired-omit-mode(fun) is enabled, skips
files matching dired-omit-regexp.
Source Code
;; Defined in /usr/src/emacs/lisp/dired-aux.el.gz
(defun dired-add-entry (filename &optional marker-char relative)
"Add a new Dired entry for FILENAME.
Optionally mark it with MARKER-CHAR (a character, else uses
`dired-marker-char'). Note that this adds the entry `out of order'
if files are sorted by time, etc.
Skips files that match `dired-trivial-filenames'.
Exposes hidden subdirectories if a file is added there.
If `dired-x' is loaded and `dired-omit-mode' is enabled, skips
files matching `dired-omit-regexp'."
(if (or (not (featurep 'dired-x))
(not dired-omit-mode)
;; Avoid calling ls for files that are going to be omitted anyway.
(let ((omit-re (dired-omit-regexp)))
(or (string= omit-re "")
(not (string-match-p omit-re
(cond
((eq 'no-dir dired-omit-localp)
filename)
((eq t dired-omit-localp)
(dired-make-relative filename))
(t
(dired-make-absolute
filename
(file-name-directory filename)))))))))
;; Do it!
(progn
(setq filename (directory-file-name filename))
;; Entry is always for files, even if they happen to also be directories
(let* ((opoint (point))
(cur-dir (dired-current-directory))
(directory (if relative cur-dir (file-name-directory filename)))
reason)
(setq filename
(if relative
(file-relative-name filename directory)
(file-name-nondirectory filename))
reason
(catch 'not-found
(if (string= directory cur-dir)
(progn
(end-of-line)
(if (dired--hidden-p)
(dired-unhide-subdir))
;; We are already where we should be, except when
;; point is before the subdir line or its total line.
(let ((p (dired-after-subdir-garbage cur-dir)))
(if (< (point) p)
(goto-char p))))
;; else try to find correct place to insert
(if (dired-goto-subdir directory)
(progn ;; unhide if necessary
(if (dired--hidden-p)
;; Point is at end of subdir line.
(dired-unhide-subdir))
;; found - skip subdir and `total' line
;; and uninteresting files like . and ..
;; This better not move into the next subdir!
(dired-goto-next-nontrivial-file))
;; not found
(throw 'not-found "Subdir not found")))
(let (buffer-read-only opoint)
(beginning-of-line)
(setq opoint (point))
;; Don't expand `.'.
;; Show just the file name within directory.
(let ((default-directory directory))
(dired-insert-directory
directory
(concat dired-actual-switches " -d")
(list filename)))
(goto-char opoint)
;; Put in desired marker char.
(when marker-char
(let ((dired-marker-char
(if (integerp marker-char) marker-char
dired-marker-char)))
(dired-mark nil)))
;; Compensate for a bug in ange-ftp.
;; It inserts the file's absolute name, rather than
;; the relative one. That may be hard to fix since it
;; is probably controlled by something in ftp.
(goto-char opoint)
(let ((inserted-name (dired-get-filename 'verbatim)))
(if (file-name-directory inserted-name)
(let (props)
(end-of-line)
(forward-char (- (length inserted-name)))
(setq props (text-properties-at (point)))
(delete-char (length inserted-name))
(let ((pt (point)))
(insert filename)
(set-text-properties pt (point) props))
(forward-char 1))
(forward-line 1)))
(forward-line -1)
(if dired-after-readin-hook
;; The subdir-alist is not affected...
(save-excursion ; ...so we can run it right now:
(save-restriction
(beginning-of-line)
(narrow-to-region (point)
(line-beginning-position 2))
(run-hooks 'dired-after-readin-hook))))
(dired-move-to-filename))
;; return nil if all went well
nil))
(if reason ; don't move away on failure
(goto-char opoint))
(not reason))) ; return t on success, nil else
;; Don't do it (dired-omit-mode).
;; Return t for success (perhaps we should return file-exists-p).
t))