Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-29910: IDLE no longer delete character after commenting out a region #825

Merged
merged 4 commits into from Jun 27, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions Lib/idlelib/autocomplete.py
Expand Up @@ -60,6 +60,7 @@ def force_open_completions_event(self, event):
if a function call is needed.
"""
self.open_completions(True, False, True)
return "break"

def try_open_completions_event(self, event):
"""Happens when it would be nice to open a completion list, but not
Expand Down
7 changes: 5 additions & 2 deletions Lib/idlelib/calltip_w.py
Expand Up @@ -89,24 +89,27 @@ def checkhide_event(self, event=None):
# If the event was triggered by the same event that unbinded
# this function, the function will be called nevertheless,
# so do nothing in this case.
return
return None
curline, curcol = map(int, self.widget.index("insert").split('.'))
if curline < self.parenline or \
(curline == self.parenline and curcol <= self.parencol) or \
self.widget.compare("insert", ">", MARK_RIGHT):
self.hidetip()
return "break"
else:
self.position_window()
if self.checkhide_after_id is not None:
self.widget.after_cancel(self.checkhide_after_id)
self.checkhide_after_id = \
self.widget.after(CHECKHIDE_TIME, self.checkhide_event)
return None

def hide_event(self, event):
if not self.tipwindow:
# See the explanation in checkhide_event.
return
return None
self.hidetip()
return "break"

def hidetip(self):
if not self.tipwindow:
Expand Down
1 change: 1 addition & 0 deletions Lib/idlelib/calltips.py
Expand Up @@ -47,6 +47,7 @@ def _remove_calltip_window(self, event=None):
def force_open_calltip_event(self, event):
"The user selected the menu entry or hotkey, open the tip."
self.open_calltip(True)
return "break"

def try_open_calltip_event(self, event):
"""Happens when it would be nice to open a CallTip, but not really
Expand Down
1 change: 1 addition & 0 deletions Lib/idlelib/codecontext.py
Expand Up @@ -89,6 +89,7 @@ def toggle_code_context_event(self, event=None):
idleConf.SetOption("extensions", "CodeContext", "visible",
str(self.label is not None))
idleConf.SaveUserCfgFiles()
return "break"

def get_line_info(self, linenum):
"""Get the line indent value, text, and any block start keyword
Expand Down
30 changes: 24 additions & 6 deletions Lib/idlelib/editor.py
@@ -1,4 +1,3 @@
import importlib
import importlib.abc
import importlib.util
import os
Expand Down Expand Up @@ -147,7 +146,7 @@ def __init__(self, flist=None, filename=None, key=None, root=None):
text.bind("<<python-docs>>", self.python_docs)
text.bind("<<about-idle>>", self.about_dialog)
text.bind("<<open-config-dialog>>", self.config_dialog)
text.bind("<<open-module>>", self.open_module)
text.bind("<<open-module>>", self.open_module_event)
text.bind("<<do-nothing>>", lambda event: "break")
text.bind("<<select-all>>", self.select_all)
text.bind("<<remove-selection>>", self.remove_selection)
Expand Down Expand Up @@ -294,7 +293,7 @@ def new_callback(self, event):
def home_callback(self, event):
if (event.state & 4) != 0 and event.keysym == "Home":
# state&4==Control. If <Control-Home>, use the Tk binding.
return
return None
if self.text.index("iomark") and \
self.text.compare("iomark", "<=", "insert lineend") and \
self.text.compare("insert linestart", "<=", "iomark"):
Expand Down Expand Up @@ -423,6 +422,7 @@ def right_menu_event(self, event):
rmenu.tk_popup(event.x_root, event.y_root)
if iswin:
self.text.config(cursor="ibeam")
return "break"

rmenu_specs = [
# ("Label", "<<virtual-event>>", "statefuncname"), ...
Expand Down Expand Up @@ -464,11 +464,13 @@ def about_dialog(self, event=None):
"Handle Help 'About IDLE' event."
# Synchronize with macosx.overrideRootMenu.about_dialog.
help_about.AboutDialog(self.top)
return "break"

def config_dialog(self, event=None):
"Handle Options 'Configure IDLE' event."
# Synchronize with macosx.overrideRootMenu.config_dialog.
configdialog.ConfigDialog(self.top,'Settings')
return "break"

def help_dialog(self, event=None):
"Handle Help 'IDLE Help' event."
Expand All @@ -478,6 +480,7 @@ def help_dialog(self, event=None):
else:
parent = self.top
help.show_idlehelp(parent)
return "break"

def python_docs(self, event=None):
if sys.platform[:3] == 'win':
Expand All @@ -497,7 +500,7 @@ def cut(self,event):
def copy(self,event):
if not self.text.tag_ranges("sel"):
# There is no selection, so do nothing and maybe interrupt.
return
return None
self.text.event_generate("<<Copy>>")
return "break"

Expand All @@ -515,6 +518,7 @@ def select_all(self, event=None):
def remove_selection(self, event=None):
self.text.tag_remove("sel", "1.0", "end")
self.text.see("insert")
return "break"

def move_at_edge_if_selection(self, edge_index):
"""Cursor move begins at start or end of selection
Expand Down Expand Up @@ -575,8 +579,9 @@ def goto_line_event(self, event):
return "break"
text.mark_set("insert", "%d.0" % lineno)
text.see("insert")
return "break"

def open_module(self, event=None):
def open_module(self):
"""Get module name from user and open it.

Return module path or None for calls by open_class_browser
Expand All @@ -600,21 +605,27 @@ def open_module(self, event=None):
self.io.loadfile(file_path)
return file_path

def open_module_event(self, event):
self.open_module()
return "break"

def open_class_browser(self, event=None):
filename = self.io.filename
if not (self.__class__.__name__ == 'PyShellEditorWindow'
and filename):
filename = self.open_module()
if filename is None:
return
return "break"
head, tail = os.path.split(filename)
base, ext = os.path.splitext(tail)
from idlelib import browser
browser.ClassBrowser(self.flist, base, [head])
return "break"

def open_path_browser(self, event=None):
from idlelib import pathbrowser
pathbrowser.PathBrowser(self.flist)
return "break"

def open_turtle_demo(self, event = None):
import subprocess
Expand All @@ -623,6 +634,7 @@ def open_turtle_demo(self, event = None):
'-c',
'from turtledemo.__main__ import main; main()']
subprocess.Popen(cmd, shell=False)
return "break"

