Subject: bug#43120: 28.0.50; fido-mode: M-j before completions appear selects wrong choice

From: Sean Whitton <[email-masked]>
Date: Fri, 04 Sep 2020 07:47:24 -0700

Hello Lars,

On Fri 04 Sep 2020 at 05:27AM +02, Lars Ingebrigtsen wrote:

> Sean Whitton <[email-masked]> writes:
>
>> Unfortunately it does not, so I guess icomplete-fido-exit is not exiting
>> the minibuffer through that path.
>
> Hm.  Am I misreading the code here?  So the else branch definitely calls
> exit-minibuffer...
>
> (defun icomplete-fido-exit (force)
> [...]
>   (if (and (not force) minibuffer--require-match)
>       (minibuffer-complete-and-exit)
>     (exit-minibuffer)))
>
> And the "then" branch ends up here:
>
> (defun minibuffer-complete-and-exit ()
> [...]
>   (completion-complete-and-exit (minibuffer-prompt-end) (point-max)
>                                 #'exit-minibuffer))
>
> Hm...  which then calls completion--complete-and-exit, which should then
> end up calling the exit function in...  hm.  Perhaps not all the
> branches?  There's a bunch of callbacks, but I thought I followed them
> all to the end and they all ended up calling the exit function, but
> perhaps not?  Would it be possible for you to edebug through
> completion-complete-and-exit?

I think I see what the problem is.  I was doing the following to
generate a test case: C-h f comp [wait for completions to appear] C-g

This leaves completion-content-when-empty populated to interfere with
the next run, as getting out of the minibuffer that way does not clear
the variable, but it should.

Might it work to set the variable buffer-local to the minibuffer?  Then
we can be sure it would always be cleared.

-- 
Sean Whitton