aboutsummaryrefslogtreecommitdiffstats
path: root/lispref
diff options
context:
space:
mode:
Diffstat (limited to 'lispref')
-rw-r--r--lispref/customize.texi73
1 files changed, 72 insertions, 1 deletions
diff --git a/lispref/customize.texi b/lispref/customize.texi
index 8621cb65662..90600f410b7 100644
--- a/lispref/customize.texi
+++ b/lispref/customize.texi
@@ -1,6 +1,6 @@
1@c -*-texinfo-*- 1@c -*-texinfo-*-
2@c This is part of the GNU Emacs Lisp Reference Manual. 2@c This is part of the GNU Emacs Lisp Reference Manual.
3@c Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. 3@c Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
4@c See the file elisp.texi for copying conditions. 4@c See the file elisp.texi for copying conditions.
5@setfilename ../info/customize 5@setfilename ../info/customize
6@node Customization, Loading, Macros, Top 6@node Customization, Loading, Macros, Top
@@ -373,6 +373,7 @@ equivalent to @code{(string)}.
373* Composite Types:: 373* Composite Types::
374* Splicing into Lists:: 374* Splicing into Lists::
375* Type Keywords:: 375* Type Keywords::
376* Defining New Types::
376@end menu 377@end menu
377 378
378All customization types are implemented as widgets; see @ref{Top, , 379All customization types are implemented as widgets; see @ref{Top, ,
@@ -1056,6 +1057,76 @@ arguments, which will be used when creating the @code{radio-button} or
1056@end ignore 1057@end ignore
1057@end table 1058@end table
1058 1059
1060@node Defining New Types
1061@subsection Defining New Types
1062
1063In the previous sections we have described how to construct elaborate
1064type specifications for @code{defcustom}. In some cases you may want to
1065give such a type specification a name. The obvious case is when you are
1066using the same type for many user options, rather than repeat the
1067specification for each option, you can give the type specification a
1068name once, and use that name each @code{defcustom}. The other case is
1069when a user option accept a recursive datastructure. To make it
1070possible for a datatype to refer to itself, it needs to have a name.
1071
1072Since custom types are implemented as widgets, the way to define a new
1073customize type is to define a new widget. We are not going to describe
1074the widget interface here in details, see @ref{Top, , Introduction,
1075widget, The Emacs Widget Library}, for that. Instead we are going to
1076demonstrate the minimal functionality needed for defining new customize
1077types by a simple example.
1078
1079@example
1080(define-widget 'binary-tree-of-string 'lazy
1081 "A binary tree made of cons-cells and strings."
1082 :offset 4
1083 :tag "Node"
1084 :type '(choice (string :tag "Leaf" :value "")
1085 (cons :tag "Interior"
1086 :value ("" . "")
1087 binary-tree-of-string
1088 binary-tree-of-string)))
1089
1090(defcustom foo-bar ""
1091 "Sample variable holding a binary tree of strings."
1092 :type 'binary-tree-of-string)
1093@end example
1094
1095The function to define a new widget is name @code{define-widget}. The
1096first argument is the symbol we want to make a new widget type. The
1097second argument is a symbol representing an existing widget, the new
1098widget is going to be defined in terms of difference from the existing
1099widget. For the purpose of defining new customization types, the
1100@code{lazy} widget is perfect, because it accept a @code{:type} keyword
1101argument with the same syntax as the keyword argument to
1102@code{defcustom} with the same name. The third argument is a
1103documentation string for the new widget. You will be able to see that
1104string with the @kbd{M-x widget-browse @key{ret} binary-tree-of-string
1105@key{ret}} command.
1106
1107After these mandatory arguments follows the keyword arguments. The most
1108important is @code{:type}, which describes the datatype we want to match
1109with this widget. Here a @code{binary-tree-of-string} is described as
1110being either a string, or a cons-cell whose car and cdr are themselves
1111both @code{binary-tree-of-string}. Note the reference to the widget
1112type we are currently in the process of defining. The @code{:tag}
1113attribute is a string to name the widget in the user interface, and the
1114@code{:offset} argument are there to ensure that child nodes are
1115indented four spaces relatively to the parent node, making the tree
1116structure apparent in the customization buffer.
1117
1118The @code{defcustom} shows how the new widget can be used as an ordinary
1119customization type.
1120
1121If you wonder about the name @code{lazy}, know that the other composite
1122widgets convert their inferior widgets to internal form when the widget
1123is instantiated in a buffer. This conversion is recursive, so the
1124inferior widgets will convert @emph{their} inferior widgets. If the
1125datastructure is itself recursive, this conversion will go on forever,
1126or at least until Emacs run out of stack space. The @code{lazy} widget
1127stop this recursion, it will only convert its @code{:type} argument when
1128needed.
1129
1059@ignore 1130@ignore
1060 arch-tag: d1b8fad3-f48c-4ce4-a402-f73b5ef19bd2 1131 arch-tag: d1b8fad3-f48c-4ce4-a402-f73b5ef19bd2
1061@end ignore 1132@end ignore