Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add "Copy only code" shell sidebar context-menu option
  • Loading branch information
taleinat committed May 1, 2021
commit ad28ec180aa519fc1348ef10bb5332d8a4e8f2fb
27 changes: 26 additions & 1 deletion Lib/idlelib/idle_test/test_sidebar.py
Original file line number Diff line number Diff line change
Expand Up @@ -720,7 +720,7 @@ def test_copy(self):

text.tag_add('sel', f'{first_line}.0', 'end-1c')
selected_text = text.get('sel.first', 'sel.last')
self.assertIn('if True:\n', selected_text)
self.assertTrue(selected_text.startswith('if True:\n'))
self.assertIn('\n1\n', selected_text)

sidebar.rmenu_copy_handler()
Expand Down Expand Up @@ -764,6 +764,31 @@ def test_copy_with_prompts(self):
copied_text = text.clipboard_get()
self.assertEqual(copied_text, selected_text_with_prompts)

@run_in_tk_mainloop
def test_copy_only_code(self):
sidebar = self.shell.shell_sidebar
text = self.shell.text

first_line = get_end_linenumber(text)

self.do_input(dedent('''\
if True:
print(1)

'''))
yield

text.tag_add('sel', f'{first_line}.0', 'end-1c')
selected_text = text.get('sel.first', 'sel.last')
self.assertTrue(selected_text.startswith('if True:\n'))
self.assertIn('\n1\n', selected_text)

sidebar.rmenu_copy_only_code_handler()
self.addCleanup(text.clipboard_clear)

copied_text = text.clipboard_get()
self.assertRegex(copied_text.strip(), r'^if True:\n[ \t]+print\(1\)$')


if __name__ == '__main__':
unittest.main(verbosity=2)
16 changes: 16 additions & 0 deletions Lib/idlelib/sidebar.py
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,8 @@ def context_menu_event(self, event):
rmenu.add_command(label='Copy', command=self.rmenu_copy_handler)
rmenu.add_command(label='Copy with prompts',
command=self.rmenu_copy_with_prompts_handler)
rmenu.add_command(label='Copy only code',
command=self.rmenu_copy_only_code_handler)
rmenu.tk_popup(event.x_root, event.y_root)
return "break"

Expand Down Expand Up @@ -480,6 +482,20 @@ def rmenu_copy_with_prompts_handler(self):
self.main_widget.clipboard_clear()
self.main_widget.clipboard_append(selected_text_with_prompts)

def rmenu_copy_only_code_handler(self):
"""Copy only the code from the selected text to the clipboard."""
text = self.text

# Find all text with the 'stdin' tag in the selected range
code_pieces = []
index = text.index('sel.first')
while tag_range := text.tag_nextrange('stdin', index, 'sel.last'):
index = tag_range[1]
code_pieces.append(text.get(*tag_range))

self.main_widget.clipboard_clear()
self.main_widget.clipboard_append('\n'.join(code_pieces))

def grid(self):
self.canvas.grid(row=1, column=0, sticky=tk.NSEW, padx=2, pady=0)

Expand Down