# HG changeset patch # User Stefan Monnier # Date 1208975870 0 # Node ID 9060af7294b9d94e99d27c3aa91d15fec37ac68a # Parent b47239d57d3691a689523f09175fb5a8c2483e36 (read-file-name): Don't let-bind default-directory. Only abbreviate default-filename if it's a file. diff -r b47239d57d36 -r 9060af7294b9 lisp/ChangeLog --- a/lisp/ChangeLog Wed Apr 23 18:19:57 2008 +0000 +++ b/lisp/ChangeLog Wed Apr 23 18:37:50 2008 +0000 @@ -1,5 +1,8 @@ 2008-04-23 Stefan Monnier + * minibuffer.el (read-file-name): Don't let-bind default-directory. + Only abbreviate default-filename if it's a file. + * minibuffer.el (read-file-name-function, read-file-name-predicate) (read-file-name-completion-ignore-case, insert-default-directory): New vars, moved from fileio.c. diff -r b47239d57d36 -r 9060af7294b9 lisp/minibuffer.el --- a/lisp/minibuffer.el Wed Apr 23 18:19:57 2008 +0000 +++ b/lisp/minibuffer.el Wed Apr 23 18:37:50 2008 +0000 @@ -834,7 +834,8 @@ ;; If dir starts with user's homedir, change that to ~. (setq dir (abbreviate-file-name dir)) ;; Likewise for default-filename. - (setq default-filename (abbreviate-file-name default-filename)) + (if default-filename + (setq default-filename (abbreviate-file-name default-filename))) (let ((insdef (cond ((and insert-default-directory (stringp dir)) (if initial @@ -846,17 +847,25 @@ (if read-file-name-function (funcall read-file-name-function prompt dir default-filename mustmatch initial predicate) - (let ((default-directory (file-name-as-directory (expand-file-name dir))) - (completion-ignore-case read-file-name-completion-ignore-case) + (let ((completion-ignore-case read-file-name-completion-ignore-case) (minibuffer-completing-file-name t) (read-file-name-predicate (or predicate 'file-exists-p)) (add-to-history nil)) (let* ((val (if (not (next-read-file-uses-dialog-p)) - (completing-read prompt 'read-file-name-internal - nil mustmatch insdef 'file-name-history - default-filename) + ;; We used to pass `dir' to `read-file-name-internal' by + ;; abusing the `predicate' argument. It's better to + ;; just use `default-directory', but in order to avoid + ;; changing `default-directory' in the current buffer, + ;; we don't let-bind it. + (lexical-let ((dir (file-name-as-directory + (expand-file-name dir)))) + (minibuffer-with-setup-hook + (lambda () (setq default-directory dir)) + (completing-read prompt 'read-file-name-internal + nil mustmatch insdef 'file-name-history + default-filename))) ;; If DIR contains a file name, split it. (let ((file (file-name-nondirectory dir))) (when (and default-filename (not (zerop (length file))))