+ nil default-directory nil)
+ (let ((default (and buffer-file-name
+ (abbreviate-file-name buffer-file-name))))
+ (minibuffer-with-setup-hook
+ (lambda () (setq minibuffer-default default))
+ (read-file-name (format "Dired %s(directory): " str)
+ nil default-directory nil)))))))
+
+;; We want to switch to a more sophisticated version of
+;; dired-read-dir-and-switches like the following, if there is a way
+;; to make it more intuitive. See bug#1285.
+
+;; (defun dired-read-dir-and-switches (str)
+;; ;; For use in interactive.
+;; (reverse
+;; (list
+;; (if current-prefix-arg
+;; (read-string "Dired listing switches: "
+;; dired-listing-switches))
+;; ;; If a dialog is about to be used, call read-directory-name so
+;; ;; the dialog code knows we want directories. Some dialogs can
+;; ;; only select directories or files when popped up, not both.
+;; (if (next-read-file-uses-dialog-p)
+;; (read-directory-name (format "Dired %s(directory): " str)
+;; nil default-directory nil)
+;; (let ((cie ()))
+;; (dolist (ext completion-ignored-extensions)
+;; (if (eq ?/ (aref ext (1- (length ext)))) (push ext cie)))
+;; (setq cie (concat (regexp-opt cie "\\(?:") "\\'"))
+;; (lexical-let* ((default (and buffer-file-name
+;; (abbreviate-file-name buffer-file-name)))
+;; (cie cie)
+;; (completion-table
+;; ;; We need a mix of read-file-name and
+;; ;; read-directory-name so that completion to directories
+;; ;; is preferred, but if the user wants to enter a global
+;; ;; pattern, he can still use completion on filenames to
+;; ;; help him write the pattern.
+;; ;; Essentially, we want to use
+;; ;; (completion-table-with-predicate
+;; ;; 'read-file-name-internal 'file-directory-p nil)
+;; ;; but that doesn't work because read-file-name-internal
+;; ;; does not obey its `predicate' argument.
+;; (completion-table-in-turn
+;; (lambda (str pred action)
+;; (let ((read-file-name-predicate
+;; (lambda (f)
+;; (and (not (member f '("./" "../")))
+;; ;; Hack! Faster than file-directory-p!
+;; (eq (aref f (1- (length f))) ?/)
+;; (not (string-match cie f))))))
+;; (complete-with-action
+;; action 'read-file-name-internal str nil)))
+;; 'read-file-name-internal)))
+;; (minibuffer-with-setup-hook
+;; (lambda ()
+;; (setq minibuffer-default default)
+;; (setq minibuffer-completion-table completion-table))
+;; (read-file-name (format "Dired %s(directory): " str)
+;; nil default-directory nil))))))))