Subject: Re: bug#73234: 30.0.91; completion-preview-mode doesn't trigger for case-insensitive capf

From: Eshel Yaron <[email-masked]>
Date: Sat, 14 Sep 2024 08:07:58 +0200

Hello Morgan,

Morgan Willcock <[email-masked]> writes:

> I believe there is an issue with completion-preview-mode in that it
> doesn't seem to find all completions for a case-insensitive completion
> at point function.

Thanks for this report.

> Evaluating the code below in `emacs -Q` will put the current buffer into
> fundamental mode with a case-insensitive completion at point function:
>
>   (defun test-completion-at-point-function ()
>     "Complete the symbol at point."
>     (pcase (bounds-of-thing-at-point 'symbol)
>       (`(,beg . ,end)
>        (list beg end
>              (completion-table-case-fold
>               (completion-table-dynamic
>                (lambda (string)
>                  (list "TestSymbol"))))))))
>
>   (fundamental-mode)
>   (remove-hook 'completion-at-point-functions #'tags-completion-at-point-function)
>   (add-hook 'completion-at-point-functions #'test-completion-at-point-function)
>   (completion-preview-mode 1)
>
> Once the code is evaluated:
>
> - Typing "tes" into the buffer will not display the completion preview.
>
> - The default completion mechanism (as initiated with complete-symbol
>   via C-M-i) will work with no problems, and replace "tes" with the
>   completion "TestSymbol".
>
> - Typing "Tes" into the buffer will display the completion preview.
>
> I would expect that the completion preview should be displayed for both
> "tes" and "Tes" since a completion is available to use in both cases.

We could display the completion preview also when you type a prefix that
differs from a candidate prefix only in case (and in fact we already do,
when completion-ignore-case is non-nil), but the question is what to do
when you accept/insert this completion.  Namely, changing the prefix
from "tes" to "Tes" when you accept the completion suggestion adds
complications both in terms of implementation and in terms of UX, and
I'm not sure that this added complexity would be justified.

Do you have, or know of, a concrete use case with a completion table
that behaves like your test-completion-at-point-function?

Best,

Eshel