Skip to content

Commit 58ef097

Browse files
committed
gh-124927: Fix conversion issue between coordinates and position in REPL
1 parent 16cd6cc commit 58ef097

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

Lib/_pyrepl/reader.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -576,11 +576,10 @@ def setpos_from_xy(self, x: int, y: int) -> None:
576576
j = 0
577577
cur_x = self.screeninfo[i][0]
578578
while cur_x < x:
579-
if self.screeninfo[i][1][j] == 0:
580-
continue
581-
cur_x += self.screeninfo[i][1][j]
579+
if self.screeninfo[i][1][j] != 0:
580+
pos += 1
581+
cur_x += 1
582582
j += 1
583-
pos += 1
584583

585584
self.pos = pos
586585

@@ -607,7 +606,17 @@ def pos2xy(self) -> tuple[int, int]:
607606
else:
608607
pos -= l + 1 # +1 cause newline is in buffer
609608
y += 1
610-
return p + sum(l2[:pos]), y
609+
610+
x = p
611+
i = 0
612+
cnt = 0
613+
while cnt < pos:
614+
if l2[i]:
615+
cnt += 1
616+
x += 1
617+
i += 1
618+
619+
return x, y
611620

612621
def insert(self, text: str | list[str]) -> None:
613622
"""Insert 'text' at the insertion point."""

Lib/test/test_pyrepl/test_reader.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,3 +312,23 @@ def test_key_press_on_tab_press_once(self):
312312
reader, _ = handle_all_events(events, prepare_reader=completing_reader)
313313

314314
self.assert_screen_equals(reader, f"{code}a")
315+
316+
def test_setpos_from_xy_for_non_printing_char(self):
317+
code = "# non \u200c printing character"
318+
events = code_to_events(code)
319+
320+
reader, _ = handle_all_events(events)
321+
reader.setpos_from_xy(8, 0)
322+
323+
self.assertEqual(reader.pos, 6)
324+
325+
def test_pos2xy_for_non_printing_char(self):
326+
code = "# non\u200cprinting character"
327+
events = code_to_events(code)
328+
329+
reader, _ = handle_all_events(events)
330+
reader.pos = 6
331+
x, y = reader.pos2xy()
332+
333+
self.assertEqual(x, 11)
334+
self.assertEqual(y, 0)

0 commit comments

Comments
 (0)