Subject: Re: bug#42058: Cannot M-x (some?) single-letter commands in‘fido-mode’

From: João Távora <[email-masked]>
Date: Mon, 29 Jun 2020 15:13:11 +0100

Hello Dario,

Dario Gjorgjevski <[email-masked]> writes:

> Okay, this one is super weird.
>
> To reproduce, launch ‘emacs -Q’ and then
>
>     M-: (defun T () (interactive) (message "T")) RET
>     M-x fido-mode RET
>     M-x T RET
>
> This results in “Wrong type argument: number-or-marker-p, nil”.  The
> issue seems to stem from the fact that
>
>     M-: (read-extended-command) RET
>     T RET
>
> returns ‘icomplete-fido-delete-char’ as opposed to ‘T’, which is
> returned when ‘fido-mode’ is disabled.

Yes, that is exactly it.

First, let's establish that the error happens because you're invoking an
interactive command that doesn't make sense in that context.  The
question becomes why pressing, in succession

   M-x T

does _not_ place the command named "T" in the top of the list so that
typing RET immediately would invoke it.  I don't have a good answer for
this yet.  I do know that two letters don't trigger this problem:

   (defun tt () (interactive) (message "yay TT"))

Will be the first completion to M-x tt ...

The completion to icomplete-fido-delete-char is just accidental: it
could have completed to anything else containing a "t" (since by
default, fido-mode is case-insensitive).

By the way, you can _force_ M-x to complete to the command named T by
typing M-j _instead_ of RET.   

João