SGI Techpubs Library

Freeware (IRIX)  »  Info Pages
find in page

elisp : Customization

table of contents

  Introduction
  Coding Conventions
  Lisp Data Types
  Numbers
  Strings and Characters
  Lists
  Sequences Arrays Vectors
  Hash Tables
  Symbols
  Evaluation
  Control Structures
  Variables
  Functions
  Macros
  Customization
  Loading
  Byte Compilation
  Advising Functions
  Debugging
  Read and Print
  Minibuffers
  Command Loop
  Keymaps
  Modes
  Documentation
  Files
  Backups and Auto-Saving
  Buffers
  Windows
  Frames
  Positions
  Markers
  Text
  Non-ASCII Characters
  Searching and Matching
  Syntax Tables
  Abbrevs
  Processes
  Display
  Calendar
  System Interface
  Antinews
  GNU Free Documentation License
  GPL
  Tips
  GNU Emacs Internals
  Standard Errors
  Standard Buffer-Local Variables
  Standard Keymaps
  Standard Hooks
  Index
  New Symbols
  Caveats
  Lisp History
  Conventions
  Acknowledgements
  Some Terms
  nil and t
  Evaluation Notation
  Printing Notation
  Error Messages
  Buffer Text Notation
  Format of Descriptions
  Coding Conventions
  Compilation Tips
  Documentation Tips
  Comment Tips
  Library Headers
  A Sample Function Description
  A Sample Variable Description
  Printed Representation
  Comments
  Programming Types
  Editing Types
  Type Predicates
  Equality Predicates
  Integer Type
  Floating Point Type
  Character Type
  Sequence Type
  Cons Cell Type
  Array Type
  String Type
  Vector Type
  Symbol Type
  Function Type
  Macro Type
  Primitive Function Type
  Byte-Code Type
  Autoload Type
  Dotted Pair Notation
  Association List Type
  Buffer Type
  Window Type
  Window Configuration Type
  Marker Type
  Process Type
  Stream Type
  Keymap Type
  Overlay Type
  Integer Basics
  Float Basics
  Predicates on Numbers
  Comparison of Numbers
  Arithmetic Operations
  Bitwise Operations
  Numeric Conversions
  Math Functions
  Random Numbers
  String Basics
  Predicates for Strings
  Creating Strings
  Text Comparison
  String Conversion
  Formatting Strings
  Case Conversion
  Cons Cells
  Lists as Boxes
  List-related Predicates
  List Elements
  Building Lists
  Modifying Lists
  Sets And Lists
  Association Lists
  Setcar
  Setcdr
  Rearrangement
  Sequence Functions
  Arrays
  Array Functions
  Vectors
  Symbol Components
  Definitions
  Creating Symbols
  Property Lists
  Intro Eval
  Eval
  Forms
  Quoting
  Self-Evaluating Forms
  Symbol Forms
  Classifying Lists
  Function Forms
  Macro Forms
  Special Forms
  Autoloading
  Sequencing
  Conditionals
  Combining Conditions
  Iteration
  Nonlocal Exits
  Catch and Throw
  Examples of Catch
  Errors
  Cleanups
  Signaling Errors
  Processing of Errors
  Handling Errors
  Error Symbols
  Global Variables
  Constant Variables
  Local Variables
  Void Variables
  Defining Variables
  Accessing Variables
  Setting Variables
  Variable Scoping
  Buffer-Local Variables
  Scope
  Extent
  Impl of Scope
  Using Scoping
  Intro to Buffer-Local
  Creating Buffer-Local
  Default Value
  What Is a Function
  Lambda Expressions
  Function Names
  Defining Functions
  Calling Functions
  Mapping Functions
  Anonymous Functions
  Function Cells
  Related Topics
  Lambda Components
  Simple Lambda
  Argument List
  Function Documentation
  Simple Macro
  Expansion
  Compiling Macros
  Defining Macros
  Backquote
  Problems with Macros
  How Programs Do Loading
  Autoload
  Named Features
  Repeated Loading
  Compilation Functions
  Disassembly
  Simple Advice
  Defining Advice
  Computed Advice
  Activation of Advice
  Enabling Advice
  Preactivation
  Argument Access in Advice
  Subr Arguments
  Combined Definition
  Debugger
  Syntax Errors
  Compilation Errors
  Edebug
  Error Debugging
  Function Debugging
  Explicit Debug
  Using Debugger
  Debugger Commands
  Invoking the Debugger
  Internals of Debugger
  Excess Open
  Excess Close
  Streams Intro
  Input Streams
  Input Functions
  Output Streams
  Output Functions
  Intro to Minibuffers
  Text from Minibuffer
  Object from Minibuffer
  Completion
  Yes-or-No Queries
  Minibuffer Misc
  Basic Completion
  Minibuffer Completion
  Completion Commands
  High-Level Completion
  Reading File Names
  Programmed Completion
  Command Overview
  Defining Commands
  Interactive Call
  Command Loop Info
  Input Events
  Reading Input
  Waiting
  Quitting
  Prefix Command Arguments
  Recursive Editing
  Disabling Commands
  Command History
  Keyboard Macros
  Using Interactive
  Interactive Codes
  Interactive Examples
  Keymap Terminology
  Format of Keymaps
  Creating Keymaps
  Inheritance and Keymaps
  Prefix Keys
  Menu Keymaps
  Active Keymaps
  Key Lookup
  Functions for Key Lookup
  Changing Key Bindings
  Key Binding Commands
  Scanning Keymaps
  Major Modes
  Minor Modes
  Mode Line Format
  Hooks
  Major Mode Conventions
  Example Major Modes
  Auto Major Mode
  Mode Help
  Minor Mode Conventions
  Keymaps and Minor Modes
  Mode Line Data
  Mode Line Variables
  %-Constructs
  Documentation Basics
  Accessing Documentation
  Keys in Documentation
  Describing Characters
  Help Functions
  Visiting Files
  Saving Buffers
  Reading from Files
  Writing to Files
  File Locks
  Information about Files
  Contents of Directories
  Changing Files
  File Names
  Visiting Functions
  Subroutines of Visiting
  Testing Accessibility
  Kinds of Files
  File Attributes
  File Name Components
  Directory Names
  Relative File Names
  File Name Expansion
  Unique File Names
  File Name Completion
  Backup Files
  Auto-Saving
  Reverting
  Making Backups
  Rename or Copy
  Numbered Backups
  Backup Names
  Buffer Basics
  Buffer Names
  Buffer File Name
  Buffer Modification
  Modification Time
  Read Only Buffers
  The Buffer List
  Creating Buffers
  Killing Buffers
  Current Buffer
  Basic Windows
  Splitting Windows
  Deleting Windows
  Selecting Windows
  Cyclic Window Ordering
  Buffers and Windows
  Displaying Buffers
  Window Point
  Window Start
  Vertical Scrolling
  Horizontal Scrolling
  Size of Window
  Resizing Windows
  Window Configurations
  Creating Frames
  Multiple Displays
  Frame Parameters
  Frame Titles
  Deleting Frames
  Finding All Frames
  Frames and Windows
  Minibuffers and Frames
  Input Focus
  Visibility of Frames
  Raising and Lowering
  Frame Configurations
  Mouse Tracking
  Mouse Position
  Pop-Up Menus
  Dialog Boxes
  Pointer Shapes
  Window System Selections
  Color Names
  Resources
  Display Feature Testing
  Point
  Motion
  Excursions
  Narrowing
  Character Motion
  Word Motion
  Buffer End Motion
  Text Lines
  Screen Lines
  List Motion
  Skipping Characters
  Overview of Markers
  Predicates on Markers
  Creating Markers
  Information from Markers
  Moving Markers
  The Mark
  The Region
  Near Point
  Buffer Contents
  Insertion
  Commands for Insertion
  Deletion
  User-Level Deletion
  The Kill Ring
  Undo
  Auto Filling
  Filling
  Margins
  Sorting
  Indentation
  Columns
  Case Changes
  Text Properties
  Substitution
  Transposition
  Registers
  Change Hooks
  Kill Ring Concepts
  Kill Functions
  Yank Commands
  Low-Level Kill Ring
  Internals of Kill Ring
  Primitive Indent
  Mode-Specific Indent
  Region Indent
  Relative Indent
  Indent Tabs
  Motion by Indent
  Examining Properties
  Changing Properties
  Property Search
  Special Properties
  Format Properties
  Sticky Properties
  Saving Properties
  Lazy Properties
  Clickable Text
  Fields
  Not Intervals
  Text Representations
  Converting Representations
  Selecting a Representation
  Character Codes
  Character Sets
  Chars and Bytes
  Splitting Characters
  Scanning Charsets
  Translation of Characters
  Coding Systems
  Input Methods
  Locales
  String Search
  Regular Expressions
  Regexp Search
  Match Data
  Saving Match Data
  Standard Regexps
  Searching and Case
  Syntax of Regexps
  Regexp Example
  Syntax Descriptors
  Syntax Table Functions
  Parsing Expressions
  Standard Syntax Tables
  Syntax Table Internals
  Syntax Class Table
  Syntax Flags
  Abbrev Mode
  Abbrev Tables
  Defining Abbrevs
  Abbrev Files
  Abbrev Expansion
  Standard Abbrev Tables
  Subprocess Creation
  Synchronous Processes
  Asynchronous Processes
  Deleting Processes
  Process Information
  Input to Processes
  Signals to Processes
  Output from Processes
  Sentinels
  Network
  Process Buffers
  Filter Functions
  Accepting Output
  Starting Up
  Getting Out
  System Environment
  Terminal Input
  Terminal Output
  Flow Control
  Batch Mode
  Startup Summary
  Init File
  Terminal-Specific
  Command-Line Arguments
  Killing Emacs
  Suspending Emacs
  Refresh Screen
  Truncation
  The Echo Area
  Selective Display
  Overlay Arrow
  Temporary Displays
  Waiting
  Blinking
  Usual Display
  Beeping
  Window Systems
  Building Emacs
  Pure Storage
  Garbage Collection
  Object Internals
  Writing Emacs Primitives
  Buffer Internals
  Window Internals
  Process Internals

