Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9bdb1ed

Browse files
committed
Issue #27173: Add 'IDLE Modern Unix' to the built-in key sets.
Make the default key set depend on the platform. Add tests for changes to the config module.
1 parent ce85acf commit 9bdb1ed

5 files changed

Lines changed: 270 additions & 57 deletions

File tree

Lib/idlelib/config-keys.def

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,57 @@ change-indentwidth=<Alt-Key-u>
109109
del-word-left=<Alt-Key-BackSpace>
110110
del-word-right=<Alt-Key-d>
111111

112+
[IDLE Modern Unix]
113+
copy = <Control-Shift-Key-C> <Control-Key-Insert>
114+
cut = <Control-Key-x> <Shift-Key-Delete>
115+
paste = <Control-Key-v> <Shift-Key-Insert>
116+
beginning-of-line = <Key-Home>
117+
center-insert = <Control-Key-l>
118+
close-all-windows = <Control-Key-q>
119+
close-window = <Control-Key-w> <Control-Shift-Key-W>
120+
do-nothing = <Control-Key-F12>
121+
end-of-file = <Control-Key-d>
122+
history-next = <Alt-Key-n> <Meta-Key-n>
123+
history-previous = <Alt-Key-p> <Meta-Key-p>
124+
interrupt-execution = <Control-Key-c>
125+
view-restart = <Key-F6>
126+
restart-shell = <Control-Key-F6>
127+
open-class-browser = <Control-Key-b>
128+
open-module = <Control-Key-m>
129+
open-new-window = <Control-Key-n>
130+
open-window-from-file = <Control-Key-o>
131+
plain-newline-and-indent = <Control-Key-j>
132+
print-window = <Control-Key-p>
133+
python-context-help = <Shift-Key-F1>
134+
python-docs = <Key-F1>
135+
redo = <Control-Shift-Key-Z>
136+
remove-selection = <Key-Escape>
137+
save-copy-of-window-as-file = <Alt-Shift-Key-S>
138+
save-window-as-file = <Control-Shift-Key-S>
139+
save-window = <Control-Key-s>
140+
select-all = <Control-Key-a>
141+
toggle-auto-coloring = <Control-Key-slash>
142+
undo = <Control-Key-z>
143+
find = <Control-Key-f>
144+
find-again = <Key-F3>
145+
find-in-files = <Control-Shift-Key-f>
146+
find-selection = <Control-Key-h>
147+
replace = <Control-Key-r>
148+
goto-line = <Control-Key-g>
149+
smart-backspace = <Key-BackSpace>
150+
newline-and-indent = <Key-Return> <Key-KP_Enter>
151+
smart-indent = <Key-Tab>
152+
indent-region = <Control-Key-bracketright>
153+
dedent-region = <Control-Key-bracketleft>
154+
comment-region = <Control-Key-d>
155+
uncomment-region = <Control-Shift-Key-D>
156+
tabify-region = <Alt-Key-5>
157+
untabify-region = <Alt-Key-6>
158+
toggle-tabs = <Control-Key-T>
159+
change-indentwidth = <Alt-Key-u>
160+
del-word-left = <Control-Key-BackSpace>
161+
del-word-right = <Control-Key-Delete>
162+
112163
[IDLE Classic Mac]
113164
copy=<Command-Key-c>
114165
cut=<Command-Key-x>

Lib/idlelib/config-main.def

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@ name2=
7070

7171
[Keys]
7272
default= 1
73-
name= IDLE Classic Windows
73+
name=
74+
name2=
75+
# name2 set in user config-main.cfg for keys added after 2016 July 1
7476

7577
[History]
7678
cyclic=1

Lib/idlelib/config.py

