Ticket #4258 (accepted defect)

Opened 3 years ago

Last modified 2 months ago

Wrong subshell prompt parsing with fish 3.3.0

Reported by: olfway Owned by: andrew_b
Priority: major Milestone: Future Releases
Component: mc-core Version: master
Keywords: Cc: johannes
Blocked By: Blocking:
Branch state: on rework Votes for changeset:

Description

Fish 3.3.0 sends \r while printing prompt and mc erases prompt buffer

This change was introduced by https://github.com/fish-shell/fish-shell/pull/8011

It starts working after I modify parse_subshell_prompt_string function:

     /* Extract the prompt from the shell output */
     for (i = 0; i < bytes; i++)
-        if (buffer[i] == '\n' || buffer[i] == '\r')
+        if (buffer[i] == '\n')
             g_string_set_size (subshell_prompt_temp_buffer, 0);
         else if (buffer[i] != '\0')
             g_string_append_c (subshell_prompt_temp_buffer, buffer[i]);

Attachments

fish-3.3.0-prompt.png (29.6 KB) - added by olfway 3 years ago.

Change History

Changed 3 years ago by olfway

comment:1 Changed 3 years ago by andrew_b

  • Status changed from new to accepted
  • Owner set to andrew_b
  • Branch state changed from no branch to on review

Branch: 4258_fish_shell_prompt
changeset:e819ed742118dd4b9fc7d37e82830118df366ca4

Please test.

comment:2 Changed 3 years ago by olfway

I tried to run it and unfortunately it doesn't work - same empty prompt

So dumped buffer to a temporary file:

/W/l/m/mc^[(B^[[m (4258_fish_shell_prompt)^[(B^[[m> ^[[K^M^[[53C

and tried to "translate" this:

/W/l/m/mc                - Text
^[(B                     - Start sequence defining G0 character set, Select default (ISO 8859-1 mapping)
^[[m                     - Select Graphic Rendition, reset all attributes to their defaults
(4258_fish_shell_prompt) - Text
^[(B                     - Start sequence defining G0 character set, Select default (ISO 8859-1 mapping)
^[[m                     - Select Graphic Rendition, reset all attributes to their defaults
>                        - Text
^[[K                     - Erase line (default: from cursor to end of line).
^M                       - Carriage Return, moves the cursor to column zero
^[[53C                   - Move cursor right the indicated # of columns (53 here)

EDIT: Just realized this buffer also seems truncated,
but maybe something was wrong with my dump code

Last edited 3 years ago by olfway (previous) (diff)

comment:3 Changed 3 years ago by olfway

This for example multiline prompt (same empty prompt in mc):

2m~/W/l/m/mc^[(B^[[m|^[[31m4258_fish_shell_prompt⚡^[[34m*^[[33m?^[(B^[[m^M
➤ ^[(B^[[m^[[K^M^[[C^[[C

Actually it looks truncated, it probably should be like

user123@host123:~/W/l/m/mc|4258_fish_shell_prompt⚡*?
➤

comment:4 Changed 3 years ago by andrew_b

  • Branch state changed from on review to on rework

comment:5 Changed 3 years ago by olfway

9 months passed and it still broken :(

Any chances it could be fixed?

I had custom mc build with my change (as in description) and it works perfectly

comment:6 Changed 3 years ago by andrew_b

Related to #3121.

comment:7 Changed 2 months ago by zaytsev

  • Cc johannes added

Related discussion in fish: https://github.com/fish-shell/fish-shell/issues/8091 .

Johannes, since you seem to be active in fish, can you say something about this? Andrew started working on this, but never got to finish it. I wonder if this is still relevant to fish users.

comment:8 Changed 2 months ago by johannes

I haven't been able to reproduce this yet (but I remember seeing this missing prompt sometimes).

I put this in my config.fish

`
function fish_right_prompt

printf asdf

end
`

and ran mc

I confirmed that fish prints

^M^[[90Casdf

so \r, CSI 90 C to move the cursor 90 characters right and then the right prompt.

Last edited 2 months ago by johannes (previous) (diff)

comment:9 Changed 2 months ago by johannes

oh it's because mc explicitly erases the right prompt since c5aaeda39 (Ticket 3944: support user-defined prompt in the fish subshell., 2018-10-21)
If I remove the "functions -e fish_right_prompt", then the issue reproduces.
fish normally also uses \r before the normal prompt but they added a hack to not do that if running inside midnight commander,
(https://github.com/fish-shell/fish-shell/commit/b1b2294390b2a84afdf229d33b3a8bce51ea1a4f (Add workaround for Midnight Commander's issue with prompt extraction, 2023-02-04).
So this ticket seems worked around in the upcoming fish 4.0 release.
Should probably still fix it in mc.. but this is all a bit hacky, I guess the way forward is for mc to behave more like a terminal but it's already running inside another one. I wonder if there is a better architecture for this UI.

Note: See TracTickets for help on using tickets.