]> granicus.if.org Git - python/commitdiff
bpo-29910: IDLE no longer deletes a character after commenting out a region (#825)
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 27 Jun 2017 04:02:32 +0000 (07:02 +0300)
committerterryjreedy <tjreedy@udel.edu>
Tue, 27 Jun 2017 04:02:32 +0000 (00:02 -0400)
This happened because shortcut has a class binding and 'break' was not returned.
Fix other potential conflicts between IDLE and default key bindings.

* Add news item

* Update NEWS

Lib/idlelib/autocomplete.py
Lib/idlelib/calltip_w.py
Lib/idlelib/calltips.py
Lib/idlelib/codecontext.py
Lib/idlelib/editor.py
Lib/idlelib/idle_test/test_parenmatch.py
Lib/idlelib/parenmatch.py
Lib/idlelib/runscript.py
Lib/idlelib/scrolledlist.py
Lib/idlelib/zoomheight.py
Misc/NEWS.d/next/IDLE/2017-06-26-22-45-27.bpo-29910.mqHh7u.rst [new file with mode: 0644]

index 1e44fa5bc66e8aecdf623ac4a10687b745c9630b..cd212ccb143a3c7a0a30327e2777326bbef48d02 100644 (file)
@@ -60,6 +60,7 @@ class AutoComplete:
         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
index c7361d18d66efde7dda6bcac894493e97639e0ff..bf967f40b6ab1c10a7a683c20a74d38ab343f79c 100644 (file)
@@ -89,24 +89,27 @@ class CallTip:
             # 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:
index 4c5aea2acbf40ba0c3849abe9e0ffa893648c505..a8a3abe6c6982a8a7db1c5f991cbe93f4a931da5 100644 (file)
@@ -47,6 +47,7 @@ class CallTips:
     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
index f25e1b33a086e8597da97456063d2cd10117e44b..09dc078d63f1917eb58dc86d5ad3472348cff20e 100644 (file)
@@ -89,6 +89,7 @@ class CodeContext:
         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
index 13b4a51c18dff33534ffac0d0c0982e61c3fd35a..5b64ef4630e737f2e87926adf94d0c407d4c222a 100644 (file)
@@ -1,4 +1,3 @@
-import importlib
 import importlib.abc
 import importlib.util
 import os
@@ -147,7 +146,7 @@ class EditorWindow(object):
         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)
@@ -294,7 +293,7 @@ class EditorWindow(object):
     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"):
@@ -423,6 +422,7 @@ class EditorWindow(object):
         rmenu.tk_popup(event.x_root, event.y_root)
         if iswin:
             self.text.config(cursor="ibeam")
+        return "break"
 
     rmenu_specs = [
         # ("Label", "<<virtual-event>>", "statefuncname"), ...
@@ -464,11 +464,13 @@ class EditorWindow(object):
         "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."
@@ -478,6 +480,7 @@ class EditorWindow(object):
         else:
             parent = self.top
         help.show_idlehelp(parent)
+        return "break"
 
     def python_docs(self, event=None):
         if sys.platform[:3] == 'win':
@@ -497,7 +500,7 @@ class EditorWindow(object):
     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"
 
@@ -515,6 +518,7 @@ class EditorWindow(object):
     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
@@ -575,8 +579,9 @@ class EditorWindow(object):
             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
@@ -600,21 +605,27 @@ class EditorWindow(object):
                 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
@@ -623,6 +634,7 @@ class EditorWindow(object):
                '-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:
@@ -879,6 +891,7 @@ class EditorWindow(object):
 
     def center_insert_event(self, event):
         self.center()
+        return "break"
 
     def center(self, mark="insert"):
         text = self.text
@@ -910,6 +923,7 @@ class EditorWindow(object):
 
     def close_event(self, event):
         self.close()
+        return "break"
 
     def maybesave(self):
         if self.io:
@@ -1357,6 +1371,7 @@ class EditorWindow(object):
             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()
@@ -1370,6 +1385,7 @@ class EditorWindow(object):
                 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()
@@ -1382,6 +1398,7 @@ class EditorWindow(object):
                 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()
@@ -1390,6 +1407,7 @@ class EditorWindow(object):
         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(
index b5fd0d1c69e4f1e47382c5756f94365c17f8e4fd..cbec35018b990f85bce93581c3b690ce1faf62bf 100644 (file)
@@ -95,14 +95,14 @@ class ParenMatchTest(unittest.TestCase):
         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()
index ccec708f31f43685c7bf9181347b8f61b9dcb647..dcec34c18f92875ebaddfd37639d3a242117e690 100644 (file)
@@ -94,26 +94,28 @@ class ParenMatch:
                    .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")
index 79d86adabc85a09fbd6db1f89421fd8a41409015..3355f17d90bdb724ca86a5616ef8b2cd3a545522 100644 (file)
@@ -63,6 +63,7 @@ class ScriptBinding:
             return 'break'
         if not self.tabnanny(filename):
             return 'break'
+        return "break"
 
     def tabnanny(self, filename):
         # XXX: tabnanny should work on binary files as well
index cc08c26e5eefaa9d087aa2e233136ff54f8dfaf9..cdf658404ab643ac7ef3c9b8c10674f753ad8128 100644 (file)
@@ -76,6 +76,7 @@ class ScrolledList:
         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)
index aa4a427eab737ffac6340059e002b105ac4866c8..d01c9e964aa60f6d9418103208ce3e9131a13c3a 100644 (file)
@@ -20,6 +20,7 @@ class ZoomHeight:
     def zoom_height_event(self, event):
         top = self.editwin.top
         zoom_height(top)
+        return "break"
 
 
 def zoom_height(top):
diff --git a/Misc/NEWS.d/next/IDLE/2017-06-26-22-45-27.bpo-29910.mqHh7u.rst b/Misc/NEWS.d/next/IDLE/2017-06-26-22-45-27.bpo-29910.mqHh7u.rst
new file mode 100644 (file)
index 0000000..5157f8b
--- /dev/null
@@ -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.