Lines changed: 83 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -234,10 +234,7 @@ def GetOption(self, configType, section, option, default=None, type=None,
234234
' from section %r: %r' %
235235
(type, option, section,
236236
self.userCfg[configType].Get(section, option, raw=raw)))
237-
try:
238-
print(warning, file=sys.stderr)
239-
except OSError:
240-
pass
237+
_warn(warning, configType, section, option)
241238
try:
242239
if self.defaultCfg[configType].has_option(section,option):
243240
return self.defaultCfg[configType].Get(
@@ -251,10 +248,7 @@ def GetOption(self, configType, section, option, default=None, type=None,
251248
' from section %r.\n'
252249
' returning default value: %r' %
253250
(option, section, default))
254-
try:
255-
print(warning, file=sys.stderr)
256-
except OSError:
257-
pass
251+
_warn(warning, configType, section, option)
258252
return default
259253

260254
def SetOption(self, configType, section, option, value):
@@ -362,47 +356,68 @@ def GetThemeDict(self, type, themeName):
362356
'\n from theme %r.\n'
363357
' returning default color: %r' %
364358
(element, themeName, theme[element]))
365-
try:
366-
print(warning, file=sys.stderr)
367-
except OSError:
368-
pass
359+
_warn(warning, 'highlight', themeName, element)
369360
theme[element] = cfgParser.Get(
370361
themeName, element, default=theme[element])
371362
return theme
372363

