From 22bceda8199196185fc015d0bd4ef2bf2eec8219 Mon Sep 17 00:00:00 2001 From: Muhammad Haris Awan Date: Wed, 28 Oct 2026 01:38:18 +0500 Subject: [PATCH] gh-38066: Add Shift-Tab smart-dedent in IDLE editor --- Lib/idlelib/config-keys.def | 5 +++++ Lib/idlelib/config.py | 1 + Lib/idlelib/editor.py | 18 ++++++++++++++++++ ...-28-01-38-00.gh-issue-38066.idle-dedent.rst | 1 + 4 files changed, 25 insertions(+) create mode 100644 Misc/NEWS.d/next/IDLE/2026-10-28-01-38-00.gh-issue-38066.idle-dedent.rst diff --git a/Lib/idlelib/config-keys.def b/Lib/idlelib/config-keys.def index f71269b5b49f461..354319c13f00501 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 0e0c884bcf9b838..722924806893e1a 100644 --- a/Lib/idlelib/config.py +++ b/Lib/idlelib/config.py @@ -678,6 +678,7 @@ def GetCoreKeys(self, keySetName=None): '<>': [''], '<>': ['', ''], '<>': [''], + '<>': ['', ''], '<>': [''], '<>': [''], '<>': [''], diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 95ae8f450fa73d7..a2490250a3b2a55 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -141,6 +141,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) self.fregion = fregion = self.FormatRegion(self) # self.fregion used in smart_indent_event to access indent_region. text.bind("<>", fregion.indent_region_event) @@ -1426,6 +1427,23 @@ def smart_indent_event(self, event): finally: text.undo_block_stop() + def smart_dedent_event(self, event): + text = self.text + first, last = self.get_selection_indices() + text.undo_block_start() + try: + if first and last: + if index2line(first) != index2line(last): + return self.fregion.dedent_region_event(event) + prefix = text.get("insert linestart", "insert") + raw, effective = get_line_indent(prefix, self.tabwidth) + if raw == len(prefix) and effective > 0: + self.reindent_to(max(0, effective - self.indentwidth)) + text.see("insert") + return "break" + finally: + text.undo_block_stop() + def newline_and_indent_event(self, event): """Insert a newline and indentation after Enter keypress event. diff --git a/Misc/NEWS.d/next/IDLE/2026-10-28-01-38-00.gh-issue-38066.idle-dedent.rst b/Misc/NEWS.d/next/IDLE/2026-10-28-01-38-00.gh-issue-38066.idle-dedent.rst new file mode 100644 index 000000000000000..b27a9ce9e6ed170 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2026-10-28-01-38-00.gh-issue-38066.idle-dedent.rst @@ -0,0 +1 @@ +Add smart-dedent bound to Shift-Tab in IDLE to dedent selected lines or the current line.