Writing Customization Definitions ********************************* This chapter describes how to declare user options for customization, and also customization groups for classifying them. We use the term "customization item" to include both kinds of customization definitions--as well as face definitions (*note Defining Faces::). * Menu: * Common Keywords:: * Group Definitions:: * Variable Definitions:: * Customization Types::
back to top

Common Item Keywords ==================== All kinds of customization declarations (for variables and groups, and for faces) accept keyword arguments for specifying various information. This section describes some keywords that apply to all kinds. All of these keywords, except `:tag', can be used more than once in a given item. Each use of the keyword has an independent effect. The keyword `:tag' is an exception because any given item can only display one name. `:tag LABEL' Use LABEL, a string, instead of the item's name, to label the item in customization menus and buffers. `:group GROUP' Put this customization item in group GROUP. When you use `:group' in a `defgroup', it makes the new group a subgroup of GROUP. If you use this keyword more than once, you can put a single item into more than one group. Displaying any of those groups will show this item. Please don't overdo this, since the result would be annoying. `:link LINK-DATA' Include an external link after the documentation string for this item. This is a sentence containing an active field which references some other documentation. There are three alternatives you can use for LINK-DATA: `(custom-manual INFO-NODE)' Link to an Info node; INFO-NODE is a string which specifies the node name, as in `"(emacs)Top"'. The link appears as `[manual]' in the customization buffer. `(info-link INFO-NODE)' Like `custom-manual' except that the link appears in the customization buffer with the Info node name. `(url-link URL)' Link to a web page; URL is a string which specifies the URL. The link appears in the customization buffer as URL. `(emacs-commentary-link LIBRARY)' Link to the commentary section of a library; LIBRARY is a string which specifies the library name. You can specify the text to use in the customization buffer by adding `:tag NAME' after the first element of the LINK-DATA; for example, `(info-link :tag "foo" "(emacs)Top")' makes a link to the Emacs manual which appears in the buffer as `foo'. An item can have more than one external link; however, most items have none at all. `:load FILE' Load file FILE (a string) before displaying this customization item. Loading is done with `load-library', and only if the file is not already loaded. `:require FEATURE' Require feature FEATURE (a symbol) when installing a value for this item (an option or a face) that was saved using the customization feature. This is done by calling `require'. The most common reason to use `:require' is when a variable enables a feature such as a minor mode, and just setting the variable won't have any effect unless the code which implements the mode is loaded.
back to top

Defining Custom Groups ====================== Each Emacs Lisp package should have one main customization group which contains all the options, faces and other groups in the package. If the package has a small number of options and faces, use just one group and put everything in it. When there are more than twelve or so options and faces, then you should structure them into subgroups, and put the subgroups under the package's main customization group. It is OK to put some of the options and faces in the package's main group alongside the subgroups. The package's main or only group should be a member of one or more of the standard customization groups. (To display the full list of them, use `M-x customize'.) Choose one or more of them (but not too many), and add your group to each of them using the `:group' keyword. The way to declare new customization groups is with `defgroup'. - Macro: defgroup group members doc [keyword value]... Declare GROUP as a customization group containing MEMBERS. Do not quote the symbol GROUP. The argument DOC specifies the documentation string for the group. It should not start with a `*' as in `defcustom'; that convention is for variables only. The argument MEMBERS is a list specifying an initial set of customization items to be members of the group. However, most often MEMBERS is `nil', and you specify the group's members by using the `:group' keyword when defining those members. If you want to specify group members through MEMBERS, each element should have the form `(NAME WIDGET)'. Here NAME is a symbol, and WIDGET is a widget type for editing that symbol. Useful widgets are `custom-variable' for a variable, `custom-face' for a face, and `custom-group' for a group. When a new group is introduced into Emacs, use this keyword in `defgroup': `:version VERSION' This option specifies that the group was first introduced in Emacs version VERSION. The value VERSION must be a string. Tag the group with a version like this when it is introduced, rather than the individual members (*note Variable Definitions::). In addition to the common keywords (*note Common Keywords::), you can also use this keyword in `defgroup': `:prefix PREFIX' If the name of an item in the group starts with PREFIX, then the tag for that item is constructed (by default) by omitting PREFIX. One group can have any number of prefixes. The prefix-discarding feature is currently turned off, which means that `:prefix' currently has no effect. We did this because we found that discarding the specified prefixes often led to confusing names for options. This happened because the people who wrote the `defgroup' definitions for various groups added `:prefix' keywords whenever they make logical sense--that is, whenever the variables in the library have a common prefix. In order to obtain good results with `:prefix', it would be necessary to check the specific effects of discarding a particular prefix, given the specific items in a group and their names and documentation. If the resulting text is not clear, then `:prefix' should not be used in that case. It should be possible to recheck all the customization groups, delete the `:prefix' specifications which give unclear results, and then turn this feature back on, if someone would like to do the work.
back to top

Defining Customization Variables ================================ Use `defcustom' to declare user-editable variables. - Macro: defcustom option default doc [keyword value]... Declare OPTION as a customizable user option variable. Do not quote OPTION. The argument DOC specifies the documentation string for the variable. It should often start with a `*' to mark it as a "user option" (*note Defining Variables::). Do not start the documentation string with `*' for options which cannot or normally should not be set with `set-variable'; examples of the former are global minor mode options such as `global-font-lock-mode' and examples of the latter are hooks. If OPTION is void, `defcustom' initializes it to DEFAULT. DEFAULT should be an expression to compute the value; be careful in writing it, because it can be evaluated on more than one occasion. You should normally avoid using backquotes in DEFAULT because they are not expanded when editing the value, causing list values to appear to have the wrong structure. When you evaluate a `defcustom' form with `C-M-x' in Emacs Lisp mode (`eval-defun'), a special feature of `eval-defun' arranges to set the variable unconditionally, without testing whether its value is void. (The same feature applies to `defvar'.) *Note Defining Variables::. `defcustom' accepts the following additional keywords: `:type TYPE' Use TYPE as the data type for this option. It specifies which values are legitimate, and how to display the value. *Note Customization Types::, for more information. `:options LIST' Specify LIST as the list of reasonable values for use in this option. The user is not restricted to using only these values, but they are offered as convenient alternatives. This is meaningful only for certain types, currently including `hook', `plist' and `alist'. See the definition of the individual types for a description of how to use `:options'. `:version VERSION' This option specifies that the variable was first introduced, or its default value was changed, in Emacs version VERSION. The value VERSION must be a string. For example, (defcustom foo-max 34 "*Maximum number of foo's allowed." :type 'integer :group 'foo :version "20.3") `:set SETFUNCTION' Specify SETFUNCTION as the way to change the value of this option. The function SETFUNCTION should take two arguments, a symbol and the new value, and should do whatever is necessary to update the value properly for this option (which may not mean simply setting the option as a Lisp variable). The default for SETFUNCTION is `set-default'. `:get GETFUNCTION' Specify GETFUNCTION as the way to extract the value of this option. The function 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 `default-value'. `:initialize FUNCTION' FUNCTION should be a function used to initialize the variable when the `defcustom' is evaluated. It should take two arguments, the symbol and value. Here are some predefined functions meant for use in this way: `custom-initialize-set' Use the variable's `:set' function to initialize the variable, but do not reinitialize it if it is already non-void. This is the default `:initialize' function. `custom-initialize-default' Like `custom-initialize-set', but use the function `set-default' to set the variable, instead of the variable's `:set' function. This is the usual choice for a variable whose `:set' function enables or disables a minor mode; with this choice, defining the variable will not call the minor mode function, but customizing the variable will do so. `custom-initialize-reset' Always use the `:set' function to initialize the variable. If the variable is already non-void, reset it by calling the `:set' function using the current value (returned by the `:get' method). `custom-initialize-changed' Use the `:set' function to initialize the variable, if it is already set or has been customized; otherwise, just use `set-default'. `:set-after VARIABLES' When setting variables according to saved customizations, make sure to set the variables VARIABLES before this one; in other words, delay setting this variable until after those others have been handled. Use `:set-after' if setting this variable won't work properly unless those other variables already have their intended values. The `:require' option is useful for an option that turns on the operation of a certain feature. Assuming that the package is coded to check the value of the option, you still need to arrange for the package to be loaded. You can do that with `:require'. *Note Common Keywords::. Here is an example, from the library `paren.el': (defcustom show-paren-mode nil "Toggle Show Paren mode..." :set (lambda (symbol value) (show-paren-mode (or value 0))) :initialize 'custom-initialize-default :type 'boolean :group 'paren-showing :require 'paren) If a customization item has a type such as `hook' or `alist', which supports `:options', you can add additional options to the item, outside the `defcustom' declaration, by calling `custom-add-option'. For example, if you define a function `my-lisp-mode-initialization' intended to be called from `emacs-lisp-mode-hook', you might want to add that to the list of options for `emacs-lisp-mode-hook', but not by editing its definition. You can do it thus: (custom-add-option 'emacs-lisp-mode-hook 'my-lisp-mode-initialization) - Function: custom-add-option symbol option To the customization SYMBOL, add OPTION. The precise effect of adding OPTION depends on the customization type of SYMBOL. Internally, `defcustom' uses the symbol property `standard-value' to record the expression for the default value, and `saved-value' to record the value saved by the user with the customization buffer. The `saved-value' property is actually a list whose car is an expression which evaluates to the value.
back to top

