diff options
author | Matt Wozniski <mwozniski@bloomberg.net> | 2024-08-25 22:54:06 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-25 22:54:06 (GMT) |
commit | 602fcf97df1665538d4e9841f9dc6bc33e38bece (patch) | |
tree | cc892e3ee534c2781c0ce5dbf97658d08175c9e6 /Lib/_pyrepl | |
parent | 70bfef52b5734d6cd81c5e8ca9eaf85658916b04 (diff) | |
download | cpython-602fcf97df1665538d4e9841f9dc6bc33e38bece.zip cpython-602fcf97df1665538d4e9841f9dc6bc33e38bece.tar.gz cpython-602fcf97df1665538d4e9841f9dc6bc33e38bece.tar.bz2 |
gh-123177: Fix prompt for wrapped lines in pyrepl (#123324)
When display lines above the cursor come from the cache, the first line
to not come from the cache may be a wrapped line, starting half way
through a logical line in the buffer. Detect and handle this case to
avoid accidentally drawing a stray prompt in the middle of a logical
line.
Diffstat (limited to 'Lib/_pyrepl')
-rw-r--r-- | Lib/_pyrepl/reader.py | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/Lib/_pyrepl/reader.py b/Lib/_pyrepl/reader.py index 13b1f3e..aa3f5fd 100644 --- a/Lib/_pyrepl/reader.py +++ b/Lib/_pyrepl/reader.py @@ -345,7 +345,10 @@ class Reader: pos = self.pos pos -= offset + prompt_from_cache = (offset and self.buffer[offset - 1] != "\n") + lines = "".join(self.buffer[offset:]).split("\n") + cursor_found = False lines_beyond_cursor = 0 for ln, line in enumerate(lines, num_common_lines): @@ -359,7 +362,12 @@ class Reader: # No need to keep formatting lines. # The console can't show them. break - prompt = self.get_prompt(ln, ll >= pos >= 0) + if prompt_from_cache: + # Only the first line's prompt can come from the cache + prompt_from_cache = False + prompt = "" + else: + prompt = self.get_prompt(ln, ll >= pos >= 0) while "\n" in prompt: pre_prompt, _, prompt = prompt.partition("\n") last_refresh_line_end_offsets.append(offset) |