(main): When relative file names are given as argument,
[bpt/emacs.git] / lispref / customize.texi
index 61891fb..c2e3146 100644 (file)
@@ -1,6 +1,6 @@
 @c -*-texinfo-*-
 @c This is part of the GNU Emacs Lisp Reference Manual.
-@c Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. 
+@c Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
 @c See the file elisp.texi for copying conditions.
 @setfilename ../info/customize
 @node Customization, Loading, Macros, Top
@@ -13,8 +13,8 @@ definitions---as well as face definitions (@pxref{Defining Faces}).
 
 @menu
 * Common Keywords::
-* Group Definitions::            
-* Variable Definitions::         
+* Group Definitions::
+* Variable Definitions::
 * Customization Types::
 @end menu
 
@@ -62,7 +62,7 @@ Like @code{custom-manual} except that the link appears
 in the customization buffer with the Info node name.
 
 @item (url-link @var{url})
-Link to a web page; @var{url} is a string which specifies the @sc{url}.
+Link to a web page; @var{url} is a string which specifies the @acronym{URL}.
 The link appears in the customization buffer as @var{url}.
 
 @item (emacs-commentary-link @var{library})
@@ -194,6 +194,11 @@ than one occasion.  You should normally avoid using backquotes in
 @var{default} because they are not expanded when editing the value,
 causing list values to appear to have the wrong structure.
 
+If you specify the @code{:set} option, to make the variable take other
+special actions when set through the customization buffer, the
+variable's documentation string should tell the user specifically how
+to do the same job in hand-written Lisp code.
+
 When you evaluate a @code{defcustom} form with @kbd{C-M-x} in Emacs Lisp
 mode (@code{eval-defun}), a special feature of @code{eval-defun}
 arranges to set the variable unconditionally, without testing whether
@@ -242,9 +247,15 @@ as a Lisp variable).  The default for @var{setfunction} is
 @item :get @var{getfunction}
 Specify @var{getfunction} as the way to extract the value of this
 option.  The function @var{getfunction} should take one argument, a
