Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7d90b8a

Browse files
authored
gh-111201: Allow bracketed paste to work (GH-118700)
1 parentad3d877 commit7d90b8a

File tree

4 files changed

+61
-0
lines changed

4 files changed

+61
-0
lines changed

‎Lib/_pyrepl/commands.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,3 +462,13 @@ class paste_mode(Command):
462462
defdo(self)->None:
463463
self.reader.paste_mode=notself.reader.paste_mode
464464
self.reader.dirty=True
465+
466+
467+
classenable_bracketed_paste(Command):
468+
defdo(self)->None:
469+
self.reader.paste_mode=True
470+
471+
classdisable_bracketed_paste(Command):
472+
defdo(self)->None:
473+
self.reader.paste_mode=False
474+
self.reader.insert("\n")

‎Lib/_pyrepl/reader.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ def make_default_commands() -> dict[CommandName, type[Command]]:
127127
(r"\M-9","digit-arg"),
128128
# (r'\M-\n', 'insert-nl'),
129129
("\\\\","self-insert"),
130+
(r"\x1b[200~","enable_bracketed_paste"),
131+
(r"\x1b[201~","disable_bracketed_paste"),
130132
]
131133
+ [(c,"self-insert")forcinmap(chr,range(32,127))ifc!="\\"]
132134
+ [(c,"self-insert")forcinmap(chr,range(128,256))ifc.isalpha()]

‎Lib/_pyrepl/unix_console.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,10 +336,13 @@ def prepare(self):
336336
exceptValueError:
337337
pass
338338

339+
self.__enable_bracketed_paste()
340+
339341
defrestore(self):
340342
"""
341343
Restore the console to the default state
342344
"""
345+
self.__disable_bracketed_paste()
343346
self.__maybe_write_code(self._rmkx)
344347
self.flushoutput()
345348
tcsetattr(self.input_fd,termios.TCSADRAIN,self.__svtermstate)
@@ -525,6 +528,12 @@ def clear(self):
525528
self.__posxy=0,0
526529
self.screen= []
527530

531+
def__enable_bracketed_paste(self)->None:
532+
os.write(self.output_fd,b"\x1b[?2004h")
533+
534+
def__disable_bracketed_paste(self)->None:
535+
os.write(self.output_fd,b"\x1b[?2004l")
536+
528537
def__setup_movement(self):
529538
"""
530539
Set up the movement functions based on the terminal capabilities.

‎Lib/test/test_pyrepl.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,46 @@ def test_paste_not_in_paste_mode(self):
817817
output=multiline_input(reader)
818818
self.assertEqual(output,output_code)
819819

820+
deftest_bracketed_paste(self):
821+
"""Test that bracketed paste using\x1b[200~ and\x1b[201~ works."""
822+
# fmt: off
823+
input_code= (
824+
'def a():\n'
825+
' for x in range(10):\n'
826+
'\n'
827+
' if x%2:\n'
828+
' print(x)\n'
829+
'\n'
830+
' else:\n'
831+
' pass\n'
832+
)
833+
# fmt: on
834+
835+
output_code= (
836+
'def a():\n'
837+
' for x in range(10):\n'
838+
'\n'
839+
' if x%2:\n'
840+
' print(x)\n'
841+
'\n'
842+
' else:\n'
843+
' pass\n'
844+
'\n'
845+
)
846+
847+
paste_start="\x1b[200~"
848+
paste_end="\x1b[201~"
849+
850+
events=itertools.chain(
851+
code_to_events(paste_start),
852+
code_to_events(input_code),
853+
code_to_events(paste_end),
854+
code_to_events("\n"),
855+
)
856+
reader=self.prepare_reader(events)
857+
output=multiline_input(reader)
858+
self.assertEqual(output,output_code)
859+
820860

821861
classTestReader(TestCase):
822862
defassert_screen_equals(self,reader,expected):

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp