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))