Customization Types =================== When you define a user option with `defcustom', you must specify its "customization type". That is a Lisp object which describes (1) which values are legitimate and (2) how to display the value in the customization buffer for editing. You specify the customization type in `defcustom' with the `:type' keyword. The argument of `:type' is evaluated; since types that vary at run time are rarely useful, normally you use a quoted constant. For example: (defcustom diff-command "diff" "*The command to use to run diff." :type '(string) :group 'diff) In general, a customization type is a list whose first element is a symbol, one of the customization type names defined in the following sections. After this symbol come a number of arguments, depending on the symbol. Between the type symbol and its arguments, you can optionally write keyword-value pairs (*note Type Keywords::). Some of the type symbols do not use any arguments; those are called "simple types". For a simple type, if you do not use any keyword-value pairs, you can omit the parentheses around the type symbol. For example just `string' as a customization type is equivalent to `(string)'. * Menu: * Simple Types:: * Composite Types:: * Splicing into Lists:: * Type Keywords::
back to top

Simple Types ------------ This section describes all the simple customization types. `sexp' The value may be any Lisp object that can be printed and read back. You can use `sexp' as a fall-back for any option, if you don't want to take the time to work out a more specific type to use. `integer' The value must be an integer, and is represented textually in the customization buffer. `number' The value must be a number, and is represented textually in the customization buffer. `string' The value must be a string, and the customization buffer shows just the contents, with no delimiting `"' characters and no quoting with `\'. `regexp' Like `string' except that the string must be a valid regular expression. `character' The value must be a character code. A character code is actually an integer, but this type shows the value by inserting the character in the buffer, rather than by showing the number. `file' The value must be a file name, and you can do completion with `M-'. `(file :must-match t)' The value must be a file name for an existing file, and you can do completion with `M-'. `directory' The value must be a directory name, and you can do completion with `M-'. `hook' The value must be a list of functions (or a single function, but that is obsolete usage). This customization type is used for hook variables. You can use the `:options' keyword in a hook variable's `defcustom' to specify a list of functions recommended for use in the hook; see *Note Variable Definitions::. `alist' The value must be a list of cons-cells, the CAR of each cell representing a key, and the CDR of the same cell representing an associated value. The user can add and delete key/value pairs, and edit both the key and the value of each pair. You can specify the key and value types like this: (alist :key-type KEY-TYPE :value-type VALUE-TYPE) where KEY-TYPE and VALUE-TYPE are customization type specifications. The default key type is `sexp', and the default value type is `sexp'. The user can add any key matching the specified key type, but you can give some keys a preferential treatment by specifying them with the `:options' (see *Note Variable Definitions::). The specified keys will always be shown in the customize buffer (together with a suitable value), with a checkbox to include or exclude or disable the key/value pair from the alist. The user will not be able to edit the keys specified by the `:options' keyword argument. The argument to the `:options' keywords should be a list of option specifications. Ordinarily, the options are simply atoms, which are the specified keys. For example: :options '("foo" "bar" "baz") specifies that there are three "known" keys, namely `"foo"', `"bar"' and `"baz"', which will always be shown first. You may want to restrict the value type for specific keys, for example, the value associated with the `"bar"' key can only be an integer. You can specify this by using a list instead of an atom in the option specification. The first element will specify the key, like before, while the second element will specify the value type. :options '("foo" ("bar" integer) "baz") Finally, you may want to change how the key is presented. By default, the key is simply shown as a `const', since the user cannot change the special keys specified with the `:options' keyword. However, you may want to use a more specialized type for presenting the key, like `function-item' if you know it is a symbol with a function binding. This is done by using a customization type specification instead of a symbol for the key. :options '("foo" ((function-item some-function) integer) "baz") Many alists use lists with two elements, instead of cons cells. For example, (defcustom list-alist '(("foo" 1) ("bar" 2) ("baz" 3)) "Each element is a list of the form (KEY VALUE).") instead of (defcustom cons-alist '(("foo" . 1) ("bar" . 2) ("baz" . 3)) "Each element is a cons-cell (KEY . VALUE).") Because of the way lists are implemented on top of cons cells, you can treat `list-alist' in the example above as a cons cell alist, where the value type is a list with a single element containing the real value. (defcustom list-alist '(("foo" 1) ("bar" 2) ("baz" 3)) "Each element is a list of the form (KEY VALUE)." :type '(alist :value-type (group integer))) The `group' widget is used here instead of `list' only because the formatting is better suited for the purpose. Similarily, you can have alists with more values associated with each key, using variations of this trick: (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") ("dorith" "dog" "guppy") ("ken" "cat")) "Alist of people's pets. In an element (KEY . VALUE), KEY is the person's name, and the VALUE is a list of that person's pets." :type '(alist :value-type (repeat string))) `plist' The `plist' custom type is similar to the `alist' (see above), except that the information is stored as a property list, i.e. a list of this form: (KEY VALUE KEY VALUE KEY VALUE ...) The default `:key-type' for `plist' is `symbol', rather than `sexp'. `symbol' The value must be a symbol. It appears in the customization buffer as the name of the symbol. `function' The value must be either a lambda expression or a function name. When it is a function name, you can do completion with `M-'. `variable' The value must be a variable name, and you can do completion with `M-'. `face' The value must be a symbol which is a face name, and you can do completion with `M-'. `boolean' The value is boolean--either `nil' or `t'. Note that by using `choice' and `const' together (see the next section), you can specify that the value must be `nil' or `t', but also specify the text to describe each value in a way that fits the specific meaning of the alternative. `coding-system' The value must be a coding-system name, and you can do completion with `M-'. `color' The value must be a valid color name, and you can do completion with `M-'. A sample is provided,
back to top

