Most graphical user interface toolkits provide a number of standard
user interface controls (sometimes known as “widgets” or “gadgets”).
Emacs doesn’t really support anything like this, except for an
incredibly powerful text “widget”. On the other hand, Emacs does
provide the necessary primitives to implement many other widgets
within a text buffer. The widget
package simplifies this task.
The basic widgets are:
link
Areas of text with an associated action. Intended for hypertext links embedded in text.
push-button
Like link, but intended for stand-alone buttons.
editable-field
An editable text field. It can be either variable or fixed length.
menu-choice
Allows the user to choose one of multiple options from a menu, where each option is itself a widget. Only the selected option is visible in the buffer.
radio-button-choice
Allows the user to choose one of multiple options by activating radio buttons. The options are implemented as widgets. All options are visible in the buffer, with the selected one marked as chosen.
item
A simple constant widget intended to be used in the menu-choice
and
radio-button-choice
widgets.
choice-item
A button item only intended for use in choices. When invoked, the user will be asked to select another option from the choice widget.
toggle
A simple ‘on’/‘off’ switch.
checkbox
A checkbox (‘[ ]’/‘[X]’).
editable-list
Create an editable list. The user can insert or delete items in the list. Each list item is itself a widget.
Now, of what possible use can support for widgets be in a text editor? I’m glad you asked. The answer is that widgets are useful for implementing forms. A form in Emacs is a buffer where the user is supposed to fill out a number of fields, each of which has a specific meaning. The user is not supposed to change or delete any of the text between the fields. Examples of forms in Emacs are the forms package (of course), the customize buffers, the mail and news compose modes, and the HTML form support in the w3 browser.
The advantages for a programmer of using the widget
package to
implement forms are: