Subject: bug#38992: 27.0.60; when enabled, fido-mode seems to break vc-git-grep

From: Dmitry Gutov <[email-masked]>
Date: Tue, 21 Jan 2020 02:56:12 +0300

On 21.01.2020 2:04, Stefan Monnier wrote:
>>> I'm not very familiar with the code.  Do we really need the
>>> minibuffer-force-complete call there?  I commented it out and can't see
>>> the difference.
> 
> The `minibuffer-force-complete` call is the one which actually selects
> the "first candidate" from the list of completions, so I do think it's necessary.

Oh. Right. Somehow I hadn't tested a scenario where this would matter.

> IIUC the bug under discussion is related to the `required` argument of
> `completing-read` (and to `minibuffer-completion-confirm`).

Right.

> If `required` was nil (as is the case in `grep-read-files` which
> I believe is the relevant function here), then when `test-completion`
> fails, we should probably just call `exit-minibuffer` (rather than tell
> the user that they should do that).

Ido added an extra prompt in situations like this, I think. What you're 
saying was my first suggestion, but it would require a more invasive change.

And icomplete-force-complete-and-exit, as implemented, calls 
minibuffer-force-complete-and-exit which doesn't seem to care (or know?) 
that REQUIRED was nil. If you have a particular change in mind, I'd 
happily try a patch.

BTW, I now see that my patch changes a function belonging to icomplete, 
whileas the intention was only to fix fido-mode's behavior. Do you think 
the change fits icomplete-mode as well?

> The problem here is probably caused by the fact that fido-mode arranges
> for `minibuffer-force-complete` to choose the *default* rather than to
> choose a candidate from the completion table.  It's rare for
> a completion table to return candidates that don't pass
> `test-completion` (tho it's by not impossible nor incorrect), but it's
> much less rare for the default not to pass `test-completion`.

Um, not sure I understand. The problem here is that typing 'all' (unless 
it matches some of the local files names) or '*.el' and typing RET 
doesn't work. minibuffer-force-complete tries to choose a completion 
from the table, and when it can't, we get the "Incomplete" message. 
Though if it can (there's a matching filename), it ends up worse for the 
user, in this particular situation.