Skip to content

Commit e5154d2

Browse files
authored
Merge pull request #76 from lysnikolaou/pyrepl-paste-mode-newlines-mid
Fix paste mode when there are empty line in the middle
2 parents 07345da + 3dcf704 commit e5154d2

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

Lib/_pyrepl/commands.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,5 +432,5 @@ def do(self) -> None:
432432
class paste_mode(Command):
433433

434434
def do(self) -> None:
435-
self.reader.paste_mode = True
435+
self.reader.paste_mode = not self.reader.paste_mode
436436
self.reader.dirty = True

Lib/_pyrepl/readline.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,10 @@ def do(self):
219219
if not self.reader.paste_mode and indent:
220220
for i in range(prevlinestart, prevlinestart + indent):
221221
r.insert(r.buffer[i])
222-
else:
222+
elif not self.reader.paste_mode:
223223
self.finish = 1
224+
else:
225+
r.insert("\n")
224226

225227

226228
class backspace_dedent(commands.Command):

Lib/test/test_pyrepl.py

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -543,15 +543,53 @@ def test_paste(self):
543543
' if x%2:\n'
544544
' print(x)\n'
545545
' else:\n'
546-
' pass\n\n'
546+
' pass\n'
547+
)
548+
549+
events = itertools.chain([
550+
Event(evt='key', data='f3', raw=bytearray(b'\x1bOR')),
551+
], code_to_events(code), [
552+
Event(evt='key', data='f3', raw=bytearray(b'\x1bOR')),
553+
], code_to_events("\n"))
554+
reader = self.prepare_reader(events)
555+
output = multiline_input(reader)
556+
self.assertEqual(output, code)
557+
558+
def test_paste_mid_newlines(self):
559+
code = (
560+
'def f():\n'
561+
' x = y\n'
562+
' \n'
563+
' y = z\n'
547564
)
548565

549566
events = itertools.chain([
550567
Event(evt='key', data='f3', raw=bytearray(b'\x1bOR')),
551-
], code_to_events(code))
568+
], code_to_events(code), [
569+
Event(evt='key', data='f3', raw=bytearray(b'\x1bOR')),
570+
], code_to_events("\n"))
571+
reader = self.prepare_reader(events)
572+
output = multiline_input(reader)
573+
self.assertEqual(output, code)
574+
575+
def test_paste_mid_newlines_not_in_paste_mode(self):
576+
code = (
577+
'def f():\n'
578+
' x = y\n'
579+
' \n'
580+
' y = z\n\n'
581+
)
582+
583+
expected = (
584+
'def f():\n'
585+
' x = y\n'
586+
' '
587+
)
588+
589+
events = code_to_events(code)
552590
reader = self.prepare_reader(events)
553591
output = multiline_input(reader)
554-
self.assertEqual(output, code[:-1])
592+
self.assertEqual(output, expected)
555593

556594
def test_paste_not_in_paste_mode(self):
557595
input_code = (

0 commit comments

Comments
 (0)