(dired-read-dir-and-switches): Move things about to use less

recursion during macroexpansion.
This commit is contained in:
Stefan Monnier 2008-05-13 16:18:17 +00:00
parent 833e7ac3fc
commit b575007b0a
2 changed files with 35 additions and 29 deletions

View file

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

View file

@ -598,38 +598,41 @@ Don't use that together with FILTER."
(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