# HG changeset patch # User Eli Zaretskii # Date 966191284 0 # Node ID 33d2bde9a99afd491079f64de9ece431870c1704 # Parent aa8e1dfb2873a8ebcd54e53b62adbea977ff7474 (Top): Add Index in the menu. (many nodes): Add index entries. (Index): New node. diff -r aa8e1dfb2873 -r 33d2bde9a99a man/widget.texi --- a/man/widget.texi Sun Aug 13 09:09:02 2000 +0000 +++ b/man/widget.texi Sun Aug 13 18:28:04 2000 +0000 @@ -9,6 +9,10 @@ @end iftex @c %**end of header +@syncodeindex fn cp +@syncodeindex vr cp +@syncodeindex ky cp + @dircategory Emacs @direntry * Widget: (widget). Documenting the "widget" package used by the @@ -32,6 +36,7 @@ * Widget Minor Mode:: * Utilities:: * Widget Wishlist:: +* Index:: @end menu @node Introduction, User Interface, Top, Top @@ -41,11 +46,13 @@ Most graphical user interface toolkits, such as Motif and XView, 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 incredible powerful text ``widget''. On the other +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 @code{widget} package simplifies this task. +@cindex basic widgets +@cindex widgets, basic types The basic widgets are: @table @code @@ -68,7 +75,7 @@ A simple constant widget intended to be used in the @code{menu-choice} and @code{radio-button-choice} widgets. @item choice-item -An button item only intended for use in choices. When invoked, the user +A button item only intended for use in choices. When invoked, the user will be asked to select another option from the choice widget. @item toggle A simple @samp{on}/@samp{off} switch. @@ -79,7 +86,7 @@ list. Each list item is itself a widget. @end table -Now of what possible use can support for widgets be in a text editor? +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 @dfn{form} in Emacs is a buffer where the user is supposed to fill out a number of fields, each of which has a specific @@ -88,34 +95,36 @@ package (of course), the customize buffers, the mail and news compose modes, and the @sc{html} form support in the @file{w3} browser. +@cindex widget library, why use it The advantages for a programmer of using the @code{widget} package to implement forms are: @enumerate @item -More complex field than just editable text are supported. +More complex fields than just editable text are supported. @item -You can give the user immediate feedback if he enters invalid data in a +You can give the users immediate feedback if they enter invalid data in a text field, and sometimes prevent entering invalid data. @item -You can have fixed sized fields, thus allowing multiple field to be +You can have fixed sized fields, thus allowing multiple fields to be lined up in columns. @item It is simple to query or set the value of a field. @item -Editing happens in buffer, not in the mini-buffer. +Editing happens in the buffer, not in the mini-buffer. @item Packages using the library get a uniform look, making them easier for the user to learn. @item -As support for embedded graphics improve, the widget library will -extended to support it. This means that your code using the widget -library will also use the new graphic features by automatic. +As support for embedded graphics improve, the widget library will be +extended to use the GUI features. This means that your code using the +widget library will also use the new graphic features automatically. @end enumerate In order to minimize the code that is loaded by users who does not create any widgets, the code has been split in two files: +@cindex widget library, files @table @file @item widget.el This will declare the user variables, define the function @@ -130,10 +139,10 @@ @section User Interface A form consist of read only text for documentation and some fields, -where each the fields contain two parts, as tag and a value. The tags -are used to identify the fields, so the documentation can refer to the -foo field, meaning the field tagged with @samp{Foo}. Here is an example -form: +where each field contains two parts, a tag and a value. The tags are +used to identify the fields, so the documentation can refer to the +@samp{foo field}, meaning the field tagged with @samp{Foo}. Here is an +example form: @example Here is some documentation. @@ -169,9 +178,9 @@ The top level widgets in is example are tagged @samp{Name}, @samp{Choose}, @samp{Address}, @samp{_other work_}, @samp{Numbers}, @samp{Select multiple}, @samp{Select one}, @samp{[Apply Form]}, and -@samp{[Reset Form]}. There are basically two thing the user can do within -a form, namely editing the editable text fields and activating the -buttons. +@samp{[Reset Form]}. There are basically two things the user can do +within a form, namely editing the editable text fields and activating +the buttons. @subsection Editable Text Fields @@ -194,6 +203,8 @@ @subsection Buttons +@cindex widget buttons +@cindex button widgets Some portions of the buffer have an associated @dfn{action}, which can be @dfn{invoked} by a standard key or mouse command. These portions are called @dfn{buttons}. The default commands for activating a button @@ -207,6 +218,7 @@ @code{widget-global-map} (by default the global map). @end deffn +@kindex mouse-2, on button widgets @item mouse-2 @deffn Command widget-button-click @var{event} Invoke the button at the location of the mouse pointer. If the mouse @@ -219,32 +231,34 @@ the example: @table @emph -@item The Option Field Tags. +@cindex option field tag +@item The Option Field Tags When you invoke one of these buttons, you will be asked to choose between a number of different options. This is how you edit an option field. Option fields are created by the @code{menu-choice} widget. In the example, @samp{@b{Choose}} is an option field tag. -@item The @samp{@b{[INS]}} and @samp{@b{[DEL]}} buttons. -Activating these will insert or delete elements from a editable list. +@item The @samp{@b{[INS]}} and @samp{@b{[DEL]}} buttons +Activating these will insert or delete elements from an editable list. The list is created by the @code{editable-list} widget. -@item Embedded Buttons. +@cindex embedded buttons +@item Embedded Buttons The @samp{@b{_other work_}} is an example of an embedded -button. Embedded buttons are not associated with a fields, but can serve +button. Embedded buttons are not associated with a fields, but can serve any purpose, such as implementing hypertext references. They are usually created by the @code{link} widget. -@item The @samp{@b{[ ]}} and @samp{@b{[X]}} buttons. +@item The @samp{@b{[ ]}} and @samp{@b{[X]}} buttons Activating one of these will convert it to the other. This is useful -for implementing multiple-choice fields. You can create it wit -@item The @samp{@b{( )}} and @samp{@b{(*)}} buttons. +for implementing multiple-choice fields. You can create it with the +@code{checkbox} widget. +@item The @samp{@b{( )}} and @samp{@b{(*)}} buttons Only one radio button in a @code{radio-button-choice} widget can be selected at any time. When you invoke one of the unselected radio buttons, it will be selected and the previous selected radio button will become unselected. -@item The @samp{@b{[Apply Form]}} @samp{@b{[Reset Form]}} buttons. -These are explicit buttons made with the @code{push-button} widget. The main -difference from the @code{link} widget is that the buttons are will be +@item The @samp{@b{[Apply Form]}} @samp{@b{[Reset Form]}} buttons +These are explicit buttons made with the @code{push-button} widget. The +main difference from the @code{link} widget is that the buttons will be displayed as GUI buttons when possible. -enough. @end table To make them easier to locate, buttons are emphasized in the buffer. @@ -254,7 +268,8 @@ @end deffn @defopt widget-mouse-face -Face used for buttons when the mouse pointer is above it. +Face used for highlighting a button when the mouse pointer moves across +it. @end defopt @subsection Navigation @@ -277,6 +292,8 @@ @comment node-name, next, previous, up @section Programming Example +@cindex widgets, programming example +@cindex example of using widgets Here is the code to implement the user interface example (@pxref{User Interface}). @@ -389,7 +406,7 @@ @end defun @defun widget-setup -Setup a buffer to support widgets. +Set up a buffer to support widgets. This should be called after creating all the widgets and before allowing the user to edit them. @@ -401,17 +418,19 @@ @defun widget-insert Insert the arguments, either strings or characters, at point. -The inserted text will be read only. +The inserted text will be read-only. @end defun There is a standard widget keymap which you might find useful. +@findex widget-button-press +@findex widget-button-click @defvr Const widget-keymap A keymap with the global keymap as its parent.@* @key{TAB} and @kbd{C-@key{TAB}} are bound to @code{widget-forward} and @code{widget-backward}, respectively. @kbd{@key{RET}} and @kbd{mouse-2} are bound to @code{widget-button-press} and -@code{widget-button-}.@refill +@code{widget-button-click}.@refill @end defvr @defvar widget-global-map @@ -434,12 +453,15 @@ property, @var{argument} is the value of the property, and @var{args} are interpreted in a widget specific way. -There following keyword arguments that apply to all widgets: +@cindex keyword arguments +The following keyword arguments that apply to all widgets: @table @code +@vindex value@r{ keyword} @item :value The initial value for widgets of this type. +@vindex format@r{ keyword} @item :format This string will be inserted in the buffer when you create a widget. The following @samp{%} escapes are available: @@ -489,12 +511,14 @@ Insert a literal @samp{%}. @end table +@vindex button-face@r{ keyword} @item :button-face Face used to highlight text inside %[ %] in the format. +@vindex button-prefix@r{ keyword} +@vindex button-suffix@r{ keyword} @item :button-prefix @itemx :button-suffix - Text around %[ %] in the format. These can be @@ -509,34 +533,42 @@ The value of the symbol is expanded according to this table. @end table +@vindex doc@r{ keyword} @item :doc The string inserted by the @samp{%d} escape in the format string. +@vindex tag@r{ keyword} @item :tag The string inserted by the @samp{%t} escape in the format string. +@vindex tag-glyph@r{ keyword} @item :tag-glyph -Name of image to use instead of the string specified by `:tag' on +Name of image to use instead of the string specified by @code{:tag} on Emacsen that supports it. +@vindex help-echo@r{ keyword} @item :help-echo Message displayed whenever you move to the widget with either @code{widget-forward} or @code{widget-backward}. +@vindex indent@r{ keyword} @item :indent An integer indicating the absolute number of spaces to indent children of this widget. +@vindex offset@r{ keyword} @item :offset An integer indicating how many extra spaces to add to the widget's grandchildren compared to this widget. +@vindex extra-offset@r{ keyword} @item :extra-offset An integer indicating how many extra spaces to add to the widget's children compared to this widget. +@vindex notify@r{ keyword} @item :notify A function called each time the widget or a nested widget is changed. The function is called with two or three arguments. The first argument @@ -544,25 +576,29 @@ changed, and the third argument is the event leading to the change, if any. +@vindex menu-tag@r{ keyword} @item :menu-tag Tag used in the menu when the widget is used as an option in a @code{menu-choice} widget. +@vindex menu-tag-get@r{ keyword} @item :menu-tag-get Function used for finding the tag when the widget is used as an option in a @code{menu-choice} widget. By default, the tag used will be either the @code{:menu-tag} or @code{:tag} property if present, or the @code{princ} representation of the @code{:value} property if not. +@vindex match@r{ keyword} @item :match Should be a function called with two arguments, the widget and a value, and returning non-nil if the widget can represent the specified value. +@vindex validate@r{ keyword} @item :validate -A function which takes a widget as an argument, and return nil if the -widget's current value is valid for the widget. Otherwise it should -return the widget containing the invalid data, and set that widget's -@code{:error} property to a string explaining the error. +A function which takes a widget as an argument, and returns @code{nil} +if the widget's current value is valid for the widget. Otherwise it +should return the widget containing the invalid data, and set that +widget's @code{:error} property to a string explaining the error. The following predefined function can be used: @@ -570,6 +606,7 @@ All the @code{:children} of @var{widget} must be valid. @end defun +@vindex tab-order@r{ keyword} @item :tab-order Specify the order in which widgets are traversed with @code{widget-forward} or @code{widget-backward}. This is only partially @@ -589,10 +626,12 @@ in the buffer with a positive tabbing order, or @code{nil} @end enumerate +@vindex parent@r{ keyword} @item :parent The parent of a nested widget (e.g. a @code{menu-choice} item or an element of a @code{editable-list} widget). +@vindex sibling-args@r{ keyword} @item :sibling-args This keyword is only used for members of a @code{radio-button-choice} or @code{checklist}. The value should be a list of extra keyword @@ -604,7 +643,7 @@ @deffn {User Option} widget-glyph-directory Directory where glyphs are found. Widget will look here for a file with the same name as specified for the -image, with either a @samp{.xpm} (if supported) or @samp{.xbm} extension. +image, with either a @file{.xpm} (if supported) or @file{.xbm} extension. @end deffn @deffn{User Option} widget-glyph-enable @@ -633,6 +672,7 @@ @node link, url-link, Basic Types, Basic Types @comment node-name, next, previous, up @subsection The @code{link} Widget +@findex link@r{ widget} Syntax: @@ -657,6 +697,7 @@ @node url-link, info-link, link, Basic Types @comment node-name, next, previous, up @subsection The @code{url-link} Widget +@findex url-link@r{ widget} Syntax: @@ -664,12 +705,14 @@ TYPE ::= (url-link [KEYWORD ARGUMENT]... URL) @end example +@findex browse-url-browser-function@r{, and @code{url-link} widget} When this link is invoked, the @sc{www} browser specified by @code{browse-url-browser-function} will be called with @var{url}. @node info-link, push-button, url-link, Basic Types @comment node-name, next, previous, up @subsection The @code{info-link} Widget +@findex info-link@r{ widget} Syntax: @@ -677,12 +720,13 @@ TYPE ::= (info-link [KEYWORD ARGUMENT]... ADDRESS) @end example -When this link is invoked, the built-in info browser is started on +When this link is invoked, the built-in Info reader is started on @var{address}. @node push-button, editable-field, info-link, Basic Types @comment node-name, next, previous, up @subsection The @code{push-button} Widget +@findex push-button@r{ widget} Syntax: @@ -691,7 +735,7 @@ @end example The @var{value}, if present, is used to initialize the @code{:value} -property. The value should be a string, which will be inserted in the +property. The value should be a string, which will be inserted in the buffer. By default the tag will be shown in brackets. @@ -707,6 +751,7 @@ @node editable-field, text, push-button, Basic Types @comment node-name, next, previous, up @subsection The @code{editable-field} Widget +@findex editable-field@r{ widget} Syntax: @@ -718,45 +763,55 @@ property. The value should be a string, which will be inserted in field. This widget will match all string values. -The following extra properties are recognized. +The following extra properties are recognized: @table @code +@vindex size@r{ keyword} @item :size The width of the editable field.@* By default the field will reach to the end of the line. +@vindex value-face@r{ keyword} @item :value-face Face used for highlighting the editable field. Default is -@code{widget-field-face}. +@code{widget-field-face}, see @ref{User Interface}. +@vindex secret@r{ keyword} @item :secret Character used to display the value. You can set this to e.g. @code{?*} if the field contains a password or other secret information. By -default, the value is not secret. +default, this is nil, and the value is not secret. +@vindex valid-regexp@r{ keyword} @item :valid-regexp By default the @code{:validate} function will match the content of the field with the value of this attribute. The default value is @code{""} which matches everything. +@vindex keymap@r{ keyword} +@vindex widget-field-keymap @item :keymap Keymap used in the editable field. The default value is @code{widget-field-keymap}, which allows you to use all the normal -editing commands, even if the buffers major mode suppress some of them. -Pressing return invokes the function specified by @code{:action}. +editing commands, even if the buffer's major mode suppresses some of +them. Pressing @key{RET} invokes the function specified by +@code{:action}. @end table @node text, menu-choice, editable-field, Basic Types @comment node-name, next, previous, up @subsection The @code{text} Widget +@findex text@r{ widget} +@vindex widget-text-keymap This is just like @code{editable-field}, but intended for multiline text fields. The default @code{:keymap} is @code{widget-text-keymap}, which -does not rebind the return key. +does not rebind the @key{RET} key. @node menu-choice, radio-button-choice, text, Basic Types @comment node-name, next, previous, up @subsection The @code{menu-choice} Widget +@findex menu-choice@r{ widget} Syntax: @@ -770,21 +825,26 @@ arguments. @table @code +@vindex void@r{ keyword} @item :void Widget type used as a fallback when the value does not match any of the specified @var{type} arguments. +@vindex case-fold@r{ keyword} @item :case-fold Set this to nil if you don't want to ignore case when prompting for a choice through the minibuffer. +@vindex children@r{ keyword} @item :children -A list whose car is the widget representing the currently chosen type in -the buffer. +A list whose @code{car} is the widget representing the currently chosen +type in the buffer. +@vindex choice@r{ keyword} @item :choice -The current chosen type +The current chosen type. +@vindex args@r{ keyword} @item :args The list of types. @end table @@ -792,6 +852,7 @@ @node radio-button-choice, item, menu-choice, Basic Types @comment node-name, next, previous, up @subsection The @code{radio-button-choice} Widget +@findex radio-button-choice@r{ widget} Syntax: @@ -807,31 +868,37 @@ The following extra properties are recognized. @table @code +@vindex entry-format@r{ keyword} @item :entry-format This string will be inserted for each entry in the list. The following @samp{%} escapes are available: @table @samp @item %v -Replaced with the buffer representation of the @var{type} widget. +Replace with the buffer representation of the @var{type} widget. @item %b Replace with the radio button. @item %% Insert a literal @samp{%}. @end table -@item button-args +@vindex button-args@r{ keyword} +@item :button-args A list of keywords to pass to the radio buttons. Useful for setting e.g. the @samp{:help-echo} for each button. +@vindex buttons@r{ keyword} @item :buttons The widgets representing the radio buttons. +@vindex children@r{ keyword} @item :children The widgets representing each type. +@vindex choice@r{ keyword} @item :choice The current chosen type +@vindex args@r{ keyword} @item :args The list of types. @end table @@ -841,8 +908,8 @@ @code{widget-radio-add-item}. @defun widget-radio-add-item widget type -Add to @code{radio-button-choice} widget @var{widget} a new radio button item of type -@var{type}. +Add to @code{radio-button-choice} widget @var{widget} a new radio button +item of type @var{type}. @end defun Please note that such items added after the @code{radio-button-choice} @@ -852,6 +919,7 @@ @node item, choice-item, radio-button-choice, Basic Types @comment node-name, next, previous, up @subsection The @code{item} Widget +@findex item@r{ widget} Syntax: @@ -866,6 +934,7 @@ @node choice-item, toggle, item, Basic Types @comment node-name, next, previous, up @subsection The @code{choice-item} Widget +@findex choice-item@r{ widget} Syntax: @@ -882,6 +951,7 @@ @node toggle, checkbox, choice-item, Basic Types @comment node-name, next, previous, up @subsection The @code{toggle} Widget +@findex toggle@r{ widget} Syntax: @@ -889,30 +959,35 @@ TYPE ::= (toggle [KEYWORD ARGUMENT]...) @end example -The widget has two possible states, `on' and `off', which correspond to -a @code{t} or @code{nil} value respectively. +The widget has two possible states, @samp{on} and @samp{off}, which +correspond to a @code{t} or @code{nil} value, respectively. -The following extra properties are recognized. +The following extra properties are recognized: @table @code @item :on -String representing the `on' state. By default the string @samp{on}. +A string representing the @samp{on} state. By default the string +@samp{on}. @item :off -String representing the `off' state. By default the string @samp{off}. +A string representing the @samp{off} state. By default the string +@samp{off}. +@vindex on-glyph@r{ keyword} @item :on-glyph -Name of a glyph to be used instead of the `:on' text string, on emacsen -that supports it. +Name of a glyph to be used instead of the @samp{:on} text string, on +emacsen that supports this. +@vindex off-glyph@r{ keyword} @item :off-glyph -Name of a glyph to be used instead of the `:off' text string, on emacsen -that supports it. +Name of a glyph to be used instead of the @samp{:off} text string, on +emacsen that supports this. @end table @node checkbox, checklist, toggle, Basic Types @comment node-name, next, previous, up @subsection The @code{checkbox} Widget +@findex checkbox@r{ widget} -The widget has two possible states, `selected' and `unselected', which -corresponds to a @code{t} or @code{nil} value. +This widget has two possible states, @samp{selected} and +@samp{unselected}, which corresponds to a @code{t} or @code{nil} value. Syntax: @@ -923,6 +998,7 @@ @node checklist, editable-list, checkbox, Basic Types @comment node-name, next, previous, up @subsection The @code{checklist} Widget +@findex checklist@r{ widget} Syntax: @@ -930,14 +1006,15 @@ TYPE ::= (checklist [KEYWORD ARGUMENT]... TYPE ... ) @end example -The @var{type} arguments represents each checklist item. The widget's -value will be a list containing the values of all ticked @var{type} +The @var{type} arguments represent each checklist item. The widget's +value will be a list containing the values of all checked @var{type} arguments. The checklist widget will match a list whose elements all match at least one of the specified @var{type} arguments. -The following extra properties are recognized. +The following extra properties are recognized: @table @code +@vindex entry-format@r{ keyword} @item :entry-format This string will be inserted for each entry in the list. The following @samp{%} escapes are available: @@ -950,6 +1027,7 @@ Insert a literal @samp{%}. @end table +@vindex greedy@r{ keyword} @item :greedy Usually a checklist will only match if the items are in the exact sequence given in the specification. By setting @code{:greedy} to @@ -957,16 +1035,20 @@ you extract the value they will be in the sequence given in the checklist. I.e. the original sequence is forgotten. +@vindex button-args@r{ keyword} @item button-args A list of keywords to pass to the checkboxes. Useful for setting e.g. the @samp{:help-echo} for each checkbox. +@vindex buttons@r{ keyword} @item :buttons The widgets representing the checkboxes. +@vindex children@r{ keyword} @item :children The widgets representing each type. +@vindex args@r{ keyword} @item :args The list of types. @end table @@ -974,6 +1056,7 @@ @node editable-list, group, checklist, Basic Types @comment node-name, next, previous, up @subsection The @code{editable-list} Widget +@findex editable-list@r{ widget} Syntax: @@ -984,9 +1067,10 @@ The value is a list, where each member represents one widget of type @var{type}. -The following extra properties are recognized. +The following extra properties are recognized: @table @code +@vindex entry-format@r{ keyword} @item :entry-format This string will be inserted for each entry in the list. The following @samp{%} escapes are available: @@ -1002,32 +1086,37 @@ Insert a literal @samp{%}. @end table +@vindex insert-button-args@r{ keyword} @item :insert-button-args A list of keyword arguments to pass to the insert buttons. +@vindex delete-button-args@r{ keyword} @item :delete-button-args A list of keyword arguments to pass to the delete buttons. +@vindex append-button-args@r{ keyword} @item :append-button-args A list of keyword arguments to pass to the trailing insert button. - +@vindex buttons@r{ keyword} @item :buttons The widgets representing the insert and delete buttons. +@vindex children@r{ keyword} @item :children The widgets representing the elements of the list. +@vindex args@r{ keyword} @item :args -List whose car is the type of the list elements. - +List whose @code{car} is the type of the list elements. @end table @node group, , editable-list, Basic Types @comment node-name, next, previous, up @subsection The @code{group} Widget +@findex group@r{ widget} -This widget simply group other widget together. +This widget simply group other widgets together. Syntax: @@ -1040,9 +1129,11 @@ @node Sexp Types, Widget Properties, Basic Types, Top @comment @section Sexp Types +@cindex sexp types -A number of widgets for editing s-expressions (lisp types) are also -available. These basically fall in the following categories. +A number of widgets for editing @dfn{s-expressions} (lisp types), sexp +for short, are also available. These basically fall in several +categories described in this section. @menu * constants:: @@ -1053,13 +1144,14 @@ @node constants, generic, Sexp Types, Sexp Types @comment node-name, next, previous, up -@subsection The Constant Widgets. +@subsection The Constant Widgets +@cindex constant widgets The @code{const} widget can contain any lisp expression, but the user is -prohibited from editing edit it, which is mainly useful as a component -of one of the composite widgets. +prohibited from editing it, which is mainly useful as a component of one +of the composite widgets. -The syntax for the @code{const} widget is +The syntax for the @code{const} widget is: @example TYPE ::= (const [KEYWORD ARGUMENT]... [ VALUE ]) @@ -1089,12 +1181,13 @@ @node generic, atoms, constants, Sexp Types @comment node-name, next, previous, up -@subsection Generic Sexp Widget. +@subsection Generic Sexp Widget +@cindex generic sexp widget The @code{sexp} widget can contain any lisp expression, and allows the user to edit it inline in the buffer. -The syntax for the @code{sexp} widget is +The syntax for the @code{sexp} widget is: @example TYPE ::= (sexp [KEYWORD ARGUMENT]... [ VALUE ]) @@ -1105,18 +1198,20 @@ field. The @code{sexp} widget takes the same keyword arguments as the -@code{editable-field} widget. +@code{editable-field} widget. @xref{editable-field}. @end deffn @node atoms, composite, generic, Sexp Types @comment node-name, next, previous, up -@subsection Atomic Sexp Widgets. +@subsection Atomic Sexp Widgets +@cindex atomic sexp widget -The atoms are s-expressions that does not consist of other -s-expressions. A string is an atom, while a list is a composite type. -You can edit the value of an atom with the following widgets. +The atoms are s-expressions that do not consist of other s-expressions. +For example, a string, a file name, or a symbol are atoms, while a list +is a composite type. You can edit the value of an atom with the +following widgets. -The syntax for all the atoms are +The syntax for all the atoms are: @example TYPE ::= (NAME [KEYWORD ARGUMENT]... [ VALUE ]) @@ -1124,10 +1219,10 @@ The @var{value}, if present, is used to initialize the @code{:value} property and must be an expression of the same type as the widget. -I.e. the string widget can only be initialized with a string. +That is, the string widget can only be initialized with a string. All the atom widgets take the same keyword arguments as the -@code{editable-field} widget. +@code{editable-field} widget. @xref{editable-field}. @deffn Widget string Allows you to edit a string in an editable field. @@ -1148,6 +1243,7 @@ Keywords: @table @code +@vindex must-match@r{ keyword} @item :must-match If this is set to non-nil, only existing file names will be allowed in the minibuffer. @@ -1187,21 +1283,23 @@ @node composite, , atoms, Sexp Types @comment node-name, next, previous, up -@subsection Composite Sexp Widgets. +@subsection Composite Sexp Widgets +@cindex composite sexp widgets -The syntax for the composite are +The syntax for the composite widget is: @example TYPE ::= (NAME [KEYWORD ARGUMENT]... COMPONENT...) @end example -Where each @var{component} must be a widget type. Each component widget -will be displayed in the buffer, and be editable to the user. +@noindent +where each @var{component} must be a widget type. Each component widget +will be displayed in the buffer, and will be editable by the user. @deffn Widget cons -The value of a @code{cons} widget is a cons-cell where the car is the -value of the first component and the cdr is the value of the second -component. There must be exactly two components. +The value of a @code{cons} widget is a cons-cell where the @code{car} is +the value of the first component and the @code{cdr} is the value of the +second component. There must be exactly two components. @end deffn @deffn Widget list @@ -1216,7 +1314,7 @@ The above suffice for specifying fixed size lists and vectors. To get variable length lists and vectors, you can use a @code{choice}, -@code{set} or @code{repeat} widgets together with the @code{:inline} +@code{set}, or @code{repeat} widgets together with the @code{:inline} keywords. If any component of a composite widget has the @code{:inline} keyword set, its value must be a list which will then be spliced into the composite. For example, to specify a list whose first element must @@ -1233,10 +1331,10 @@ @end example The value of a widget of this type will either have the form -@samp{(file t)} or @code{(file string string)}. +@code{(file t)} or @code{(file string string)}. This concept of inline is probably hard to understand. It was certainly -hard to implement so instead of confusing you more by trying to explain +hard to implement, so instead of confusing you more by trying to explain it here, I'll just suggest you meditate over it for a while. @deffn Widget choice @@ -1247,20 +1345,22 @@ @deffn Widget set Allows you to specify a type which must be a list whose elements all -belong to given set. The elements of the list is not significant. This -is implemented on top of the @code{checklist} basic widget, and has a -similar syntax. +belong to given set. The elements of the list are not significant. +This is implemented on top of the @code{checklist} basic widget, and has +a similar syntax. @end deffn @deffn Widget repeat Allows you to specify a variable length list whose members are all of -the same type. Implemented on top of the `editable-list' basic widget, -and has a similar syntax. +the same type. Implemented on top of the @code{editable-list} basic +widget, and has a similar syntax. @end deffn @node Widget Properties, Defining New Widgets, Sexp Types, Top @comment node-name, next, previous, up @section Properties +@cindex properties of widgets +@cindex widget properties You can examine or set the value of a widget by using the widget object that was returned by @code{widget-create}. @@ -1309,6 +1409,10 @@ Return the name of @var{widget}, a symbol. @end defun +@cindex active widget +@cindex inactive widget +@cindex activate a widget +@cindex deactivate a widget Widgets can be in two states: active, which means they are modifiable by the user, or inactive, which means they cannot be modified by the user. You can query or set the state with the following code: @@ -1349,8 +1453,10 @@ @node Defining New Widgets, Widget Browser, Widget Properties, Top @comment node-name, next, previous, up @section Defining New Widgets +@cindex new widgets +@cindex defining new widgets -You can define specialized widgets with @code{define-widget}. It allows +You can define specialized widgets with @code{widget-define}. It allows you to create a shorthand for more complex widgets, including specifying component widgets and new default values for the keyword arguments. @@ -1384,12 +1490,13 @@ in the @code{widget-type} property of @var{name}, which is what @code{widget-create} uses. -If you just want to specify defaults for keywords with no complex +If you only want to specify defaults for keywords with no complex conversions, you can use @code{identity} as your conversion function. The following additional keyword arguments are useful when defining new widgets: @table @code +@vindex convert-widget@r{ keyword} @item :convert-widget Function to convert a widget type before creating a widget of that type. It takes a widget type as an argument, and returns the converted @@ -1406,6 +1513,7 @@ Initialize @code{:value} from @code{:args} in @var{widget}. @end defun +@vindex value-to-internal@r{ keyword} @item :value-to-internal Function to convert the value to the internal format. The function takes two arguments, a widget and an external value, and returns the @@ -1413,27 +1521,32 @@ when the widget is created, and on any value set later with @code{widget-value-set}. +@vindex value-to-external@r{ keyword} @item :value-to-external Function to convert the value to the external format. The function takes two arguments, a widget and an internal value, and returns the -internal value. The function is called on the present @code{:value} +external value. The function is called on the present @code{:value} when the widget is created, and on any value set later with @code{widget-value-set}. +@vindex create@r{ keyword} @item :create Function to create a widget from scratch. The function takes one argument, a widget type, and creates a widget of that type, inserts it in the buffer, and returns a widget object. +@vindex delete@r{ keyword} @item :delete Function to delete a widget. The function takes one argument, a widget, and should remove all traces of the widget from the buffer. +@vindex value-create@r{ keyword} @item :value-create Function to expand the @samp{%v} escape in the format string. It will be called with the widget as its argument and should insert a representation of the widget's value in the buffer. +@vindex value-delete@r{ keyword} @item :value-delete Should remove the representation of the widget's value from the buffer. It will be called with the widget as its argument. It doesn't have to @@ -1446,6 +1559,7 @@ Delete all @code{:children} and @code{:buttons} in @var{widget}. @end defun +@vindex value-get@r{ keyword} @item :value-get Function to extract the value of a widget, as it is displayed in the buffer. @@ -1456,15 +1570,19 @@ Return the @code{:value} property of @var{widget}. @end defun +@vindex format-handler@r{ keyword} @item :format-handler Function to handle unknown @samp{%} escapes in the format string. It -will be called with the widget and the escape character as arguments. -You can set this to allow your widget to handle non-standard escapes. +will be called with the widget and the character that follows the +@samp{%} as arguments. You can set this to allow your widget to handle +non-standard escapes. +@findex widget-default-format-handler You should end up calling @code{widget-default-format-handler} to handle unknown escape sequences, which will handle the @samp{%h} and any future escape sequences, as well as give an error for unknown escapes. +@vindex action@r{ keyword} @item :action Function to handle user initiated events. By default, @code{:notify} the parent. @@ -1476,6 +1594,7 @@ Optional @var{event} is the event that triggered the action. @end defun +@vindex prompt-value@r{ keyword} @item :prompt-value Function to prompt for a value in the minibuffer. The function should take four arguments, @var{widget}, @var{prompt}, @var{value}, and @@ -1499,11 +1618,12 @@ @node Widget Browser, Widget Minor Mode, Defining New Widgets, Top @comment node-name, next, previous, up @section Widget Browser +@cindex widget browser There is a separate package to browse widgets. This is intended to help programmers who want to examine the content of a widget. The browser shows the value of each keyword, but uses links for certain keywords -such as `:parent', which avoids printing cyclic structures. +such as @samp{:parent}, which avoids printing cyclic structures. @deffn Command widget-browse WIDGET Create a widget browser for WIDGET. @@ -1523,9 +1643,10 @@ @node Widget Minor Mode, Utilities, Widget Browser, Top @comment node-name, next, previous, up @section Widget Minor Mode +@cindex widget minor mode There is a minor mode for manipulating widgets in major modes that -doesn't provide any support for widgets themselves. This is mostly +don't provide any support for widgets themselves. This is mostly intended to be useful for programmers doing experiments. @deffn Command widget-minor-mode @@ -1540,6 +1661,7 @@ @node Utilities, Widget Wishlist, Widget Minor Mode, Top @comment node-name, next, previous, up @section Utilities. +@cindex utility functions for widgets @defun widget-prompt-value widget prompt [ value unbound ] Prompt for a value matching @var{widget}, using @var{prompt}. @@ -1548,13 +1670,14 @@ @end defun @defun widget-get-sibling widget -Get the item @var{widget} is assumed to toggle. +Get the item which @var{widget} is assumed to toggle. This is only meaningful for radio buttons or checkboxes in a list. @end defun -@node Widget Wishlist, , Utilities, Top +@node Widget Wishlist, Index, Utilities, Top @comment node-name, next, previous, up @section Wishlist +@cindex todo @itemize @bullet @item @@ -1563,7 +1686,7 @@ @item The @samp{[INS]} and @samp{[DEL]} buttons should be replaced by a single -dash (@samp{-}). The dash should be a button that, when invoked, ask +dash (@samp{-}). The dash should be a button that, when invoked, asks whether you want to add or delete an item (@sc{rms} wanted to git rid of the ugly buttons, the dash is my idea). @@ -1607,9 +1730,16 @@ @kbd{C-h} in @code{widget-prompt-value} should give type specific help. @item -A mailto widget. +Add a @code{mailto} widget. +@end itemize -@end itemize +@node Index, , Widget Wishlist, Top +@comment node-name, next, previous, up +@unnumbered Index + +This is an alphabetical listing of all concepts, functions, commands, +variables, and widgets described in this manual. +@printindex cp @setchapternewpage odd @contents