]> git.eshelyaron.com Git - emacs.git/commitdiff
(dired-read-dir-and-switches): Replace last change with
authorStefan Monnier <monnier@iro.umontreal.ca>
Tue, 29 Apr 2008 14:48:57 +0000 (14:48 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Tue, 29 Apr 2008 14:48:57 +0000 (14:48 +0000)
a new approach that mixes read-file-name and read-directory-name.

lisp/ChangeLog
lisp/dired.el

index 2d66f8e01f2d5287aad72ca09005e63fba872607..1661bfa789c45295226ed2b99997edf231e2d7b6 100644 (file)
@@ -1,5 +1,8 @@
 2008-04-29  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+       * dired.el (dired-read-dir-and-switches): Replace last change with
+       a new approach that mixes read-file-name and read-directory-name.
+
        * files.el (read-buffer-to-switch):
        Avoid making assumptions about `other-buffer'.
 
index 521b1769a8e429a4e753fd8a4229870583a7cd69..ba20ef2cc1b72a93aeb5b92ae7f1fb5b5cd7eb99 100644 (file)
@@ -594,12 +594,34 @@ Don't use that together with FILTER."
            ;; 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.
-           (let ((default (and buffer-file-name
-                               (abbreviate-file-name buffer-file-name))))
-             (minibuffer-with-setup-hook
-                 (lambda () (setq minibuffer-default default))
+           (if (next-read-file-uses-dialog-p)
                (read-directory-name (format "Dired %s(directory): " str)
-                                    nil default-directory nil))))))
+                                    nil default-directory nil)
+             (lexical-let ((default (and buffer-file-name
+                                          (abbreviate-file-name buffer-file-name)))
+                            (defdir default-directory))
+               (minibuffer-with-setup-hook
+                   (lambda ()
+                      (setq minibuffer-default default)
+                      (setq default-directory defdir))
+                  (completing-read
+                   (format "Dired %s(directory): " str)
+                   ;; 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 'file-directory-p))
+                        (complete-with-action
+                         action 'read-file-name-internal str nil)))
+                    'read-file-name-internal)
+                   nil nil (abbreviate-file-name defdir) 'file-name-history)))))))
 
 ;;;###autoload (define-key ctl-x-map "d" 'dired)
 ;;;###autoload