Composite Types --------------- When none of the simple types is appropriate, you can use composite types, which build new types from other types. Here are several ways of doing that: `(restricted-sexp :match-alternatives CRITERIA)' The value may be any Lisp object that satisfies one of CRITERIA. CRITERIA should be a list, and each element should be one of these possibilities: * A predicate--that is, a function of one argument that has no side effects, and returns either `nil' or non-`nil' according to the argument. Using a predicate in the list says that objects for which the predicate returns non-`nil' are acceptable. * A quoted constant--that is, `'OBJECT'. This sort of element in the list says that OBJECT itself is an acceptable value. For example, (restricted-sexp :match-alternatives (integerp 't 'nil)) allows integers, `t' and `nil' as legitimate values. The customization buffer shows all legitimate values using their read syntax, and the user edits them textually. `(cons CAR-TYPE CDR-TYPE)' The value must be a cons cell, its CAR must fit CAR-TYPE, and its CDR must fit CDR-TYPE. For example, `(cons string symbol)' is a customization type which matches values such as `("foo" . foo)'. In the customization buffer, the CAR and the CDR are displayed and edited separately, each according to the type that you specify for it. `(list ELEMENT-TYPES...)' The value must be a list with exactly as many elements as the ELEMENT-TYPES you have specified; and each element must fit the corresponding ELEMENT-TYPE. For example, `(list integer string function)' describes a list of three elements; the first element must be an integer, the second a string, and the third a function. In the customization buffer, each element is displayed and edited separately, according to the type specified for it. `(vector ELEMENT-TYPES...)' Like `list' except that the value must be a vector instead of a list. The elements work the same as in `list'. `(choice ALTERNATIVE-TYPES...)' The value must fit at least one of ALTERNATIVE-TYPES. For example, `(choice integer string)' allows either an integer or a string. In the customization buffer, the user selects one of the alternatives using a menu, and can then edit the value in the usual way for that alternative. Normally the strings in this menu are determined automatically from the choices; however, you can specify different strings for the menu by including the `:tag' keyword in the alternatives. For example, if an integer stands for a number of spaces, while a string is text to use verbatim, you might write the customization type this way, (choice (integer :tag "Number of spaces") (string :tag "Literal text")) so that the menu offers `Number of spaces' and `Literal Text'. In any alternative for which `nil' is not a valid value, other than a `const', you should specify a valid default for that alternative using the `:value' keyword. *Note Type Keywords::. `(radio ELEMENT-TYPES...)' This is similar to `choice', except that the choices are displayed using `radio buttons' rather than a menu. This has the advantage of displaying documentation for the choices when applicable and so is often a good choice for a choice between constant functions (`function-item' customization types). `(const VALUE)' The value must be VALUE--nothing else is allowed. The main use of `const' is inside of `choice'. For example, `(choice integer (const nil))' allows either an integer or `nil'. `:tag' is often used with `const', inside of `choice'. For example, (choice (const :tag "Yes" t) (const :tag "No" nil) (const :tag "Ask" foo)) describes a variable for which `t' means yes, `nil' means no, and `foo' means "ask." `(other VALUE)' This alternative can match any Lisp value, but if the user chooses this alternative, that selects the value VALUE. The main use of `other' is as the last element of `choice'. For example, (choice (const :tag "Yes" t) (const :tag "No" nil) (other :tag "Ask" foo)) describes a variable for which `t' means yes, `nil' means no, and anything else means "ask." If the user chooses `Ask' from the menu of alternatives, that specifies the value `foo'; but any other value (not `t', `nil' or `foo') displays as `Ask', just like `foo'. `(function-item FUNCTION)' Like `const', but used for values which are functions. This displays the documentation string as well as the function name. The documentation string is either the one you specify with `:doc', or FUNCTION's own documentation string. `(variable-item VARIABLE)' Like `const', but used for values which are variable names. This displays the documentation string as well as the variable name. The documentation string is either the one you specify with `:doc', or VARIABLE's own documentation string. `(set TYPES...)' The value must be a list, and each element of the list must match one of the TYPES specified. This appears in the customization buffer as a checklist, so that each of TYPES may have either one corresponding element or none. It is not possible to specify two different elements that match the same one of TYPES. For example, `(set integer symbol)' allows one integer and/or one symbol in the list; it does not allow multiple integers or multiple symbols. As a result, it is rare to use nonspecific types such as `integer' in a `set'. Most often, the TYPES in a `set' are `const' types, as shown here: (set (const :bold) (const :italic)) Sometimes they describe possible elements in an alist: (set (cons :tag "Height" (const height) integer) (cons :tag "Width" (const width) integer)) That lets the user specify a height value optionally and a width value optionally. `(repeat ELEMENT-TYPE)' The value must be a list and each element of the list must fit the type ELEMENT-TYPE. This appears in the customization buffer as a list of elements, with `[INS]' and `[DEL]' buttons for adding more elements or removing elements.
back to top

Splicing into Lists ------------------- The `:inline' feature lets you splice a variable number of elements into the middle of a list or vector. You use it in a `set', `choice' or `repeat' type which appears among the element-types of a `list' or `vector'. Normally, each of the element-types in a `list' or `vector' describes one and only one element of the list or vector. Thus, if an element-type is a `repeat', that specifies a list of unspecified length which appears as one element. But when the element-type uses `:inline', the value it matches is merged directly into the containing sequence. For example, if it matches a list with three elements, those become three elements of the overall sequence. This is analogous to using `,@' in the backquote construct. For example, to specify a list whose first element must be `t' and whose remaining arguments should be zero or more of `foo' and `bar', use this customization type: (list (const t) (set :inline t foo bar)) This matches values such as `(t)', `(t foo)', `(t bar)' and `(t foo bar)'. When the element-type is a `choice', you use `:inline' not in the `choice' itself, but in (some of) the alternatives of the `choice'. For example, to match a list which must start with a file name, followed either by the symbol `t' or two strings, use this customization type: (list file (choice (const t) (list :inline t string string))) If the user chooses the first alternative in the choice, then the overall list has two elements and the second element is `t'. If the user chooses the second alternative, then the overall list has three elements and the second and third must be strings.
back to top

Type Keywords ------------- You can specify keyword-argument pairs in a customization type after the type name symbol. Here are the keywords you can use, and their meanings: `:value DEFAULT' This is used for a type that appears as an alternative inside of `choice'; it specifies the default value to use, at first, if and when the user selects this alternative with the menu in the customization buffer. Of course, if the actual value of the option fits this alternative, it will appear showing the actual value, not DEFAULT. If `nil' is not a valid value for the alternative, then it is essential to specify a valid default with `:value'. `:format FORMAT-STRING' This string will be inserted in the buffer to represent the value corresponding to the type. The following `%' escapes are available for use in FORMAT-STRING: `%[BUTTON%]' Display the text BUTTON marked as a button. The `:action' attribute specifies what the button will do if the user invokes it; its value is a function which takes two arguments--the widget which the button appears in, and the event. There is no way to specify two different buttons with different actions. `%{SAMPLE%}' Show SAMPLE in a special face specified by `:sample-face'. `%v' Substitute the item's value. How the value is represented depends on the kind of item, and (for variables) on the customization type. `%d' Substitute the item's documentation string. `%h' Like `%d', but if the documentation string is more than one line, add an active field to control whether to show all of it or just the first line. `%t' Substitute the tag here. You specify the tag with the `:tag' keyword. `%%' Display a literal `%'. `:action ACTION' Perform ACTION if the user clicks on a button. `:button-face FACE' Use the face FACE (a face name or a list of face names) for button text displayed with `%[...%]'. `:button-prefix PREFIX' `:button-suffix SUFFIX' These specify the text to display before and after a button. Each can be: `nil' No text is inserted. a string The string is inserted literally. a symbol The symbol's value is used. `:tag TAG' Use TAG (a string) as the tag for the value (or part of the value) that corresponds to this type. `:doc DOC' Use DOC as the documentation string for this value (or part of the value) that corresponds to this type. In order for this to work, you must specify a value for `:format', and use `%d' or `%h' in that value. The usual reason to specify a documentation string for a type is to provide more information about the meanings of alternatives inside a `:choice' type or the parts of some other composite type. `:help-echo MOTION-DOC' When you move to this item with `widget-forward' or `widget-backward', it will display the string MOTION-DOC in the echo area. In addition, MOTION-DOC is used as the mouse `help-echo' string and may actually be a function or form evaluated to yield a help string as for `help-echo' text properties. `:match FUNCTION' Specify how to decide whether a value matches the type. The corresponding value, FUNCTION, should be a function that accepts two arguments, a widget and a value; it should return non-`nil' if the value is acceptable.
back to top

elisp : Customization table of contents   Introduction   Coding Conventions   Lisp Data Types   Numbers   Strings and Characters   Lists   Sequences Arrays Vectors   Hash Tables   Symbols   Evaluation   Control Structures   Variables   Functions   Macros   Customization   Loading   Byte Compilation   Advising Functions   Debugging   Read and Print   Minibuffers   Command Loop   Keymaps   Modes   Documentation   Files   Backups and Auto-Saving   Buffers   Windows   Frames   Positions   Markers   Text   Non-ASCII Characters   Searching and Matching   Syntax Tables   Abbrevs   Processes   Display   Calendar   System Interface   Antinews   GNU Free Documentation License   GPL   Tips   GNU Emacs Internals   Standard Errors   Standard Buffer-Local Variables   Standard Keymaps   Standard Hooks   Index   New Symbols   Caveats   Lisp History   Conventions   Acknowledgements   Some Terms   nil and t   Evaluation Notation   Printing Notation   Error Messages   Buffer Text Notation   Format of Descriptions   Coding Conventions   Compilation Tips   Documentation Tips   Comment Tips   Library Headers   A Sample Function Description   A Sample Variable Description   Printed Representation   Comments   Programming Types   Editing Types   Type Predicates   Equality Predicates   Integer Type   Floating Point Type   Character Type   Sequence Type   Cons Cell Type   Array Type   String Type   Vector Type   Symbol Type   Function Type   Macro Type   Primitive Function Type   Byte-Code Type   Autoload Type   Dotted Pair Notation   Association List Type   Buffer Type   Window Type   Window Configuration Type   Marker Type   Process Type   Stream Type   Keymap Type   Overlay Type   Integer Basics   Float Basics   Predicates on Numbers   Comparison of Numbers   Arithmetic Operations   Bitwise Operations   Numeric Conversions   Math Functions   Random Numbers   String Basics   Predicates for Strings   Creating Strings   Text Comparison   String Conversion   Formatting Strings   Case Conversion   Cons Cells   Lists as Boxes   List-related Predicates   List Elements   Building Lists   Modifying Lists   Sets And Lists   Association Lists   Setcar   Setcdr   Rearrangement   Sequence Functions   Arrays   Array Functions   Vectors   Symbol Components   Definitions   Creating Symbols   Property Lists   Intro Eval   Eval   Forms   Quoting   Self-Evaluating Forms   Symbol Forms   Classifying Lists   Function Forms   Macro Forms   Special Forms   Autoloading   Sequencing   Conditionals   Combining Conditions   Iteration   Nonlocal Exits   Catch and Throw   Examples of Catch   Errors   Cleanups   Signaling Errors   Processing of Errors   Handling Errors   Error Symbols   Global Variables   Constant Variables   Local Variables   Void Variables   Defining Variables   Accessing Variables   Setting Variables   Variable Scoping   Buffer-Local Variables   Scope   Extent   Impl of Scope   Using Scoping   Intro to Buffer-Local   Creating Buffer-Local   Default Value   What Is a Function   Lambda Expressions   Function Names   Defining Functions   Calling Functions   Mapping Functions   Anonymous Functions   Function Cells   Related Topics   Lambda Components   Simple Lambda   Argument List   Function Documentation   Simple Macro   Expansion   Compiling Macros   Defining Macros   Backquote   Problems with Macros   How Programs Do Loading   Autoload   Named Features   Repeated Loading   Compilation Functions   Disassembly   Simple Advice   Defining Advice   Computed Advice   Activation of Advice   Enabling Advice   Preactivation   Argument Access in Advice   Subr Arguments   Combined Definition   Debugger   Syntax Errors   Compilation Errors   Edebug   Error Debugging   Function Debugging   Explicit Debug   Using Debugger   Debugger Commands   Invoking the Debugger   Internals of Debugger   Excess Open   Excess Close   Streams Intro   Input Streams   Input Functions   Output Streams   Output Functions   Intro to Minibuffers   Text from Minibuffer   Object from Minibuffer   Completion   Yes-or-No Queries   Minibuffer Misc   Basic Completion   Minibuffer Completion   Completion Commands   High-Level Completion   Reading File Names   Programmed Completion   Command Overview   Defining Commands   Interactive Call   Command Loop Info   Input Events   Reading Input   Waiting   Quitting   Prefix Command Arguments   Recursive Editing   Disabling Commands   Command History   Keyboard Macros   Using Interactive   Interactive Codes   Interactive Examples   Keymap Terminology   Format of Keymaps   Creating Keymaps   Inheritance and Keymaps   Prefix Keys   Menu Keymaps   Active Keymaps   Key Lookup   Functions for Key Lookup   Changing Key Bindings   Key Binding Commands   Scanning Keymaps   Major Modes   Minor Modes   Mode Line Format   Hooks   Major Mode Conventions   Example Major Modes   Auto Major Mode   Mode Help   Minor Mode Conventions   Keymaps and Minor Modes   Mode Line Data   Mode Line Variables   %-Constructs   Documentation Basics   Accessing Documentation   Keys in Documentation   Describing Characters   Help Functions   Visiting Files   Saving Buffers   Reading from Files   Writing to Files   File Locks   Information about Files   Contents of Directories   Changing Files   File Names   Visiting Functions   Subroutines of Visiting   Testing Accessibility   Kinds of Files   File Attributes   File Name Components   Directory Names   Relative File Names   File Name Expansion   Unique File Names   File Name Completion   Backup Files   Auto-Saving   Reverting   Making Backups   Rename or Copy   Numbered Backups   Backup Names   Buffer Basics   Buffer Names   Buffer File Name   Buffer Modification   Modification Time   Read Only Buffers   The Buffer List   Creating Buffers   Killing Buffers   Current Buffer   Basic Windows   Splitting Windows   Deleting Windows   Selecting Windows   Cyclic Window Ordering   Buffers and Windows   Displaying Buffers   Window Point   Window Start   Vertical Scrolling   Horizontal Scrolling   Size of Window   Resizing Windows   Window Configurations   Creating Frames   Multiple Displays   Frame Parameters   Frame Titles   Deleting Frames   Finding All Frames   Frames and Windows   Minibuffers and Frames   Input Focus   Visibility of Frames   Raising and Lowering   Frame Configurations   Mouse Tracking   Mouse Position   Pop-Up Menus   Dialog Boxes   Pointer Shapes   Window System Selections   Color Names   Resources   Display Feature Testing   Point   Motion   Excursions   Narrowing   Character Motion   Word Motion   Buffer End Motion   Text Lines   Screen Lines   List Motion   Skipping Characters   Overview of Markers   Predicates on Markers   Creating Markers   Information from Markers   Moving Markers   The Mark   The Region   Near Point   Buffer Contents   Insertion   Commands for Insertion   Deletion   User-Level Deletion   The Kill Ring   Undo   Auto Filling   Filling   Margins   Sorting   Indentation   Columns   Case Changes   Text Properties   Substitution   Transposition   Registers   Change Hooks   Kill Ring Concepts   Kill Functions   Yank Commands   Low-Level Kill Ring   Internals of Kill Ring   Primitive Indent   Mode-Specific Indent   Region Indent   Relative Indent   Indent Tabs   Motion by Indent   Examining Properties   Changing Properties   Property Search   Special Properties   Format Properties   Sticky Properties   Saving Properties   Lazy Properties   Clickable Text   Fields   Not Intervals   Text Representations   Converting Representations   Selecting a Representation   Character Codes   Character Sets   Chars and Bytes   Splitting Characters   Scanning Charsets   Translation of Characters   Coding Systems   Input Methods   Locales   String Search   Regular Expressions   Regexp Search   Match Data   Saving Match Data   Standard Regexps   Searching and Case   Syntax of Regexps   Regexp Example   Syntax Descriptors   Syntax Table Functions   Parsing Expressions   Standard Syntax Tables   Syntax Table Internals   Syntax Class Table   Syntax Flags   Abbrev Mode   Abbrev Tables   Defining Abbrevs   Abbrev Files   Abbrev Expansion   Standard Abbrev Tables   Subprocess Creation   Synchronous Processes   Asynchronous Processes   Deleting Processes   Process Information   Input to Processes   Signals to Processes   Output from Processes   Sentinels   Network   Process Buffers   Filter Functions   Accepting Output   Starting Up   Getting Out   System Environment   Terminal Input   Terminal Output   Flow Control   Batch Mode   Startup Summary   Init File   Terminal-Specific   Command-Line Arguments   Killing Emacs   Suspending Emacs   Refresh Screen   Truncation   The Echo Area   Selective Display   Overlay Arrow   Temporary Displays   Waiting   Blinking   Usual Display   Beeping   Window Systems   Building Emacs   Pure Storage   Garbage Collection   Object Internals   Writing Emacs Primitives   Buffer Internals   Window Internals   Process Internals


home/search | what's new | help