diff --git a/Lib/idlelib/config-keys.def b/Lib/idlelib/config-keys.def index f71269b5b49f46..fdfee7ec5e0571 100644 --- a/Lib/idlelib/config-keys.def +++ b/Lib/idlelib/config-keys.def @@ -47,6 +47,7 @@ goto-line= smart-backspace= newline-and-indent= smart-indent= +smart-dedent= indent-region= dedent-region= comment-region= @@ -107,6 +108,7 @@ goto-line= smart-backspace= newline-and-indent= smart-indent= +smart-dedent= indent-region= dedent-region= comment-region= @@ -167,6 +169,7 @@ goto-line = smart-backspace = newline-and-indent = smart-indent = +smart-dedent = indent-region = dedent-region = comment-region = @@ -227,6 +230,7 @@ goto-line= smart-backspace= newline-and-indent= smart-indent= +smart-dedent= indent-region= dedent-region= comment-region= @@ -275,6 +279,7 @@ smart-backspace = change-indentwidth = do-nothing = smart-indent = +smart-dedent = center-insert = history-next = del-word-right = diff --git a/Lib/idlelib/config.py b/Lib/idlelib/config.py index d10c88a43f9231..9f72bb82343a83 100644 --- a/Lib/idlelib/config.py +++ b/Lib/idlelib/config.py @@ -640,6 +640,7 @@ def GetCoreKeys(self, keySetName=None): '<>': [''], '<>': ['', ''], '<>': [''], + '<>': ['', ''], '<>': [''], '<>': [''], '<>': [''], diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 83112d85575e47..ff2a8cd97e53dd 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -154,8 +154,9 @@ def __init__(self, flist=None, filename=None, key=None, root=None): text.bind("<>",self.smart_backspace_event) text.bind("<>",self.newline_and_indent_event) text.bind("<>",self.smart_indent_event) + text.bind("<>", self.smart_dedent_event) self.fregion = fregion = self.FormatRegion(self) - # self.fregion used in smart_indent_event to access indent_region. + # self.fregion used in smart-x-events to access region. text.bind("<>", fregion.indent_region_event) text.bind("<>", fregion.dedent_region_event) text.bind("<>", fregion.comment_region_event) @@ -1386,6 +1387,27 @@ def smart_indent_event(self, event): finally: text.undo_block_stop() + def smart_dedent_event(self, event): + # if selection: + # do dedent-region + # elif only whitespace to the left: + # dedent one level + first, last = self.get_selection_indices() + self.text.undo_block_start() + try: + if first and last: + if index2line(first) != index2line(last): + return self.dedent_region_event(event) + prefix = self.text.get('insert linestart', 'insert') + raw, effective = get_line_indent(prefix, self.tabwidth) + if raw == len(prefix): + # Only whitespace to the left + self.reindent_to(effective - self.indentwidth) + self.text.see('insert') + return 'break' + finally: + self.text.undo_block_stop() + def newline_and_indent_event(self, event): """Insert a newline and indentation after Enter keypress event.