On Mon, Sep 01, 2025 at 08:31:09AM +0200, Helmut Grohne wrote:
> I am observing an annoying oddity when using mutt inside foot. By 
> default, foot causes meta ("alt" key) to send a ESC (0x1b) as a prefix. 
> This is what xterm calls metaSendsEscape (see manual page of foot for 
> details) and as far as I can see, this is also what mutt expects. The 
> behavior of the meta key can be changed at runtime using the escape 
> sequences named "smm" and "rmm" in the terminfo database. Consider the 
> following interaction in both an xterm and a foot terminal:
>  * Start the terminal (expecting a bash shell).
>  * Press meta-1.
>    + Both: This invokes a readline behavior and looks like "(arg: 1)".
>  * Press ctrl-c to abort.
>  * Start mutt.
>  * Use a key binding that involves meta. Example meta-l to show the 
>    current limit.
>    + xterm: "No limit pattern is in effect."
>    + foot: "Key is not bound.  Press '?' for help."
>  * Exit mutt.
>  * Press meta-1.
>    + xterm: "(arg: 1)"
>    + foot: "±"
>  * On foot, we may restore the meta behavior using printf "\e[?1036h" 
>    (first half of rmm) or by resetting the terminal.
> 
> What we can see here is that mutt somehow invokes smm and thus disables 
> the sending of meta keys for sending escape, but it does not expect that 
> behavior. It also does not restore the behavior on exit.
> 
> We can further verify this by running mutt in strace and observing what 
> it writes to stdout. Right after parsing /etc/Muttrc it goes:
> 
> write(1, "\33[?1036l\33[?1034h\33[39;49m\33[37m\33[40m\33[H\33[2J", 41) = 41
> 
> That \33[?1036l is what disables the sending of esc. However, I could 
> not locate any relevant "smm", "rmm" or "1036l" in the mutt source code 
> that would be causing this. Ultimately, I may be looking at the wrong 
> layer.
> 
> I appreciate if someone knows a workaround for the issue. What works is 
> pressing the actual escape key (e.g. esc then l instead of meta-l). In 
> any case, this is not working as intended.

Timo Roehling helped me track this down. The ncurses function that
controls rmm/smm is called "meta". As it happens, mutt calls

    meta (stdscr, TRUE);

in its main.c. According to the ncurses documentation, the TRUE
parameter causes smm to be sent. According to infocmp, smm corresponds
to \E[?1036l\E[?103. According to the foot manual page, this disables
meta-sends-escape. This is exactly, the behavior I am observing.

I also found the meta_key option in the muttrc manual. It defaults to
no. Setting it to yes would be supposed to meta meta interpretation work
when it is set to eight-bit. Practically, I cannot confirm that this
works as expected.

Can we make mutt not fiddle with the smm/rmm settings? Alternatively,
can we make this feature opt-out via some muttrc option?

Helmut

Reply via email to