# HG changeset patch # User Chong Yidong # Date 1226154294 0 # Node ID 68e0d804e3133683ad625eb2bf5eb0c5cc83f130 # Parent 6e8d558c66cb1670d026b1a42205d059771b2c4a (dired-read-dir-and-switches): Revert to 2007-11-22 version (bug@1285). diff -r 6e8d558c66cb -r 68e0d804e313 lisp/dired.el --- a/lisp/dired.el Sat Nov 08 14:23:06 2008 +0000 +++ b/lisp/dired.el Sat Nov 08 14:24:54 2008 +0000 @@ -589,52 +589,75 @@ (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)))))))) + (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 ((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)))))))) ;;;###autoload (define-key ctl-x-map "d" 'dired) ;;;###autoload