Subject: Re: 23.0.60; (minor) minibuffer file-name completion issue for files containing $

From: "Tim Van Holder" <[email-masked]>
Date: Fri, 29 Aug 2008 11:51:54 +0200

On Thu, Aug 28, 2008 at 4:15 PM, Chong Yidong <[email-masked]> wrote:
> "Tim Van Holder" <[email-masked]> writes:
>
>> On Wed, Aug 27, 2008 at 7:19 PM, Chong Yidong <[email-masked]> wrote:
>>> I've checked in a fix that should allow completions to work properly
>>> with files containing `$', including proper highlighting of the
>>> completions buffer.
>>
>> Unfortunately, after a fresh build this morning:
>>   make maintainer-clean
>>   /path/to/sources/configure --with-x
>>   make
>>   emacs -Q),
>> I still get the behaviour I saw yesterday: once it reaches
>> "/foo/$$blah." it claims there are no
>> completions.
>
> What is your precise recipe?  I can't reproduce the problem over here:
>
> touch \$blah.quux
> touch \$blah.xyzzy
> emacs -Q
> M-x shell RET
> cd $$b TAB     -> completes to \$blah.
> TAB            -> completions window opens up

Completion in a shell buffer does seem to work - but that's not what I
reported a problem with.
My problem is with filename completion in the minibuffer.
Recipe:
$ mkdir /foo
$ touch '/foo/$blah.quux'
$ touch '/foo/$blah.xyzzy'
$ emacs -Q
C-x C-f /foo
TAB (-> /foo/)
TAB (-> /foo/$$blah.)
TAB (-> [no completions])

A bit of fiddling shows this:
- if I have a path that extends past /foo/$ in the minibuffer, with
point at the end or just before the b,
  TAB expands $ to $$
  Examples (^ denotes point):
    "/foo/$b^" -> TAB -> "/foo/$$blah.^"
    "/foo/$^bla" -> TAB -> "/foo/$$blah.^"
- otherwise, if I have a path that extends past /foo/$ in the
minibuffer, with point after the $, TAB
  reports [No match]
  Examples (^ denotes point):
    "/foo/$b^la" -> TAB -> "/foo/$b^la [No match]"
    "/foo/$bl^a" -> TAB -> "/foo/$bl^a [No match]"
- if I have a path that extends past /foo/ in the minibuffer, with
point exactly before the $, TAB
  completes without doubling the $; and if the path already was
/foo/$blah., it pops up the
  completion buffer (at which point further TABs leave the minibuffer
unchanged instead of behaving
  as described above).
  Examples (^ denotes point):
    "/foo/^$bla" -> TAB -> "/foo/$blah.^"
    "/foo/^$blah." -> TAB -> "/foo/^$blah." + *Completions*
- otherwise, if I have a path that extends past /foo/ in the
minibuffer, with point exactly before the /,
  TAB pops up a completion buffer for the files in /foo (highlighting
the $ as the next character to type)
  Example (^ denotes point):
    "/foo^/$bla" -> TAB -> "/foo/^$blah." + *Completions*
- otherwise, if I have a path that extends past /foo/ in the
minibuffer, with point inside the "foo", TAB
  completes the /foo/ prefix (which they gets greyed out because of
the / already present behind it)
  Example (^ denotes point):
    "/fo^o/$bla" -> TAB -> "/foo//$blah." + *Completions*

Several of those cases seem to behaving decidedly oddly (although some
may be expected and
intended behaviour).