Subject: bug#74019: [PATCH] Optionally preserve selected candidate across *Completions* update

From: Spencer Baugh <[email-masked]>
Date: Mon, 28 Oct 2024 12:01:03 -0400

Stefan Monnier <[email-masked]> writes:

>>> Hmm... are we sure here that the `*Completions*`s content is related to
>>> the current completion session?  I don't think we want to preserve the
>>> selection when it came from an unrelated use of completion half an
>>> hour earlier.
>>
>> That's why I'm doing get-buffer-window here - I figure that if
>> *Completions* is currently displayed in a window, it's reasonable to
>> preserve the selected candidate.
>>
>> (The selected candidate in that window, I guess - so maybe I should use
>> window-point here?)
>>
>> It still might not be related to the current completion session, since
>> the user might have just manually switched buffers to *Completions*, but
>> I wasn't sure there was a good way to determine that... any suggestions?
>
> Indeed, it might not be related.  E.g in my setup, `*Completions*` is
> placed in a dedicated window&frame that is simply iconified/deiconified
> as needed, so your heuristic would fail.

(Interesting, is the code for that published somewhere?  What's the
motivation for that instead of a window?)

> I think we need to store in the *Completions* buffer some info about the
> completion session for which it was last used.  Or set some buffer-local
> var that indicates that the corresponding completion session is "done"
> (we can do that when we hide the *Completions* buffer, when we exit the
> minibuffer or the `completion-in-region-mode`).

It would be nice to store info about the completion session, but we
don't really have any concrete concept of "a completion session" right
now, right?  So it's not clear to me how we would keep track of when it
starts and ends.

Also, I think we sometimes want to avoid reusing *Completions* even
within a completion session: if we're using completion in a directory
tree containing a file /aaa/aaa, if we select "aaa" while completing on
"/a", then "aaa" shouldn't still be selected if we complete on "/aaa/a".

Do you think it would be sufficient to set a "done" buffer-local in
minibuffer-hide-completions?  That seems to be called in all the right
places.

Or maybe instead of a buffer-local, we could have
minibuffer-hide-completions do (goto-char (point-min)) so no completion
is selected anymore.  Then it becomes harmless to reuse that
*Completions* buffer.