Subject: bug#57163: completing-read not allow cycling of the options by default

From: Eli Zaretskii <[email-masked]>
Date: Sat, 13 Aug 2022 18:14:43 +0300

> Date: Sat, 13 Aug 2022 14:32:02 +0000
> From: uzibalqa <[email-masked]>
> Cc: Michael Heerdegen <[email-masked]>, [email-masked]
> 
> > > You mean the completion candidates? M-<up> and M-<down> do that (by
> > > default).
> 
> > As does repeatedly pressing TAB, right? Or maybe I don't understand
> > what is meant by "cycling" in this context? An example of using
> > completing-read and the lack of cycling would be appreciated.
> 
> Correct, TAB, M-<up>, M-<down> do not execute any functionality

They do here, see below.

> Consider the following function.  Call the function with "M-x change-cursor".
> TAB produces "[Complete, but not unique]"; whilst "M-down" and "M-up" result
> in [M-down is undefined]  and [M-up is undefined].
> 
> (defun change-cursor (form)
>   "Modify the cursor form."
> 
>   (interactive
>    (list
>     (let ( (cseq '("bar" "hbar" "hollow" "box")) )
>       (completing-read " Cursor: " cseq nil t "box"))))
> 
>   (pcase form
>     ("bar"
>      (set-default 'cursor-type 'bar)
>     ("hbar"
>      (set-default 'cursor-type 'hbar)
>     ("hollow"
>      (set-default 'cursor-type 'hollow)
>     ("box"
>      (set-default 'cursor-type 'box))) )

If I evaluate

    (let ( (cseq '("bar" "hbar" "hollow" "box")) )
      (completing-read " Cursor: " cseq nil t "box"))

then I can cycle through all the candidates with M-n and M-p.  TAB
doesn't do anything because the window showing the candidates is small
and shows all of them at once.