| 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. |