Subject: bug#68022: 30.0.50; File cache completions accumulate instead of replacing minibuffer input

From: Eshel Yaron <[email-masked]>
Date: Mon, 25 Dec 2023 16:41:27 +0100

Eli Zaretskii <[email-masked]> writes:

>> From: Eshel Yaron <[email-masked]>
>> Cc: [email-masked]
>> Date: Mon, 25 Dec 2023 14:47:52 +0100
>>
>> Eli Zaretskii <[email-masked]> writes:
>>
>> >> Date: Mon, 25 Dec 2023 07:54:22 +0100
>> >> From:  Eshel Yaron
>> >>
>> >> With emacs -Q:
>> >>
>> >> 1. M-x file-cache-add-directory-using-find /path/to/emacs/
>> >> 2. C-x C-f mini C-TAB
>> >> 3. Observe the *Completions* buffer pop up with file cache
>> >> completions, suggesting as usual to "type M-<down> or M-<up> to move
>> >> point between completions."
>> >> 4. M-<down> M-<down> M-<up> ...
>> >> 5. Each candidate you highlight this way is inserted in the minibuffer
>> >> after the current input, instead of replacing the appropriate part of
>> >> the input.
>> >>
>> >> I see this already in Emacs 29.1, FWIW.
>> >
>> > Something is missing in the recipe above, because I get "No match"
>> > when I press C-TAB in step 2.  What did I miss?
>>
>> Hmm, I'm not sure.  Perhaps `file-cache-add-directory-using-find` didn't
>> do its job for some reason?
>
> How do I verify that?

`M-x file-cache-display` should show the cache contents.

> Could you perhaps show at least some of the cache and tell how to
> compare that with what I get here?

Sure, here's what I see after `M-x keep-lines RET mini RET` in the
output buffer of `M-x file-cache-display`:

--8<---------------cut here---------------start------------->8---
/Users/eshelyaron/emacs-29.1/src/deps/minibuf.d
/Users/eshelyaron/emacs-29.1/src/minibuf.c
/Users/eshelyaron/emacs-29.1/native-lisp/29_1_50-1fe1a1fd/preloaded/minibuffer-1b0f548b-7af20c5f.eln
/Users/eshelyaron/emacs-29.1/doc/emacs/mini.texi
/Users/eshelyaron/emacs-29.1/doc/lispref/minibuf.texi
/Users/eshelyaron/emacs-29.1/lib/mini-gmp.c
/Users/eshelyaron/emacs-29.1/lib/mini-gmp.h
/Users/eshelyaron/emacs-29.1/lib/mini-gmp-gnulib.c
/Users/eshelyaron/emacs-29.1/test/src/minibuf-tests.el
/Users/eshelyaron/emacs-29.1/test/lisp/minibuffer-tests.el
/Users/eshelyaron/emacs-29.1/test/lisp/minibuffer-resources/data/minibuffer-test-cttq$tion
/Users/eshelyaron/emacs-29.1/test/lisp/minibuffer-resources/lisp/cedet/semantic-utest-c.test
/Users/eshelyaron/emacs-29.1/test/lisp/minibuffer-resources/lisp/cedet/semantic-utest.test
/Users/eshelyaron/emacs-29.1/test/lisp/minibuffer-resources
/Users/eshelyaron/emacs-29.1/lisp/minibuf-eldef.el
/Users/eshelyaron/emacs-29.1/lisp/minibuffer.el
/Users/eshelyaron/emacs-29.1/lisp/use-package/use-package-diminish.el
--8<---------------cut here---------------end--------------->8---

>> > Is the above supposed to work in any Emacs source tree?  Also, what
>> > should be the default-directory in step 1 (if it's important) --
>> > should it be the root of the Emacs source tree?
>>
>> That shouldn't matter, I think, as long as you have several files with
>> "mini" in their names in the cache.
>
> If I invoke 'find' from the shell prompt, I get this:
>
>   D:\gnu\git\emacs\branch>find . -name "mini*"
>   ./doc/emacs/mini.texi
>   ./doc/lispref/minibuf.texi
>   ./lib/mini-gmp-gnulib.c
>   ./lib/mini-gmp.c
>   ./lib/mini-gmp.h
>   ./lisp/minibuf-eldef.el
>   ./lisp/minibuf-eldef.elc
>   ./lisp/minibuffer.el
>   ./lisp/minibuffer.elc
>   ./src/deps/minibuf.d
>   ./src/minibuf.c
>   ./src/minibuf.o
>   ./test/lisp/minibuffer-resources
>   ./test/lisp/minibuffer-resources/data/minibuffer-test-cttq$tion
>   ./test/lisp/minibuffer-tests.el
>   ./test/lisp/minibuffer-tests.elc
>   ./test/src/minibuf-tests.el
>
> Do you get something very different?

No, I get more or less the same.

Instead of using `file-cache-add-directory-using-find`, you can also set
`file-cache-alist` directly:

--8<---------------cut here---------------start------------->8---
(setq file-cache-alist
      '(("bar" "/foo")
        ("baz" "/foo")
        ("bad" "/foo")
        ("bay" "/foo")
        ("ban" "/foo")))
--8<---------------cut here---------------end--------------->8---

Then `C-x C-f ba C-TAB M-<down> M-<down> ...` should show the issue.

Earlier I wrote that the same issue appears in Emacs 29.1, but now I
tested that again and I think I might have been mistaken.  In Emacs 29.1
I see a different issue: `M-<down>` in the above recipe emits an error:

--8<---------------cut here---------------start------------->8---
Wrong type argument: number-or-marker-p, ""
--8<---------------cut here---------------end--------------->8---

and doesn't change the minibuffer contents.

Thanks,

Eshel