changeset 94894:05e7c4a4e123

(dired-read-dir-and-switches): Move things about to use less recursion during macroexpansion.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 13 May 2008 16:18:17 +0000
parents 8a9fade74963
children 6dec6afb918b
files lisp/ChangeLog lisp/dired.el
diffstat 2 files changed, 35 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Tue May 13 08:39:54 2008 +0000
+++ b/lisp/ChangeLog	Tue May 13 16:18:17 2008 +0000
@@ -1,5 +1,8 @@
 2008-05-13  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+	* dired.el (dired-read-dir-and-switches): Move things about to use less
+	recursion during macroexpansion.
+
 	* dired.el (dired-read-dir-and-switches): Use read-file-name.
 
 	* dired.el (dired-read-dir-and-switches): Ignore ., .., and
--- a/lisp/dired.el	Tue May 13 08:39:54 2008 +0000
+++ b/lisp/dired.el	Tue May 13 16:18:17 2008 +0000
@@ -598,38 +598,41 @@
     (if (next-read-file-uses-dialog-p)
         (read-directory-name (format "Dired %s(directory): " str)
                              nil default-directory nil)
-      (lexical-let ((default (and buffer-file-name
-                                  (abbreviate-file-name buffer-file-name)))
-                    (cie ()))
+      (let ((cie ()))
         (dolist (ext completion-ignored-extensions)
           (if (eq ?/ (aref ext (1- (length ext)))) (push ext cie)))
         (setq cie (concat (regexp-opt cie "\\(?:") "\\'"))
-        (minibuffer-with-setup-hook
-            (lambda ()
-              (setq minibuffer-default default)
-              (setq minibuffer-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)))
-          (read-file-name (format "Dired %s(directory): " str)
-                          nil default-directory nil)))))))
+        (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