Skip to content

Commit 59449e9

Browse files
committed
bpo-694339: IDLE: Dedenting with shift+tab
1 parent 23ec4b5 commit 59449e9

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

Lib/idlelib/config-keys.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ goto-line=<Alt-Key-g> <Meta-Key-g> <Alt-Key-G> <Meta-Key-G>
4747
smart-backspace=<Key-BackSpace>
4848
newline-and-indent=<Key-Return> <Key-KP_Enter>
4949
smart-indent=<Key-Tab>
50+
smart-dedent=<Shift-Key-Tab>
5051
indent-region=<Control-Key-bracketright>
5152
dedent-region=<Control-Key-bracketleft>
5253
comment-region=<Alt-Key-3> <Meta-Key-3>
@@ -98,6 +99,7 @@ goto-line=<Alt-Key-g> <Meta-Key-g>
9899
smart-backspace=<Key-BackSpace>
99100
newline-and-indent=<Key-Return> <Key-KP_Enter>
100101
smart-indent=<Key-Tab>
102+
smart-dedent=<Shift-ISO_Left_Tab>
101103
indent-region=<Control-Key-bracketright>
102104
dedent-region=<Control-Key-bracketleft>
103105
comment-region=<Alt-Key-3>
@@ -149,6 +151,7 @@ goto-line = <Control-Key-g>
149151
smart-backspace = <Key-BackSpace>
150152
newline-and-indent = <Key-Return> <Key-KP_Enter>
151153
smart-indent = <Key-Tab>
154+
smart-dedent = <Shift-ISO_Left_Tab>
152155
indent-region = <Control-Key-bracketright>
153156
dedent-region = <Control-Key-bracketleft>
154157
comment-region = <Control-Key-d>
@@ -200,6 +203,7 @@ goto-line=<Command-Key-j>
200203
smart-backspace=<Key-BackSpace>
201204
newline-and-indent=<Key-Return> <Key-KP_Enter>
202205
smart-indent=<Key-Tab>
206+
smart-dedent=<Shift-Key-Tab>
203207
indent-region=<Command-Key-bracketright>
204208
dedent-region=<Command-Key-bracketleft>
205209
comment-region=<Control-Key-3>
@@ -239,6 +243,7 @@ smart-backspace = <Key-BackSpace>
239243
change-indentwidth = <Control-Key-u>
240244
do-nothing = <Control-Key-F12>
241245
smart-indent = <Key-Tab>
246+
smart-dedent = <Shift-Key-Tab>
242247
center-insert = <Control-Key-l>
243248
history-next = <Control-Key-n>
244249
del-word-right = <Option-Key-Delete>

Lib/idlelib/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,7 @@ def GetCoreKeys(self, keySetName=None):
649649
'<<smart-backspace>>': ['<Key-BackSpace>'],
650650
'<<newline-and-indent>>': ['<Key-Return>', '<Key-KP_Enter>'],
651651
'<<smart-indent>>': ['<Key-Tab>'],
652+
'<<smart-dedent>>': ['<Shift-ISO_Left_Tab>', '<Shift-Key-Tab>'],
652653
'<<indent-region>>': ['<Control-Key-bracketright>'],
653654
'<<dedent-region>>': ['<Control-Key-bracketleft>'],
654655
'<<comment-region>>': ['<Alt-Key-3>'],

Lib/idlelib/editor.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ def __init__(self, flist=None, filename=None, key=None, root=None):
160160
text.bind("<<smart-backspace>>",self.smart_backspace_event)
161161
text.bind("<<newline-and-indent>>",self.newline_and_indent_event)
162162
text.bind("<<smart-indent>>",self.smart_indent_event)
163+
text.bind("<<smart-dedent>>", self.smart_dedent_event)
163164
text.bind("<<indent-region>>",self.indent_region_event)
164165
text.bind("<<dedent-region>>",self.dedent_region_event)
165166
text.bind("<<comment-region>>",self.comment_region_event)
@@ -1216,6 +1217,27 @@ def smart_indent_event(self, event):
12161217
finally:
12171218
text.undo_block_stop()
12181219

1220+
def smart_dedent_event(self, event):
1221+
# if selection:
1222+
# do dedent-region
1223+
# elif only whitespace to the left:
1224+
# dedent one level
1225+
first, last = self.get_selection_indices()
1226+
self.text.undo_block_start()
1227+
try:
1228+
if first and last:
1229+
if index2line(first) != index2line(last):
1230+
return self.dedent_region_event(event)
1231+
prefix = self.text.get('insert linestart', 'insert')
1232+
raw, effective = classifyws(prefix, self.tabwidth)
1233+
if raw == len(prefix):
1234+
# Only whitespace to the left
1235+
self.reindent_to(effective - self.indentwidth)
1236+
self.text.see('insert')
1237+
return 'break'
1238+
finally:
1239+
self.text.undo_block_stop()
1240+
12191241
def newline_and_indent_event(self, event):
12201242
text = self.text
12211243
first, last = self.get_selection_indices()

0 commit comments

Comments
 (0)