Repository navigation
IDLE save keyboard shortcut problem #56596
Description
Activity
IDLE (for Python 3.2) fails to save using the ctrl-s keyboard shortcut when caps-lock is enabled, and instead only saves when ctrl-shift-s is pressed.
When caps-lock is disabled, all shortcuts work normally.- addedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Jun 22, 2011 - changed the title
[-]IDLE save hotkey problem[/-][+]IDLE save keyboard shortcut problem[/+]on Jun 22, 2011 (The message I deleted was a duplicate of the original).
Verified with 3.2.0 on WinXP (Jacob, I/O issues, including keyboard, especially need system specified. What is yours? If Windows, this might be Windows-specific.)With CAPS LOCK on, Cntl-N, Cntl-O, Cntl-P, Alt-M, Alt-C work.
Cntl-S, Cntl-Shift-S, Alt-Shift-S, Cntl-Q do not.
(All of above from File menu). So behavior is variable.I'm running Windows 7 Home Premium 64-bit, on an Alienware M17x (a laptop) using the built-in keyboard.
It's definitely possible that the problem is Windows-specific; perhaps it has to do with the fact that when caps lock is on the shift modifier seems to invert the case back to lowercase; although I don't know how it would affect it in that way.
I can confirm this issue on Linux.
This issue is caused by not explicitly binding <Control-Key-S> to <<save-window>> in config-keys.def (and in configHandler.py's GetCoreKeys.) Presently, only <Control-key-s> binds to <<save-window>>.
Should all the lowercase bindings without uppercase bindings be changed, or should only a few be changed?
I would like to see them all changed.
I agree; lets be consistently lenient.
Attached is a patch to fix the caps-lock issue with Windows key bindings in config-keys.def.
Changes look complete and correct as far as I can tell, except that I have some confusion about the relation of Shift and CapsLock key. For instance, Control-C and Control-Shift-C (using the key labels) both interrupt a loop whether or not CapsLock is on. In all, 4 combinations work even though only 2 are listed.
interrupt-execution=<Control-Key-c> <Control-Key-C>However, this pair of specifications
+save-window-as-file=<Control-Shift-Key-S> <Control-Shift-Key-s>
+save-window=<Control-Key-s> <Control-Key-S>
only makes sense to me if 's' and 'S' refer to the 'S' key without and with CapLock on as using Shift is meant to give a different meaning. It appears to split the 4 combinations into 2 pairs that do different things.westleymartinez commented
on Mar 3, 2014 westleymartinezmannequinMannequinMore actionsI know that Tk has individual states for whether or not a key is pressed with Caps Lock or Shift or other modifiers, so maybe there is a way to have the shortcuts ignore Caps Lock entirely.
More info: http://stackoverflow.com/questions/665502/status-of-shift-and-caps-lock-in-python
See also "Modifier Keys" on the Tk Wiki:
http://wiki.tcl.tk/28331There are both deliberate and accidental platform-specific behavior differences among Tk implementations.
Reading the Tk Wiki page, it appears that Shift undoes ShiftLock except on Mac, where it does nothing. So there is effectively only ^a and ^A, etc.
Looking as the Get New Keys dialog, the Basic Key Binding Entry pane says "New keys .." plural, but as far as I can tell, only one new key can be entered. Moreover, Control-Key-a and Control-Shift-Key-A are possible, but not Control-Key-A. The latter is only possible with hand entry in the Advanced Key Binding Entry pane. This might be why some functions have a single key binding and some both. Perhaps the dialog should auto-augment Control-Key-x with Control-Key-X, where x is a lowercase letter.
3 remaining items
Tk does not fold the case of letter keysyms, so a binding has to exist for both cases. #157709 binds the other case automatically when the key sequences are applied to a window, for all keysets and extensions on all platforms; the keysets themselves are unchanged.
- added 4 commits that reference this issue
on Sep 18, 2026 IDLE issues has an uncategorized draft issue for making and applying the 3.15 backport, after previous on-hold backports.
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsDone
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
Linked PRs