373364
def CurrentTheme(self):
374-
"""Return the name of the currently active text color theme.
365+
"Return the name of the currently active text color theme."
366+
return self.current_colors_and_keys('Theme')
367+
368+
def CurrentKeys(self):
369+
"""Return the name of the currently active key set."""
370+
return self.current_colors_and_keys('Keys')
371+
372+
def current_colors_and_keys(self, section):
373+
"""Return the currently active name for Theme or Keys section.
374+
375+
idlelib.config-main.def ('default') includes these sections
375376
376-
idlelib.config-main.def includes this section
377377
[Theme]
378378
default= 1
379379
name= IDLE Classic
380380
name2=
381-
# name2 set in user config-main.cfg for themes added after 2015 Oct 1
382381
383-
Item name2 is needed because setting name to a new builtin
384-
causes older IDLEs to display multiple error messages or quit.
382+
[Keys]
383+
default= 1
384+
name=
385+
name2=
386+
387+
Item 'name2', is used for built-in ('default') themes and keys
388+
added after 2015 Oct 1 and 2016 July 1. This kludge is needed
389+
because setting 'name' to a builtin not defined in older IDLEs
390+
to display multiple error messages or quit.
385391
See https://bugs.python.org/issue25313.
386-
When default = True, name2 takes precedence over name,
387-
while older IDLEs will just use name.
392+
When default = True, 'name2' takes precedence over 'name',
393+
while older IDLEs will just use name. When default = False,
394+
'name2' may still be set, but it is ignored.
388395
"""
396+
cfgname = 'highlight' if section == 'Theme' else 'keys'
389397
default = self.GetOption('main', 'Theme', 'default',
390398
type='bool', default=True)
399+
name = ''
391400
if default:
392-
theme = self.GetOption('main', 'Theme', 'name2', default='')
393-
if default and not theme or not default:
394-
theme = self.GetOption('main', 'Theme', 'name', default='')
395-
source = self.defaultCfg if default else self.userCfg
396-
if source['highlight'].has_section(theme):
397-
return theme
401+
name = self.GetOption('main', section, 'name2', default='')
402+
if not name:
403+
name = self.GetOption('main', section, 'name', default='')
404+
if name:
405+
source = self.defaultCfg if default else self.userCfg
406+
if source[cfgname].has_section(name):
407+
return name
408+
return "IDLE Classic" if section == 'Theme' else self.default_keys()
409+
410+
@staticmethod
411+
def default_keys():
412+
if sys.platform[:3] == 'win':
413+
return 'IDLE Classic Windows'
414+
elif sys.platform == 'darwin':
415+
return 'IDLE Classic OSX'
398416
else:
399-
return "IDLE Classic"
417+
return 'IDLE Modern Unix'
400418

401-
def CurrentKeys(self):
402-
"Return the name of the currently active key set."
403-
return self.GetOption('main', 'Keys', 'name', default='')
404-
405-
def GetExtensions(self, active_only=True, editor_only=False, shell_only=False):
419+
def GetExtensions(self, active_only=True,
420+
editor_only=False, shell_only=False):
406421
"""Return extensions in default and user config-extensions files.
407422
408423
If active_only True, only return active (enabled) extensions
@@ -422,7 +437,7 @@ def GetExtensions(self, active_only=True, editor_only=False, shell_only=False):
422437
if self.GetOption('extensions', extn, 'enable', default=True,
423438
type='bool'):
424439
#the extension is enabled
425-
if editor_only or shell_only: # TODO if both, contradictory
440+
if editor_only or shell_only: # TODO both True contradict
426441
if editor_only:
427442
option = "enable_editor"
428443
else:
@@ -527,7 +542,8 @@ def GetKeyBinding(self, keySetName, eventStr):
527542
eventStr - virtual event, including brackets, as in '<<event>>'.
528543
"""
529544
eventName = eventStr[2:-2] #trim off the angle brackets
530-
binding = self.GetOption('keys', keySetName, eventName, default='').split()
545+
binding = self.GetOption('keys', keySetName, eventName, default='',
546+
warn_on_default=False).split()
531547
return binding
532548

533549
def GetCurrentKeySet(self):
@@ -638,20 +654,28 @@ def GetCoreKeys(self, keySetName=None):
638654
'<<del-word-right>>': ['<Control-Key-Delete>']
639655
}
640656
if keySetName:
641-
for event in keyBindings:
642-
binding = self.GetKeyBinding(keySetName, event)
643-
if binding:
644-
keyBindings[event] = binding
645-
else: #we are going to return a default, print warning
646-
warning=('\n Warning: config.py - IdleConf.GetCoreKeys'
647-
' -\n problem retrieving key binding for event %r'
648-
'\n from key set %r.\n'
649-
' returning default value: %r' %
650-
(event, keySetName, keyBindings[event]))
651-
try:
652-
print(warning, file=sys.stderr)
653-
except OSError:
654-
pass
657+
if not (self.userCfg['keys'].has_section(keySetName) or
658+
self.defaultCfg['keys'].has_section(keySetName)):
659+
warning = (
660+
'\n Warning: config.py - IdleConf.GetCoreKeys -\n'
661+
' key set %r is not defined, using default bindings.' %
662+
(keySetName,)
663+
)
664+
_warn(warning, 'keys', keySetName)
665+
else:
666+
for event in keyBindings:
667+
binding = self.GetKeyBinding(keySetName, event)
668+
if binding:
669+
keyBindings[event] = binding
670+
else: #we are going to return a default, print warning
671+
warning = (
672+
'\n Warning: config.py - IdleConf.GetCoreKeys -\n'
673+
' problem retrieving key binding for event %r\n'
674+
' from key set %r.\n'
675+
' returning default value: %r' %
676+
(event, keySetName, keyBindings[event])
677+
)
678+
_warn(warning, 'keys', keySetName, event)
655679
return keyBindings
656680

657681
def GetExtraHelpSourceList(self, configSet):
@@ -735,6 +759,18 @@ def SaveUserCfgFiles(self):
735759

736760
idleConf = IdleConf()
737761

762+
763+
_warned = set()
764+
def _warn(msg, *key):
765+
key = (msg,) + key
766+
if key not in _warned:
767+
try:
768+
print(msg, file=sys.stderr)
769+
except OSError:
770+
pass
771+
_warned.add(key)
772+
773+
738774
# TODO Revise test output, write expanded unittest
739775
#
740776
if __name__ == '__main__':

Lib/idlelib/configdialog.py

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ def CreatePageKeys(self):
341341
buttonSaveCustomKeys = Button(
342342
frames[1], text='Save as New Custom Key Set',
343343
command=self.SaveAsNewKeySet)
344+
self.new_custom_keys = Label(frames[0], bd=2)
344345

345346
##widget packing
346347
#body
@@ -361,6 +362,7 @@ def CreatePageKeys(self):
361362
self.radioKeysCustom.grid(row=1, column=0, sticky=W+NS)
362363
self.optMenuKeysBuiltin.grid(row=0, column=1, sticky=NSEW)
363364
self.optMenuKeysCustom.grid(row=1, column=1, sticky=NSEW)
365+
self.new_custom_keys.grid(row=0, column=2, sticky=NSEW, padx=5, pady=5)
364366
self.buttonDeleteCustomKeys.pack(side=LEFT, fill=X, expand=True, padx=2)
365367
buttonSaveCustomKeys.pack(side=LEFT, fill=X, expand=True, padx=2)
366368
frames[0].pack(side=TOP, fill=BOTH, expand=True)
@@ -514,10 +516,11 @@ def VarChanged_colour(self, *params):
514516
self.OnNewColourSet()
515517

516518
def VarChanged_builtinTheme(self, *params):
519+
oldthemes = ('IDLE Classic', 'IDLE New')
517520
value = self.builtinTheme.get()
518-
if value == 'IDLE Dark':
519-
if idleConf.GetOption('main', 'Theme', 'name') != 'IDLE New':
520-
self.AddChangedItem('main', 'Theme', 'name', 'IDLE Classic')
521+
if value not in oldthemes:
522+
if idleConf.GetOption('main', 'Theme', 'name') not in oldthemes:
523+
self.AddChangedItem('main', 'Theme', 'name', oldthemes[0])
521524
self.AddChangedItem('main', 'Theme', 'name2', value)
522525
self.new_custom_theme.config(text='New theme, see Help',
523526
fg='#500000')
@@ -557,8 +560,23 @@ def VarChanged_keyBinding(self, *params):
557560
self.AddChangedItem('extensions', extKeybindSection, event, value)
558561

559562
def VarChanged_builtinKeys(self, *params):
563+
oldkeys = (
564+
'IDLE Classic Windows',
565+
'IDLE Classic Unix',
566+
'IDLE Classic Mac',
567+
'IDLE Classic OSX',
568+
)
560569
value = self.builtinKeys.get()
561-
self.AddChangedItem('main', 'Keys', 'name', value)
570+
if value not in oldkeys:
571+
if idleConf.GetOption('main', 'Keys', 'name') not in oldkeys:
572+
self.AddChangedItem('main', 'Keys', 'name', oldkeys[0])
573+
self.AddChangedItem('main', 'Keys', 'name2', value)
574+
self.new_custom_keys.config(text='New key set, see Help',
575+
fg='#500000')
576+
else:
577+
self.AddChangedItem('main', 'Keys', 'name', value)
578+
self.AddChangedItem('main', 'Keys', 'name2', '')
579+
self.new_custom_keys.config(text='', fg='black')
562580
self.LoadKeysList(value)
563581

564582
def VarChanged_customKeys(self, *params):
@@ -767,8 +785,10 @@ def DeleteCustomKeys(self):
767785
else:
768786
self.optMenuKeysCustom.SetMenu(itemList, itemList[0])
769787
#revert to default key set
770-
self.keysAreBuiltin.set(idleConf.defaultCfg['main'].Get('Keys', 'default'))
771-
self.builtinKeys.set(idleConf.defaultCfg['main'].Get('Keys', 'name'))
788+
self.keysAreBuiltin.set(idleConf.defaultCfg['main']
789+
.Get('Keys', 'default'))
790+
self.builtinKeys.set(idleConf.defaultCfg['main'].Get('Keys', 'name')
791+
or idleConf.default_keys())
772792
#user can't back out of these changes, they must be applied now
773793
self.SaveAllChangedConfigs()
774794
self.ActivateConfigChanges()
@@ -1067,7 +1087,7 @@ def LoadKeyCfg(self):
10671087
self.optMenuKeysCustom.SetMenu(itemList, currentOption)
10681088
itemList = idleConf.GetSectionList('default', 'keys')
10691089
itemList.sort()
1070-
self.optMenuKeysBuiltin.SetMenu(itemList, itemList[0])
1090+
self.optMenuKeysBuiltin.SetMenu(itemList, idleConf.default_keys())
10711091
self.SetKeysType()
10721092
##load keyset element list
10731093
keySetName = idleConf.CurrentKeys()
@@ -1369,12 +1389,18 @@ def save_all_changed_extensions(self):
13691389
[Cancel] only cancels changes made since the last save.
13701390
'''
13711391
help_pages = {
1372-
'Highlighting':'''
1392+
'Highlighting': '''
13731393
Highlighting:
13741394
The IDLE Dark color theme is new in October 2015. It can only
13751395
be used with older IDLE releases if it is saved as a custom
13761396
theme, with a different name.
1377-
'''
1397+
''',
1398+
'Keys': '''
1399+
Keys:
1400+
The IDLE Modern Unix key set is new in June 2016. It can only
1401+
be used with older IDLE releases if it is saved as a custom
1402+
key set, with a different name.
1403+
''',
13781404
}
13791405

13801406

0 commit comments

Comments
 (0)