cpython icon indicating copy to clipboard operation
cpython copied to clipboard

New REPL repeats prompt with newline after each key

Open Kurpaph opened this issue 1 year ago • 6 comments

Bug report

Bug description:

# Add a code block here, if required
>>> input("word\n")
word
word
word
word
word
word
hello
'hello'

When using Python 3.13.0 with the interpreter on Windows Terminal, I tried to write a simple input message to the user with a line break. It resulted in a repetition of the message for every character I wrote and every pressing of a key on the keyboard (including backspace). It does not affect the usability of the input command, but it is annoying. The bug reproduced on Windows 10 and Windows 11. It does not appear to happen not on the IDLE nor on VSCode. Windows 11 24H2 Windows 10 22H2

CPython versions tested on:

3.13

Operating systems tested on:

Windows

Linked PRs

  • gh-139465
  • gh-142817

Kurpaph avatar Nov 20 '24 18:11 Kurpaph

Verified not in 3.12, starts in 3.13, so new REPL. Repetition starts with 2nd keypress.

terryjreedy avatar Nov 20 '24 19:11 terryjreedy

This issue is observed in these OS for me:

  • MacOS: 15.1 (24B83)
  • Linux: Ubuntu 20.04.6 LTS

shengbo-ma avatar Nov 28 '24 21:11 shengbo-ma

This issue looks interesting to me. Spent some time digging into it and guess I located where it happens.

I am willing to fix the issue but lack of context of what the above while loop is supposed to deal with.

Hope my observation could help whoever will fix this issue.

TL;DR

The new reader is not able to calculate the screen when prompt (reader.ps1="word\n") has multiple lines. It happens here

Test Case

Test case in this post: input("word\n")

The Code

Please see the comments on how it happens

            # prompt = "\x1b[1;35mword\n\x1b[0m". following this pattern f"{ANSIColors.BOLD_MAGENTA}{prompt}{ANSIColors.RESET}" It is copied from reader.ps1 which is `word\n`
           # is this while loop supposed to deal with the case when reader.ps1 has multiple lines?
            while "\n" in prompt:
                pre_prompt, _, prompt = prompt.partition("\n")
                # pre_prompt = "\x1b[1;35mword"m; prompt = "\x1b[0m"
                last_refresh_line_end_offsets.append(offset)
                # bug: screen is wrongly updated: 
                # Each time user hit a keyboard button, this while loop is executed
                # the same pre_prompt is added to screen
                # screen = ["\x1b[1;35mword", "\x1b[1;35mword", "\x1b[1;35mword", ..., "\x1b[0mthe_actual_user_input"]
                screen.append(pre_prompt)
                screeninfo.append((0, []))

I checked the pypy code of pyrepl. This part of code is not modified.

Tracing the Call

The calls that the example test case triggers:

shengbo-ma avatar Nov 29 '24 18:11 shengbo-ma

Does not occur in main branch build in old repl on linux.

Image

StanFromIreland avatar Jan 31 '25 19:01 StanFromIreland

This bug still exists in main mac

cc @terryjreedy

https://github.com/user-attachments/assets/00bfff07-f0f3-4c8a-a5ea-7e28373b1bb6

yihong0618 avatar Oct 01 '25 04:10 yihong0618

Does not occur in main branch build on linux.

Image

this only happen in new repl~

yihong0618 avatar Oct 01 '25 06:10 yihong0618