-symbol, and should return the ``current value'' for that symbol (which
-need not be the symbol's Lisp value).  The default is
-@code{default-value}.
+symbol, and should return whatever customize should use as the
+``current value'' for that symbol (which need not be the symbol's Lisp
+value).  The default is @code{default-value}.
+
+You have to really understand the workings of Custom to use
+@code{:get} correctly.  It is meant for values that are treated in
+Custom as variables but are not actually stored in Lisp variables.  It
+is almost surely a mistake to specify @code{getfunction} for a value
+that really is stored in a Lisp variable.
 
 @item :initialize @var{function}
 @var{function} should be a function used to initialize the variable when
@@ -255,8 +266,7 @@ this way:
 @table @code
 @item custom-initialize-set
 Use the variable's @code{:set} function to initialize the variable, but
-do not reinitialize it if it is already non-void.  This is the default
-@code{:initialize} function.
+do not reinitialize it if it is already non-void.
 
 @item custom-initialize-default
 Like @code{custom-initialize-set}, but use the function
@@ -267,9 +277,10 @@ defining the variable will not call the minor mode function, but
 customizing the variable will do so.
 
 @item custom-initialize-reset
-Always use the @code{:set} function to initialize the variable.  If the
-variable is already non-void, reset it by calling the @code{:set}
+Always use the @code{:set} function to initialize the variable.  If
+the variable is already non-void, reset it by calling the @code{:set}
 function using the current value (returned by the @code{:get} method).
+This is the default @code{:initialize} function.
 
 @item custom-initialize-changed
 Use the @code{:set} function to initialize the variable, if it is
@@ -338,9 +349,10 @@ which values are legitimate and (2) how to display the value in the
 customization buffer for editing.
 
   You specify the customization type in @code{defcustom} with the
-@code{:type} keyword.  The argument of @code{:type} is evaluated; since
-types that vary at run time are rarely useful, normally you use a quoted
-constant.  For example:
+@code{:type} keyword.  The argument of @code{:type} is evaluated, but
+only once when the @code{defcustom} is executed, so it isn't useful
+for the value to vary.  Normally we use a quoted constant.  For
+example:
 
 @example
 (defcustom diff-command "diff"
@@ -366,10 +378,11 @@ equivalent to @code{(string)}.
 * Composite Types::
 * Splicing into Lists::
 * Type Keywords::
+* Defining New Types::
 @end menu
 
 All customization types are implemented as widgets; see @ref{Top, ,
-Introduction, widget, The Emacs Widget Library} for details.
+Introduction, widget, The Emacs Widget Library}, for details.
 
 @node Simple Types
 @subsection Simple Types
@@ -387,8 +400,12 @@ The value must be an integer, and is represented textually
 in the customization buffer.
 
 @item number
-The value must be a number, and is represented textually in the
-customization buffer.
+The value must be a number (floating point or integer), and is
+represented textually in the customization buffer.
+
+@item float
+The value must be a floating point number, and is represented
+textually in the customization buffer.
 
 @item string
 The value must be a string, and the customization buffer shows just the
@@ -491,7 +508,7 @@ example,
 @end smallexample
 
 @noindent
-instead of 
+instead of
 
 @smallexample
 (defcustom cons-alist '(("foo" . 1) ("bar" . 2) ("baz" . 3))
@@ -516,14 +533,14 @@ Similarily, you can have alists with more values associated with each
 key, using variations of this trick:
 
 @smallexample
-(defcustom person-data '(("brian"  50 t) 
+(defcustom person-data '(("brian"  50 t)
                          ("dorith" 55 nil)
                          ("ken"    52 t))
   "Alist of basic info about people.
 Each element has the form (NAME AGE MALE-FLAG)."
   :type '(alist :value-type (group age boolean)))
 
-(defcustom pets '(("brian") 
+(defcustom pets '(("brian")
                   ("dorith" "dog" "guppy")
                   ("ken" "cat"))
   "Alist of people's pets.
@@ -573,7 +590,7 @@ The value must be a coding-system name, and you can do completion with
 
 @item color
 The value must be a valid color name, and you can do completion with
-@kbd{M-@key{TAB}}.  A sample is provided,
+@kbd{M-@key{TAB}}.  A sample is provided.
 @end table
 
 @node Composite Types
@@ -654,6 +671,19 @@ In any alternative for which @code{nil} is not a valid value, other than
 a @code{const}, you should specify a valid default for that alternative
 using the @code{:value} keyword.  @xref{Type Keywords}.
 
+If some values are covered by more than one of the alternatives,
+customize will choose the first alternative that the value fits.  This
+means you should always list the most specific types first, and the
+most general last.  Here's an example of proper usage:
+
+@example
+(choice (const :tag "Off" nil) symbol (sexp :tag "Other"))
+@end example
+
+@noindent
+This way, the special value @code{nil} is not treated like other
+symbols, and symbols are not treated like other Lisp expressions.
+
 @item (radio @var{element-types}@dots{})
 This is similar to @code{choice}, except that the choices are displayed
 using `radio buttons' rather than a menu.  This has the advantage of
@@ -906,7 +936,7 @@ Substitute the tag here.  You specify the tag with the @code{:tag}
 keyword.
 
 @item %%
-Display a literal @samp{%}. 
+Display a literal @samp{%}.
 @end table
 
 @item :action @var{action}
@@ -951,7 +981,8 @@ When you move to this item with @code{widget-forward} or
 @code{widget-backward}, it will display the string @var{motion-doc} in
 the echo area.  In addition, @var{motion-doc} is used as the mouse
 @code{help-echo} string and may actually be a function or form evaluated
-to yield a help string as for @code{help-echo} text properties.
+to yield a help string.  If it is a function, it is called with one
+argument, the widget.
 @c @xref{Text help-echo}.
 
 @item :match @var{function}
@@ -1009,7 +1040,7 @@ implemented.
 @item
 Widgets with tabbing order @code{-1} are ignored.
 
-@item 
+@item
 (Unimplemented) When on a widget with tabbing order @var{n}, go to the
 next widget in the buffer with tabbing order @var{n+1} or @code{nil},
 whichever comes first.
@@ -1030,3 +1061,77 @@ arguments, which will be used when creating the @code{radio-button} or
 @code{checkbox} associated with this item.
 @end ignore
 @end table
+
+@node Defining New Types
+@subsection Defining New Types
+
+In the previous sections we have described how to construct elaborate
+type specifications for @code{defcustom}.  In some cases you may want to
+give such a type specification a name.  The obvious case is when you are
+using the same type for many user options, rather than repeat the
+specification for each option, you can give the type specification a
+name once, and use that name each @code{defcustom}.  The other case is
+when a user option accept a recursive datastructure.  To make it
+possible for a datatype to refer to itself, it needs to have a name.
+
+Since custom types are implemented as widgets, the way to define a new
+customize type is to define a new widget.  We are not going to describe
+the widget interface here in details, see @ref{Top, , Introduction,
+widget, The Emacs Widget Library}, for that.  Instead we are going to
+demonstrate the minimal functionality needed for defining new customize
+types by a simple example.
+
+@example
+(define-widget 'binary-tree-of-string 'lazy
+  "A binary tree made of cons-cells and strings."
+  :offset 4
+  :tag "Node"
+  :type '(choice (string :tag "Leaf" :value "")
+                 (cons :tag "Interior"
+                       :value ("" . "")
+                       binary-tree-of-string
+                       binary-tree-of-string)))
+
+(defcustom foo-bar ""
+  "Sample variable holding a binary tree of strings."
+  :type 'binary-tree-of-string)
+@end example
+
+The function to define a new widget is name @code{define-widget}.  The
+first argument is the symbol we want to make a new widget type.  The
+second argument is a symbol representing an existing widget, the new
+widget is going to be defined in terms of difference from the existing
+widget.  For the purpose of defining new customization types, the
+@code{lazy} widget is perfect, because it accept a @code{:type} keyword
+argument with the same syntax as the keyword argument to
+@code{defcustom} with the same name.  The third argument is a
+documentation string for the new widget.  You will be able to see that
+string with the @kbd{M-x widget-browse @key{ret} binary-tree-of-string
+@key{ret}} command.
+
+After these mandatory arguments follows the keyword arguments.  The most
+important is @code{:type}, which describes the datatype we want to match
+with this widget.  Here a @code{binary-tree-of-string} is described as
+being either a string, or a cons-cell whose car and cdr are themselves
+both @code{binary-tree-of-string}.  Note the reference to the widget
+type we are currently in the process of defining.  The @code{:tag}
+attribute is a string to name the widget in the user interface, and the
+@code{:offset} argument are there to ensure that child nodes are
+indented four spaces relatively to the parent node, making the tree
+structure apparent in the customization buffer.
+
+The @code{defcustom} shows how the new widget can be used as an ordinary
+customization type.
+
+If you wonder about the name @code{lazy}, know that the other composite
+widgets convert their inferior widgets to internal form when the widget
+is instantiated in a buffer.  This conversion is recursive, so the
+inferior widgets will convert @emph{their} inferior widgets.  If the
+datastructure is itself recursive, this conversion will go on forever,
+or at least until Emacs run out of stack space.  The @code{lazy} widget
+stop this recursion, it will only convert its @code{:type} argument when
+needed.
+
+@ignore
+   arch-tag: d1b8fad3-f48c-4ce4-a402-f73b5ef19bd2
+@end ignore