@@ -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
736760idleConf = 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#
740776if __name__ == '__main__' :
0 commit comments