diff options
Diffstat (limited to 'Lib/idlelib/extend.txt')
-rw-r--r-- | Lib/idlelib/extend.txt | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/Lib/idlelib/extend.txt b/Lib/idlelib/extend.txt new file mode 100644 index 0000000..bcc2da9 --- /dev/null +++ b/Lib/idlelib/extend.txt @@ -0,0 +1,106 @@ +Writing an IDLE extension + +An IDLE extension can define new key bindings and menu entries for IDLE +edit windows. There is a simple mechanism to load extensions when IDLE +starts up and to attach them to each edit window. (It is also possible +to make other changes to IDLE, but this must be done by editing the IDLE +source code.) + +The list of extensions loaded at startup time is configured by editing +the file extend.py; see below for details. + +An IDLE extension is defined by a class. Methods of the class define +actions that are invoked by those bindings or menu entries. Class (or +instance) variables define the bindings and menu additions; these are +automatically applied by IDLE when the extension is linked to an edit +window. + +An IDLE extension class is instantiated with a single argument, +`editwin', an EditorWindow instance. The extension cannot assume much +about this argument, but it is guarateed to have the following instance +variables: + + text a Text instance (a widget) + io an IOBinding instance (more about this later) + flist the FileList instance (shared by all edit windows) + +(There are a few more, but they are rarely useful.) + +The extension class must not bind key events. Rather, it must define +one or more virtual events, e.g. <<zoom-height>>, and corresponding +methods, e.g. zoom_height_event(), and have one or more class (or instance) +variables that define mappings between virtual events and key sequences, +e.g. <Alt-F2>. When the extension is loaded, these key sequences will +be bound to the corresponding virtual events, and the virtual events +will be bound to the corresponding methods. (This indirection is done +so that the key bindings can easily be changed, and so that other +sources of virtual events can exist, such as menu entries.) + +The following class or instance variables are used to define key +bindings for virtual events: + + keydefs for all platforms + mac_keydefs for Macintosh + windows_keydefs for Windows + unix_keydefs for Unix (and other platforms) + +Each of these variables, if it exists, must be a dictionary whose +keys are virtual events, and whose values are lists of key sequences. + +An extension can define menu entries in a similar fashion. This is done +with a class or instance variable named menudefs; it should be a list of +pair, where each pair is a menu name (lowercase) and a list of menu +entries. Each menu entry is either None (to insert a separator entry) or +a pair of strings (menu_label, virtual_event). Here, menu_label is the +label of the menu entry, and virtual_event is the virtual event to be +generated when the entry is selected. An underscore in the menu label +is removed; the character following the underscore is displayed +underlined, to indicate the shortcut character (for Windows). + +At the moment, extensions cannot define whole new menus; they must +define entries in existing menus. Some menus are not present on some +windows; such entry definitions are then ignored, but the key bindings +are still applied. (This should probably be refined in the future.) + +Here is a complete example example: + +class ZoomHeight: + + menudefs = [ + ('edit', [ + None, # Separator + ('_Zoom Height', '<<zoom-height>>'), + ]) + ] + + windows_keydefs = { + '<<zoom-height>>': ['<Alt-F2>'], + } + unix_keydefs = { + '<<zoom-height>>': ['<Control-z><Control-z>'], + } + + def __init__(self, editwin): + self.editwin = editwin + + def zoom_height_event(self, event): + "...Do what you want here..." + +The final piece of the puzzle is the file "extend.py", which contains a +simple table used to configure the loading of extensions. This file +currently contains a single list variable named "standard", which is a +list of extension names that are to be loaded. (In the future, other +configuration variables may be added to this module.) + +Extensions can define key bindings and menu entries that reference +events they don't implement (including standard events); however this is +not recommended (and may be forbidden in the future). + +Extensions are not required to define menu entries for all events they +implement. + +Note: in order to change key bindings, you must currently edit the file +keydefs. It contains two dictionaries named and formatted like the +keydefs dictionaries described above, one for the Unix bindings and one +for the Windows bindings. In the future, a better mechanism will be +provided. |