def gotoline(self, lineno):
if lineno is not None and lineno > 0:
Expand Down Expand Up @@ -879,6 +891,7 @@ def long_title(self):

def center_insert_event(self, event):
self.center()
return "break"

def center(self, mark="insert"):
text = self.text
Expand Down Expand Up @@ -910,6 +923,7 @@ def get_geometry(self):

def close_event(self, event):
self.close()
return "break"

def maybesave(self):
if self.io:
Expand Down Expand Up @@ -1357,6 +1371,7 @@ def comment_region_event(self, event):
line = lines[pos]
lines[pos] = '##' + line
self.set_region(head, tail, chars, lines)
return "break"

def uncomment_region_event(self, event):
head, tail, chars, lines = self.get_region()
Expand All @@ -1370,6 +1385,7 @@ def uncomment_region_event(self, event):
line = line[1:]
lines[pos] = line
self.set_region(head, tail, chars, lines)
return "break"

def tabify_region_event(self, event):
head, tail, chars, lines = self.get_region()
Expand All @@ -1382,6 +1398,7 @@ def tabify_region_event(self, event):
ntabs, nspaces = divmod(effective, tabwidth)
lines[pos] = '\t' * ntabs + ' ' * nspaces + line[raw:]
self.set_region(head, tail, chars, lines)
return "break"

def untabify_region_event(self, event):
head, tail, chars, lines = self.get_region()
Expand All @@ -1390,6 +1407,7 @@ def untabify_region_event(self, event):
for pos in range(len(lines)):
lines[pos] = lines[pos].expandtabs(tabwidth)
self.set_region(head, tail, chars, lines)
return "break"

def toggle_tabs_event(self, event):
if self.askyesno(
Expand Down
8 changes: 4 additions & 4 deletions Lib/idlelib/idle_test/test_parenmatch.py
Expand Up @@ -95,14 +95,14 @@ def test_paren_corner(self):
pm = self.get_parenmatch()

text.insert('insert', '# this is a commen)')
self.assertIsNone(pm.paren_closed_event('event'))
pm.paren_closed_event('event')

text.insert('insert', '\ndef')
self.assertIsNone(pm.flash_paren_event('event'))
self.assertIsNone(pm.paren_closed_event('event'))
pm.flash_paren_event('event')
pm.paren_closed_event('event')

text.insert('insert', ' a, *arg)')
self.assertIsNone(pm.paren_closed_event('event'))
pm.paren_closed_event('event')

def test_handle_restore_timer(self):
pm = self.get_parenmatch()
Expand Down
10 changes: 6 additions & 4 deletions Lib/idlelib/parenmatch.py
Expand Up @@ -94,26 +94,28 @@ def flash_paren_event(self, event):
.get_surrounding_brackets())
if indices is None:
self.bell()
return
return "break"
self.activate_restore()
self.create_tag(indices)
self.set_timeout_last()
return "break"

def paren_closed_event(self, event):
# If it was a shortcut and not really a closing paren, quit.
closer = self.text.get("insert-1c")
if closer not in _openers:
return
return "break"
hp = HyperParser(self.editwin, "insert-1c")
if not hp.is_in_code():
return
return "break"
indices = hp.get_surrounding_brackets(_openers[closer], True)
if indices is None:
self.bell()
return
return "break"
self.activate_restore()
self.create_tag(indices)
self.set_timeout()
return "break"

def restore_event(self, event=None):
self.text.tag_delete("paren")
Expand Down
1 change: 1 addition & 0 deletions Lib/idlelib/runscript.py
Expand Up @@ -63,6 +63,7 @@ def check_module_event(self, event):
return 'break'
if not self.tabnanny(filename):
return 'break'
return "break"

def tabnanny(self, filename):
# XXX: tabnanny should work on binary files as well
Expand Down
1 change: 1 addition & 0 deletions Lib/idlelib/scrolledlist.py
Expand Up @@ -76,6 +76,7 @@ def popup_event(self, event):
index = self.listbox.index("active")
self.select(index)
menu.tk_popup(event.x_root, event.y_root)
return "break"

def make_menu(self):
menu = Menu(self.listbox, tearoff=0)
Expand Down
1 change: 1 addition & 0 deletions Lib/idlelib/zoomheight.py
Expand Up @@ -20,6 +20,7 @@ def __init__(self, editwin):
def zoom_height_event(self, event):
top = self.editwin.top
zoom_height(top)
return "break"


def zoom_height(top):
Expand Down
@@ -0,0 +1,3 @@
IDLE no longer deletes a character after commenting out a region by a key
shortcut. Add ``return 'break'`` for this and other potential conflicts
between IDLE and default key bindings.