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):
# 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)
reader, _ = handle_events_narrow_console(events)
self.assert_screen_equals(reader, f"{9*"a"}\\\n{9*"a"}\\\naa")
+ def test_calc_screen_prompt_handling(self):
+ def prepare_reader_keep_prompts(*args, **kwargs):
+ reader = prepare_reader(*args, **kwargs)
+ del reader.get_prompt
+ reader.ps1 = ">>> "
+ reader.ps2 = ">>> "
+ reader.ps3 = "... "
+ reader.ps4 = ""
+ reader.can_colorize = False
+ reader.paste_mode = False
+ return reader
+
+ events = code_to_events("if some_condition:\nsome_function()")
+ reader, _ = handle_events_narrow_console(
+ events,
+ prepare_reader=prepare_reader_keep_prompts,
+ )
+ # fmt: off
+ self.assert_screen_equals(
+ reader,
+ (
+ ">>> if so\\\n"
+ "me_condit\\\n"
+ "ion:\n"
+ "... s\\\n"
+ "ome_funct\\\n"
+ "ion()"
+ )
+ )
+ # fmt: on
+
def test_calc_screen_wrap_three_lines_mixed_character(self):
# fmt: off
code = (