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(), 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(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.
