From 59449e9eb31a6fa35dd88fc55238dafe19e00309 Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Thu, 15 Jun 2017 16:38:37 +0800 Subject: [PATCH] bpo-694339: IDLE: Dedenting with shift+tab --- Lib/idlelib/config-keys.def | 5 +++++ Lib/idlelib/config.py | 1 + Lib/idlelib/editor.py | 22 ++++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/Lib/idlelib/config-keys.def b/Lib/idlelib/config-keys.def index 64788f9adf015c..8324753c2330cc 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= @@ -98,6 +99,7 @@ goto-line= smart-backspace= newline-and-indent= smart-indent= +smart-dedent= indent-region= dedent-region= comment-region= @@ -149,6 +151,7 @@ goto-line = smart-backspace = newline-and-indent = smart-indent = +smart-dedent = indent-region = dedent-region = comment-region = @@ -200,6 +203,7 @@ goto-line= smart-backspace= newline-and-indent= smart-indent= +smart-dedent= indent-region= dedent-region= comment-region= @@ -239,6 +243,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 6a9fc61c2b59d7..0b3346851c47a2 100644 --- a/Lib/idlelib/config.py +++ b/Lib/idlelib/config.py @@ -649,6 +649,7 @@ def GetCoreKeys(self, keySetName=None): '<>': [''], '<>': ['', ''], '<>': [''], + '<>': ['', ''], '<>': [''], '<>': [''], '<>': [''], diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index ab4f1a37c168c1..396da663c9eb63 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -160,6 +160,7 @@ 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) text.bind("<>",self.indent_region_event) text.bind("<>",self.dedent_region_event) text.bind("<>",self.comment_region_event) @@ -1216,6 +1217,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 = classifyws(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): text = self.text first, last = self.get_selection_indices()