GNU bug report logs -
#7215
24.0.50; Minibuffer path completion mispositions point
Previous Next
Reported by: Tim Van Holder <tim.vanholder <at> gmail.com>
Date: Thu, 14 Oct 2010 13:20:03 UTC
Severity: normal
Found in version 24.0.50
Done: Stefan Monnier <monnier <at> iro.umontreal.ca>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
On Thu, 14 Oct 2010 15:22:16 +0200 Tim Van Holder <tim.vanholder <at> gmail.com> wrote:
> Recipe:
>
> $ mkdir directory
> $ cd directory
> $ mkdir subdir
> $ cd subdir
> $ emacs -Q
> C-x C-f
>
> At this point, the minibuffer will contain (with * indicating point):
>
> Find file: .../directory/subdir/*
>
> Now delete most of "directory", leaving the minibuffer as:
>
> Find file: .../dir*/subdir/
>
> Now press [tab]. This correctly completes "dir" back to "directory", but
> also moves point backwards, resulting in:
>
> Find file: .../di*rectory/subdir/
>
> The amount point moves seems to be relative to the place it should end
> up at (it will always be after the "di" regardless of whether the
> completion was for "di", "dir" or "direc"). It also seems to be related
> to the size of the subsequent path component; doing the same tab
> completion for the portion of the path before "directory" makes point
> jump much further back.
>
> For the last path component (subdir in this case) it _looks_ fine,
> resulting in
>
> Find file: .../directory/subdir*/
>
> But simply adding a single letter after the trailing '/' shows that this
> is just the one case where it looks like it's doing the right thing;
> trying to complete "subdir" from "sub" then yields:
>
> Find file: .../directory/subdi*r/x
The following patch appears to fix this problem (that is, it leaves
point before the `/' following the current path component; note that in
Emacs 23.1, path completion leaves point after the `/'):
[Message part 2 (text/x-patch, inline)]
*** /data/steve/bzr/emacs/trunk/lisp/minibuffer.el 2010-10-08 13:54:31.000000000 +0200
--- /data/steve/bzr/emacs/quickfixes/lisp/minibuffer.el 2010-10-15 15:46:18.000000000 +0200
***************
*** 574,580 ****
;; Insert in minibuffer the chars we got.
(completion--replace beg end completion))
;; Move point to its completion-mandated destination.
! (forward-char (- comp-pos (length completion)))
(if (not (or unchanged completed))
;; The case of the string changed, but that's all. We're not sure
--- 574,580 ----
;; Insert in minibuffer the chars we got.
(completion--replace beg end completion))
;; Move point to its completion-mandated destination.
! ;; (forward-char (- comp-pos (length completion)))
(if (not (or unchanged completed))
;; The case of the string changed, but that's all. We're not sure
[Message part 3 (text/plain, inline)]
Clearly, the movement calculation doesn't DTRT for path completion. I
tried the patch with other types of completion, e.g. function and
variable names, and it also seemed fine. But the movement is obviously
intended, so there must be cases I have overlooked where it is needed;
maybe for certain completion styles?
Steve Berman
This bug report was last modified 14 years and 276 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.