From: Stefan Monnier Date: Sun, 30 May 2010 14:17:31 +0000 (-0400) Subject: * lisp/minibuffer.el (completion-file-name-table): Don't return a boundary X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~438^2~168 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=5feec8cac13043a08abf3abb396911b042275fea;p=emacs.git * lisp/minibuffer.el (completion-file-name-table): Don't return a boundary past the end of `string'. (completion--file-name-table): Delegate to completion-file-name-table for the `boundaries' case. Fixes: debbugs:6299 --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 021d5a07421..e335ee5c344 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2010-05-30 Stefan Monnier + + * minibuffer.el (completion-file-name-table): Don't return a boundary + past the end of `string' (bug#6299). + (completion--file-name-table): Delegate to completion-file-name-table + for the `boundaries' case. + 2010-05-30 Juanma Barranquero * emulation/cua-base.el: Recognize `right-char' and `left-char' as diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index b1ecae3801d..646b773caf2 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -1342,12 +1342,19 @@ same as `substitute-in-file-name'." ((eq (car-safe action) 'boundaries) (let ((start (length (file-name-directory string))) (end (string-match-p "/" (cdr action)))) - (list* 'boundaries start end))) - - ((eq action 'lambda) - (if (zerop (length string)) - nil ;Not sure why it's here, but it probably doesn't harm. - (funcall (or pred 'file-exists-p) string))) + (list* 'boundaries + ;; if `string' is "C:" in w32, (file-name-directory string) + ;; returns "C:/", so `start' is 3 rather than 2. + ;; Not quite sure what is The Right Fix, but clipping it + ;; back to 2 will work for this particular case. We'll + ;; see if we can come up with a better fix when we bump + ;; into more such problematic cases. + (min start (length string)) end))) + + ((eq action 'lambda) + (if (zerop (length string)) + nil ;Not sure why it's here, but it probably doesn't harm. + (funcall (or pred 'file-exists-p) string))) (t (let* ((name (file-name-nondirectory string)) @@ -1395,19 +1402,20 @@ except that it passes the file name through `substitute-in-file-name'." (cond ((eq (car-safe action) 'boundaries) ;; For the boundaries, we can't really delegate to - ;; completion-file-name-table and then fix them up, because it - ;; would require us to track the relationship between `str' and + ;; substitute-in-file-name+completion-file-name-table and then fix + ;; them up (as we do for the other actions), because it would + ;; require us to track the relationship between `str' and ;; `string', which is difficult. And in any case, if - ;; substitute-in-file-name turns "fo-$TO-ba" into "fo-o/b-ba", there's - ;; no way for us to return proper boundaries info, because the - ;; boundary is not (yet) in `string'. - ;; FIXME: Actually there is a way to return correct boundaries info, - ;; at the condition of modifying the all-completions return accordingly. - (let ((start (length (file-name-directory string))) - (end (string-match-p "/" (cdr action)))) - (list* 'boundaries start end))) + ;; substitute-in-file-name turns "fo-$TO-ba" into "fo-o/b-ba", + ;; there's no way for us to return proper boundaries info, because + ;; the boundary is not (yet) in `string'. + ;; + ;; FIXME: Actually there is a way to return correct boundaries + ;; info, at the condition of modifying the all-completions + ;; return accordingly. But for now, let's not bother. + (completion-file-name-table string pred action)) - (t + (t (let* ((default-directory (if (stringp pred) ;; It used to be that `pred' was abused to pass `dir'