diff options
| -rw-r--r-- | lisp/ChangeLog | 3 | ||||
| -rw-r--r-- | lisp/dired.el | 32 |
2 files changed, 30 insertions, 5 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2d66f8e01f2..1661bfa789c 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,5 +1,8 @@ | |||
| 1 | 2008-04-29 Stefan Monnier <monnier@iro.umontreal.ca> | 1 | 2008-04-29 Stefan Monnier <monnier@iro.umontreal.ca> |
| 2 | 2 | ||
| 3 | * dired.el (dired-read-dir-and-switches): Replace last change with | ||
| 4 | a new approach that mixes read-file-name and read-directory-name. | ||
| 5 | |||
| 3 | * files.el (read-buffer-to-switch): | 6 | * files.el (read-buffer-to-switch): |
| 4 | Avoid making assumptions about `other-buffer'. | 7 | Avoid making assumptions about `other-buffer'. |
| 5 | 8 | ||
diff --git a/lisp/dired.el b/lisp/dired.el index 521b1769a8e..ba20ef2cc1b 100644 --- a/lisp/dired.el +++ b/lisp/dired.el | |||
| @@ -594,12 +594,34 @@ Don't use that together with FILTER." | |||
| 594 | ;; If a dialog is about to be used, call read-directory-name so | 594 | ;; If a dialog is about to be used, call read-directory-name so |
| 595 | ;; the dialog code knows we want directories. Some dialogs can | 595 | ;; the dialog code knows we want directories. Some dialogs can |
| 596 | ;; only select directories or files when popped up, not both. | 596 | ;; only select directories or files when popped up, not both. |
| 597 | (let ((default (and buffer-file-name | 597 | (if (next-read-file-uses-dialog-p) |
| 598 | (abbreviate-file-name buffer-file-name)))) | ||
| 599 | (minibuffer-with-setup-hook | ||
| 600 | (lambda () (setq minibuffer-default default)) | ||
| 601 | (read-directory-name (format "Dired %s(directory): " str) | 598 | (read-directory-name (format "Dired %s(directory): " str) |
| 602 | nil default-directory nil)))))) | 599 | nil default-directory nil) |
| 600 | (lexical-let ((default (and buffer-file-name | ||
| 601 | (abbreviate-file-name buffer-file-name))) | ||
| 602 | (defdir default-directory)) | ||
| 603 | (minibuffer-with-setup-hook | ||
| 604 | (lambda () | ||
| 605 | (setq minibuffer-default default) | ||
| 606 | (setq default-directory defdir)) | ||
| 607 | (completing-read | ||
| 608 | (format "Dired %s(directory): " str) | ||
| 609 | ;; We need a mix of read-file-name and read-directory-name | ||
| 610 | ;; so that completion to directories is preferred, but if | ||
| 611 | ;; the user wants to enter a global pattern, he can still | ||
| 612 | ;; use completion on filenames to help him write the pattern. | ||
| 613 | ;; Essentially, we want to use | ||
| 614 | ;; (completion-table-with-predicate | ||
| 615 | ;; 'read-file-name-internal 'file-directory-p nil) | ||
| 616 | ;; but that doesn't work because read-file-name-internal | ||
| 617 | ;; does not obey its `predicate' argument. | ||
| 618 | (completion-table-in-turn | ||
| 619 | (lambda (str pred action) | ||
| 620 | (let ((read-file-name-predicate 'file-directory-p)) | ||
| 621 | (complete-with-action | ||
| 622 | action 'read-file-name-internal str nil))) | ||
| 623 | 'read-file-name-internal) | ||
| 624 | nil nil (abbreviate-file-name defdir) 'file-name-history))))))) | ||
| 603 | 625 | ||
| 604 | ;;;###autoload (define-key ctl-x-map "d" 'dired) | 626 | ;;;###autoload (define-key ctl-x-map "d" 'dired) |
| 605 | ;;;###autoload | 627 | ;;;###autoload |