bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#7215: 24.0.50; Minibuffer path completion mispositions point


From: Stephen Berman
Subject: bug#7215: 24.0.50; Minibuffer path completion mispositions point
Date: Fri, 15 Oct 2010 16:08:51 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux)

On Thu, 14 Oct 2010 15:22:16 +0200 Tim Van Holder <address@hidden> 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 `/'):

*** /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
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

reply via email to

[Prev in Thread] Current Thread [Next in Thread]