changeset 21006:00022857f529

Initial revision
author Richard M. Stallman <rms@gnu.org>
date Sat, 28 Feb 1998 01:49:58 +0000
parents fd60546a64f6
children 66d807bdc5b4
files lispref/customize.texi lispref/nonascii.texi
diffstat 2 files changed, 1456 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lispref/customize.texi	Sat Feb 28 01:49:58 1998 +0000
@@ -0,0 +1,765 @@
+@c -*-texinfo-*-
+@c This is part of the GNU Emacs Lisp Reference Manual.
+@c Copyright (C) 1997, 1998 Free Software Foundation, Inc. 
+@c See the file elisp.texi for copying conditions.
+@setfilename ../info/customize
+@node Customization, Loading, Macros, Top
+@chapter Writing Customization Definitions
+
+This chapter describes how to declare customization groups, variables,
+and faces.  We use the term @dfn{customization item} to include all
+three of those.  This has few examples, but please look at the file
+@file{cus-edit.el}, which contains many declarations you can learn from.
+
+@menu
+* Common Keywords::
+* Group Definitions::            
+* Variable Definitions::         
+* Face Definitions::             
+* Customization Types::
+@end menu
+
+@node Common Keywords
+@section Common Keywords for All Kinds of Items
+
+All three kinds of customization declarations (for groups, variables,
+and faces) accept keyword arguments for specifying various information.
+This section describes some keywords that apply to all three.
+
+All of these keywords, except @code{:tag}, can be used more than once in
+a given item.  Each use of the keyword has an independent effect.  The
+keyword @code{:tag} is an exception because any given item can only
+display one name item.
+
+@table @code
+@item :group @var{group}
+Put this customization item in group @var{group}.  When you use
+@code{:group} in a @code{defgroup}, it makes the new group a subgroup of
+@var{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.  Be careful not to overdo this!
+
+@item :link @var{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 @var{link-data}:
+
+@table @code
+@item (custom-manual @var{info-node})
+Link to an Info node; @var{info-node} is a string which specifies the
+node name, as in @code{"(emacs)Top"}.  The link appears as
+@samp{[manual]} in the customization buffer.
+
+@item (info-link @var{info-node})
+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 URL.  The
+link appears in the customization buffer as @var{url}.
+@end table
+
+You can specify the text to use in the customization buffer by adding
+@code{:tag @var{name}} after the first element of the @var{link-data};
+for example, @code{(info-link :tag "foo" "(emacs)Top")} makes a link to
+the Emacs manual which appears in the buffer as @samp{foo}.
+
+An item can have more than one external link; however, most items have
+none at all.
+
+@item :load @var{file}
+Load file @var{file} (a string) before displaying this customization
+item.  Loading is done with @code{load-library}, and only if the file is
+not already loaded.
+
+@item :require @var{feature}
+Require feature @var{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 @code{require}.
+
+The most common reason to use @code{: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.
+
+@item :tag @var{name}
+Use @var{name}, a string, instead of the item's name, to label the item
+in customization menus and buffers.
+@end table
+
+@node Group Definitions
+@section 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
+have 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.  Type press @kbd{C-h p} to display a
+list of finder keywords; them choose some of them add your group to each
+of them, using the @code{:group} keyword.
+
+The way to declare new customization groups is with @code{defgroup}.
+
+@tindex defgroup
+@defmac defgroup group members doc [keyword value]...
+Declare @var{group} as a customization group containing @var{members}.
+Do not quote the symbol @var{group}.  The argument @var{doc} specifies
+the documentation string for the group.
+
+The arguments @var{members} can be an alist whose elements specify
+members of the group; however, normally @var{members} is @code{nil}, and
+you specify the group's members by using the @code{:group} keyword when
+defining those members.
+
+@ignore
+@code{(@var{name} @var{widget})}.  Here @var{name} is a symbol, and
+@var{widget} is a widget for editing that symbol.  Useful widgets are
+@code{custom-variable} for editing variables, @code{custom-face} for
+editing faces, and @code{custom-group} for editing groups.
+@end ignore
+
+In addition to the common keywords (@pxref{Common Keywords}), you can
+use this keyword in @code{defgroup}:
+
+@table @code
+@item :prefix @var{prefix}
+If the name of an item in the group starts with @var{prefix}, then the
+tag for that item is constructed (by default) by omitting @var{prefix}.
+
+One group can have any number of prefixes.
+@end table
+@end defmac
+
+The @code{:prefix} feature is currently turned off, which means that
+@code{: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 @code{defgroup}
+definitions for various groups added @code{:prefix} keywords whenever
+they make logical sense---that is, whenever they say that there was a
+common prefix for the option names in a library.
+
+In order to obtain good results with @code{:prefix}, it is 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 @code{:prefix} should not be used in
+that case.
+
+It should be possible to recheck all the customization groups, delete
+the @code{:prefix} specifications which give unclear results, and then
+turn this feature back on, if someone would like to do the work.
+
+@node Variable Definitions
+@section Defining Customization Variables
+
+  Use @code{defcustom} to declare user editable variables.
+
+@tindex defcustom
+@defmac defcustom option value doc [keyword value]...
+Declare @var{option} as a customizable user option variable that
+defaults to @var{value}.  Do not quote @var{option}.  @var{value} should
+be an expression to compute the value; it will be be evaluated on more
+than one occasion.
+
+If @var{option} is void, @code{defcustom} initializes it to @var{value}.
+
+The argument @var{doc} specifies the documentation string for the variable.
+
+The following additional keywords are defined:
+
+@table @code
+@item :type @var{type}
+Use @var{type} as the data type for this option.  It specifies which
+values are legitimate, and how to display the value.
+@xref{Customization Types}, for more information.
+
+@item :options @var{list}
+Specify @var{list} as the list of reasonable values for use in this
+option.
+
+Currently this is meaningful only when type is @code{hook}.  The
+elements of @var{list} are functions that you might likely want to use
+as elements of the hook value.  The user is not actually restricted to
+using only these functions, but they are offered as convenient
+alternatives.
+
+@item :version @var{version}
+This option specifies that the variable's default value was changed in
+Emacs version @var{version}.  For example,
+
+@example
+(defcustom foo-max 34
+  "*Maximum number of foo's allowed."
+  :type 'integer
+  :group 'foo
+  :version "20.3")
+@end example
+
+@item :set @var{setfunction}
+Specify @var{setfunction} as the way to change the value of this option.
+The function @var{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 @var{setfunction} is
+@code{set-default}.
+
+@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}.
+
+@item :initialize @var{function}
+@var{function} should be a function used to initialize the variable when
+the @code{defcustom} is evaluated.  It should take two arguments, the
+symbol and value.  Here are some predefined functions meant for use in
+this way:
+
+@table @code
+@item custom-initialize-set
+Use the variable's @code{:set} function to initialize the variable.  Do
+not reinitialize it if it is already non-void.  This is the default
+@code{:initialize} function.
+
+@item custom-initialize-default
+Always use @code{set-default} to initialize the variable, even if some
+other @code{:set} function has been specified.
+
+@item custom-initialize-reset
+Even 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).
+
+@item custom-initialize-changed
+Like @code{custom-initialize-reset}, except use @code{set-default}
+(rather than the @code{:set} function) to initialize the variable if it
+is not bound and has not been set already.
+@end table
+
+@item :require @var{feature}
+If the user saves a customized value for this item, them Emacs should do
+@code{(require @var{feature})} after installing the saved value.
+
+The place to use this feature is 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.  That is what @code{:require} is for.
+@end table
+@end defmac
+
+@ignore
+Use @code{custom-add-option} to specify that a specific function is
+useful as an member of a hook.
+
+@defun custom-add-option symbol option
+To the variable @var{symbol} add @var{option}.
+
+If @var{symbol} is a hook variable, @var{option} should be a hook
+member.  For other types variables, the effect is undefined."
+@end defun
+@end ignore
+
+Internally, @code{defcustom} uses the symbol property
+@code{standard-value} to record the expression for the default value,
+and @code{saved-value} to record the value saved by the user with the
+customization buffer.  The @code{saved-value} property is actually a
+list whose car is an expression which evaluates to the value.
+
+@node Face Definitions
+@section Defining Faces
+
+Faces are declared with @code{defface}.
+
+@tindex defface
+@defmac defface face spec doc [keyword value]... 
+Declare @var{face} as a customizable face that defaults according to
+@var{spec}.  Do not quote the symbol @var{face}.
+
+@var{doc} is the face documentation.
+
+@var{spec} should be an alist whose elements have the form
+@code{(@var{display} @var{atts})} (see below).  When @code{defface}
+executes, it defines the face according to @var{spec}, then uses any
+customizations saved in the @file{.emacs} file to override that
+specification.
+
+In each element of @var{spec}, @var{atts} is a list of face attributes
+and their values.  The possible attributes are defined in the variable
+@code{custom-face-attributes}.
+
+The @var{display} part of an element of @var{spec} determines which
+frames the element applies to.  If more than one element of @var{spec}
+matches a given frame, the first matching element is the only one used
+for that frame.
+
+If @var{display} is @code{t} in a @var{spec} element, that element
+matches all frames.  (This means that any subsequent elements of
+@var{spec} are never used.)
+
+Alternatively, @var{display} can be an alist whose elements have the
+form @code{(@var{characteristic} @var{value}@dots{})}.  Here
+@var{characteristic} specifies a way of classifying frames, and the
+@var{value}s are possible classifications which @var{display} should
+apply to.  Here are the possible values of @var{characteristic}:
+
+@table @code
+@item type
+The kind of window system the frame uses---either @code{x}, @code{pc}
+(for the MS-DOS console), @code{w32} (for MS Windows 9X/NT), or
+@code{tty}.
+
+@item class
+What kinds of colors the frame supports---either @code{color},
+@code{grayscale}, or @code{mono}.
+
+@item background
+The kind of background--- either @code{light} or @code{dark}.
+@end table
+
+If an element of @var{display} specifies more than one
+@var{value} for a given @var{characteristic}, any of those values
+is acceptable.  If an element of @var{display} has elements for
+more than one @var{characteristic}, then @var{each} characteristic
+of the frame must match one of the values specified for it.
+@end defmac
+
+Internally, @code{defface} uses the symbol property
+@code{face-defface-spec} to record the face attributes specified in
+@code{defface}, @code{saved-face} for the attributes saved by the user
+with the customization buffer, and @code{face-documentation} for the
+documentation string.
+
+@node Customization Types
+@section Customization Types
+
+  When you define a user option with @code{defcustom}, you must specify
+its @dfn{customization type}.  That is a Lisp object which indictaes (1)
+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 it is a quoted
+constant.  For example:
+
+@example
+(defcustom diff-command "diff"
+  "*The command to use to run diff."
+  :type 'string
+  :group 'diff)
+@end example
+
+  In general, a customization type appears 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.  Some of the type symbols do not use any
+arguments; those are called @dfn{simple types}.
+
+  In between the type symbol and its arguments, you can optionally
+write keyword-value pairs.  @xref{Type Keywords}.
+
+  For a simple type, if you do not use any keyword-value pairs, you can
+omit the parentheses around the type symbol.  The above example does
+this, using just @code{string} as the customization type.
+But @code{(string)} would mean the same thing.
+
+@menu
+* Simple Types::
+* Composite Types::
+* Splicing into Lists::
+* Type Keywords::
+@end menu
+
+@node Simple Types
+@subsection Simple Types
+
+  This section describes all the simple customization types.
+
+@table @code
+@item sexp
+The value may be any Lisp object that can be printed and read back.  You
+can use @code{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.
+
+@item integer
+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.
+
+@item string
+The value must be a string, and the customization buffer shows just the
+contents, with no @samp{"} characters or quoting with @samp{\}.
+
+@item regexp
+The value must be a string which is a valid regular expression.
+
+@item 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.
+
+@item file
+The value must be a file name, and you can do completion with
+@kbd{M-@key{TAB}}.
+
+@item (file :must-match t)
+The value must be a file name for an existing file, and you can do
+completion with @kbd{M-@key{TAB}}.
+
+@item directory
+The value must be a directory name, and you can do completion with
+@kbd{M-@key{TAB}}.
+
+@item symbol
+The value must be a symbol.  It appears in the customization buffer as
+the name of the symbol.
+
+@item function
+The value must be either a lambda expression or a function name.  When
+it is a function name, you can do completion with @kbd{M-@key{TAB}}.
+
+@item variable
+The value must be a variable name, and you can do completion with
+@kbd{M-@key{TAB}}.
+
+@item boolean
+The value is boolean---either @code{nil} or @code{t}.
+@end table
+
+@node Composite Types
+@subsection Composite Types
+
+  When none of the simple types is appropriate, you can use composite
+types, which build from simple types.  Here are several ways of doing
+that:
+
+@table @code
+@item (restricted-sexp :match-alternatives @var{criteria})
+The value may be any Lisp object that satisfies one of @var{criteria}.
+@var{criteria} should be a list, and each elements should be
+one of these possibilities:
+
+@itemize @bullet
+@item
+A predicate---that is, a function of one argument that returns non-@code{nil}
+if the argument fits a certain type.  This means that objects of that type
+are acceptable.
+
+@item
+A quoted constant---that is, @code{'@var{object}}.  This means that
+@var{object} is an acceptable value.
+@end itemize
+
+For example,
+
+@example
+(restricted-sexp :match-alternatives (integerp 't 'nil))
+@end example
+
+@noindent
+allows integers, @code{t} and @code{nil} as legitimate values.
+
+The customization buffer shows all legitimate values using their read
+syntax, and the user edits them textually.
+
+@item (cons @var{car-type} @var{cdr-type})
+The value must be a cons cell, its @sc{car} must fit @var{car-type}, and
+its @sc{cdr} must fit @var{cdr-type}.  For example, @code{(const string
+symbol)} is a customization type which matches values such as
+@code{("foo" . foo)}.
+
+In the customization buffeer, the @sc{car} and the @sc{cdr} are
+displayed and edited separately, each according to the type
+that you specify for it.
+
+@item (list @var{element-types}@dots{})
+The value must be a list with exactly as many elements as the
+@var{element-types} you have specified; and each element must fit the
+corresponding @var{element-type}.
+
+For example, @code{(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 buffeer, the each element is displayed and edited
+separately, according to the type specified for it.
+
+@item (vector @var{element-types}@dots{})
+Like @code{list} except that the value must be a vector instead of a
+list.  The elements work the same as in @code{list}.
+
+@item (choice @var{alternative-types}...)
+The value must fit at least one of @var{alternative-types}.
+For example, @code{(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 @code{: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,
+
+@smallexample
+(choice (integer :tag "Number of spaces")
+        (string :tag "Literal text"))
+@end smallexample
+
+@noindent
+so that the menu offers @samp{Number of spaces} and @samp{Literal Text}.
+
+@item (const @var{value})
+The value must be @var{value}---nothing else is allowed.
+
+The main use of @code{const} is inside of @code{choice}.  For example,
+@code{(choice integer (const nil))} allows either an integer or
+@code{nil}.  @code{:tag} is often used with @code{const}.
+
+@item (function-item @var{function})
+Like @code{const}, but used for values which are functions.  This
+displays the documentation string of the function @var{function}
+as well as its name.
+
+@item (variable-item @var{variable})
+Like @code{const}, but used for values which are variable names.  This
+displays the documentation string of the variable @var{variable} as well
+as its name.
+
+@item (set @var{elements}@dots{})
+The value must be a list and each element of the list must be one of the
+@var{elements} specified.  This appears in the customization buffer as a
+checklist.
+
+@item (repeat @var{element-type})
+The value must be a list and each element of the list must fit the type
+@var{element-type}.  This appears in the customization buffer as a
+list of elements, with @samp{[INS]} and @samp{[DEL]} buttons for adding
+more elements or removing elements.
+@end table
+
+@node Splicing into Lists
+@subsection Splicing into Lists
+
+  The @code{:inline} feature lets you splice a variable number of
+elements into the middle of a list or vector.  You use it in a
+@code{set}, @code{choice} or @code{repeat} type which appears among the
+element-types of a @code{list} or @code{vector}.
+
+  Normally, each of the element-types in a @code{list} or @code{vector}
+describes one and only one element of the list or vector.  Thus, if an
+element-type is a @code{repeat}, that specifies a list of unspecified
+length which appears as one element.
+
+  But when the element-type uses @code{: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 @samp{,@@} in the backquote
+construct.
+
+  For example, to specify a list whose first element must be @code{t}
+and whose remaining arguments should be zero or more of @code{foo} and
+@code{bar}, use this customization type:
+
+@example
+(list (const t) (set :inline t foo bar))
+@end example
+
+@noindent
+This matches values such as @code{(t)}, @code{(t foo)}, @code{(t bar)}
+and @code{(t foo bar)}.
+
+  When the element-type is a @code{choice}, you use @code{:inline} not
+in the @code{choice} itself, but in (some of) the alternatives of the
+@code{choice}.  For example, to match a list which must start with a
+file name, followed either by the symbol @code{t} or two strings, use
+this customization type:
+
+@example
+(list file
+      (choice (const t)
+              (list :inline t string string)))
+@end example
+
+@noindent
+If the user chooses the first alternative in the choice, then the
+overall list has two elements and the second element is @code{t}.  If
+the user chooses the second alternative, then the overall list has three
+elements and the second and third must be strings.
+
+@node Type Keywords
+@subsection 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:
+
+@table @code
+@item :value @var{default}
+This is used for a type that appears as an alternative inside of
+@code{: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 @var{default}.
+
+@item :format @var{format-string}
+This string will be inserted in the buffer to represent the value
+corresponding to the type.  The following @samp{%} escapes are available
+for use in @var{format-string}:
+
+@table @samp
+@ignore
+@item %[@var{button}%]
+Display the text @var{button} marked as a button.  The @code{: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; but perhaps there is no need for one.
+@end ignore
+
+@item %@{@var{sample}%@}
+Show @var{sample} in a special face specified by @code{:sample-face}.
+
+@item %v
+Substitute the item's value.  How the value is represented depends on
+the kind of item, and (for variables) on the customization type.
+
+@item %d
+Substitute the item's documentation string.
+
+@item %h
+Like @samp{%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.
+
+@item %t
+Substitute the tag here.  You specify the tag with the @code{:tag}
+keyword.
+
+@item %%
+Display a literal @samp{%}. 
+@end table
+
+@item :button-face @var{face}
+Use face @var{face} for text displayed with @samp{%[@dots{}%]}.
+
+@item :button-prefix
+@itemx :button-suffix
+These specify the text to display before and after a button.
+Each can be:
+
+@table @asis
+@item @code{nil}
+No text is inserted.
+
+@item a string
+The string is inserted literally.
+
+@item a symbol
+The symbol's value is used.
+@end table
+
+@item :doc @var{doc}
+Use @var{doc} as the documentation string for this item.
+
+@item :tag @var{tag}
+Use @var{tag} (a string) as the tag for this item.
+
+@item :help-echo @var{motion-doc}
+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.
+
+@item :match @var{function}
+Specify how to decide whether a value matches the type.  @var{function}
+should be a function that accepts two arguments, a widget and a value;
+it should return non-@code{nil} if the value is acceptable.
+
+@ignore
+@item :indent @var{columns}
+Indent this item by @var{columns} columns.  The indentation is used for
+@samp{%n}, and automatically for group names, for checklists and radio
+buttons, and for editable lists.  It affects the whole of the
+item except for the first line.
+
+@item :offset @var{columns}
+An integer indicating how many extra spaces to indent the subitems of
+this item.  By default, subitems are indented the same as their parent.
+
+@item :extra-offset
+An integer indicating how many extra spaces to add to this item's
+indentation, compared to its parent.
+
+@item :notify
+A function called each time the item or a subitem is changed.  The
+function is called with two or three arguments.  The first argument is
+the item itself, the second argument is the item that was changed, and
+the third argument is the event leading to the change, if any.
+
+@item :menu-tag
+Tag used in the menu when the widget is used as an option in a
+@code{menu-choice} widget.
+
+@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.
+
+@item :validate
+A function which takes a widget as an argument, and return nil if the
+widgets current value is valid for the widget.  Otherwise, it should
+return the widget containing the invalid data, and set that widgets
+@code{:error} property to a string explaining the error.
+
+You can use the function @code{widget-children-validate} for this job;
+it tests that all children of @var{widget} are valid.
+
+@item :tab-order
+Specify the order in which widgets are traversed with
+@code{widget-forward} or @code{widget-backward}.  This is only partially
+implemented.
+
+@enumerate a
+@item
+Widgets with tabbing order @code{-1} are ignored.
+
+@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.
+
+@item
+When on a widget with no tabbing order specified, go to the next widget
+in the buffer with a positive tabbing order, or @code{nil}
+@end enumerate
+
+@item :parent
+The parent of a nested widget (e.g. a @code{menu-choice} item or an
+element of a @code{editable-list} widget).
+
+@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
+arguments, which will be used when creating the @code{radio-button} or
+@code{checkbox} associated with this item.
+@end ignore
+@end table
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lispref/nonascii.texi	Sat Feb 28 01:49:58 1998 +0000
@@ -0,0 +1,691 @@
+@c -*-texinfo-*-
+@c This is part of the GNU Emacs Lisp Reference Manual.
+@c Copyright (C) 1998 Free Software Foundation, Inc. 
+@c See the file elisp.texi for copying conditions.
+@setfilename ../info/characters
+@node Non-ASCII Characters, Searching and Matching, Text, Top
+@chapter Non-ASCII Characters
+@cindex multibyte characters
+@cindex non-ASCII characters
+
+  This chapter covers the special issues relating to non-@sc{ASCII}
+characters and how they are stored in strings and buffers.
+
+@menu
+* Text Representations::
+* Converting Representations::
+* Selecting a Representation::
+* Character Codes::
+* Character Sets::
+* Scanning Charsets::
+* Chars and Bytes::
+* Coding Systems::
+* Default Coding Systems::
+* Specifying Coding Systems::
+* Explicit Encoding::
+@end menu
+
+@node Text Representations
+@section Text Representations
+@cindex text representations
+
+  Emacs has two @dfn{text representations}---two ways to represent text
+in a string or buffer.  These are called @dfn{unibyte} and
+@dfn{multibyte}.  Each string, and each buffer, uses one of these two
+representations.  For most purposes, you can ignore the issue of
+representations, because Emacs converts text between them as
+appropriate.  Occasionally in Lisp programming you will need to pay
+attention to the difference.
+
+@cindex unibyte text
+  In unibyte representation, each character occupies one byte and
+therefore the possible character codes range from 0 to 255.  Codes 0
+through 127 are @sc{ASCII} characters; the codes from 128 through 255
+are used for one non-@sc{ASCII} character set (you can choose which one
+by setting the variable @code{nonascii-insert-offset}).
+
+@cindex leading code
+@cindex multibyte text
+  In multibyte representation, a character may occupy more than one
+byte, and as a result, the full range of Emacs character codes can be
+stored.  The first byte of a multibyte character is always in the range
+128 through 159 (octal 0200 through 0237).  These values are called
+@dfn{leading codes}.  The first byte determines which character set the
+character belongs to (@pxref{Character Sets}); in particular, it
+determines how many bytes long the sequence is.  The second and
+subsequent bytes of a multibyte character are always in the range 160
+through 255 (octal 0240 through 0377).
+
+  In a buffer, the buffer-local value of the variable
+@code{enable-multibyte-characters} specifies the representation used.
+The representation for a string is determined based on the string
+contents when the string is constructed.
+
+@tindex enable-multibyte-characters
+@defvar enable-multibyte-characters
+This variable specifies the current buffer's text representation.
+If it is non-@code{nil}, the buffer contains multibyte text; otherwise,
+it contains unibyte text.
+
+@strong{Warning:} do not set this variable directly; instead, use the
+function @code{set-buffer-multibyte} to change a buffer's
+representation.
+@end defvar
+
+@tindex default-enable-multibyte-characters
+@defvar default-enable-multibyte-characters
+This variable`s value is entirely equivalent to @code{(default-value
+'enable-multibyte-characters)}, and setting this variable changes that
+default value.  Although setting the local binding of
+@code{enable-multibyte-characters} in a specific buffer is dangerous,
+changing the default value is safe, and it is a reasonable thing to do.
+
+The @samp{--unibyte} command line option does its job by setting the
+default value to @code{nil} early in startup.
+@end defvar
+
+@tindex multibyte-string-p
+@defun multibyte-string-p string
+Return @code{t} if @var{string} contains multibyte characters.
+@end defun
+
+@node Converting Representations
+@section Converting Text Representations
+
+  Emacs can convert unibyte text to multibyte; it can also convert
+multibyte text to unibyte, though this conversion loses information.  In
+general these conversions happen when inserting text into a buffer, or
+when putting text from several strings together in one string.  You can
+also explicitly convert a string's contents to either representation.
+
+  Emacs chooses the representation for a string based on the text that
+it is constructed from.  The general rule is to convert unibyte text to
+multibyte text when combining it with other multibyte text, because the
+multibyte representation is more general and can hold whatever
+characters the unibyte text has.
+
+  When inserting text into a buffer, Emacs converts the text to the
+buffer's representation, as specified by
+@code{enable-multibyte-characters} in that buffer.  In particular, when
+you insert multibyte text into a unibyte buffer, Emacs converts the text
+to unibyte, even though this conversion cannot in general preserve all
+the characters that might be in the multibyte text.  The other natural
+alternative, to convert the buffer contents to multibyte, is not
+acceptable because the buffer's representation is a choice made by the
+user that cannot simply be overrided.
+
+  Converting unibyte text to multibyte text leaves @sc{ASCII} characters
+unchanged.  It converts the non-@sc{ASCII} codes 128 through 255 by
+adding the value @code{nonascii-insert-offset} to each character code.
+By setting this variable, you specify which character set the unibyte
+characters correspond to.  For example, if @code{nonascii-insert-offset}
+is 2048, which is @code{(- (make-char 'latin-iso8859-1 0) 128)}, then
+the unibyte non-@sc{ASCII} characters correspond to Latin 1.  If it is
+2688, which is @code{(- (make-char 'greek-iso8859-7 0) 128)}, then they
+correspond to Greek letters.
+
+  Converting multibyte text to unibyte is simpler: it performs
+logical-and of each character code with 255.  If
+@code{nonascii-insert-offset} has a reasonable value, corresponding to
+the beginning of some character set, this conversion is the inverse of
+the other: converting unibyte text to multibyte and back to unibyte
+reproduces the original unibyte text.
+
+@tindex nonascii-insert-offset
+@defvar nonascii-insert-offset
+This variable specifies the amount to add to a non-@sc{ASCII} character
+when converting unibyte text to multibyte.  It also applies when
+@code{insert-char} or @code{self-insert-command} inserts a character in
+the unibyte non-@sc{ASCII} range, 128 through 255.
+
+The right value to use to select character set @var{cs} is @code{(-
+(make-char @var{cs} 0) 128)}.  If the value of
+@code{nonascii-insert-offset} is zero, then conversion actually uses the
+value for the Latin 1 character set, rather than zero.
+@end defvar
+
+@tindex nonascii-translate-table
+@defvar nonascii-translate-table
+This variable provides a more general alternative to
+@code{nonascii-insert-offset}.  You can use it to specify independently
+how to translate each code in the range of 128 through 255 into a
+multibyte character.  The value should be a vector, or @code{nil}.
+@end defvar
+
+@tindex string-make-unibyte
+@defun string-make-unibyte string
+This function converts the text of @var{string} to unibyte
+representation, if it isn't already, and return the result.  If
+conversion does not change the contents, the value may be @var{string}
+itself.
+@end defun
+
+@tindex string-make-multibyte
+@defun string-make-multibyte string
+This function converts the text of @var{string} to multibyte
+representation, if it isn't already, and return the result.  If
+conversion does not change the contents, the value may be @var{string}
+itself.
+@end defun
+
+@node Selecting a Representation
+@section Selecting a Representation
+
+  Sometimes it is useful to examine an existing buffer or string as
+multibyte when it was unibyte, or vice versa.
+
+@tindex set-buffer-multibyte
+@defun set-buffer-multibyte multibyte
+Set the representation type of the current buffer.  If @var{multibyte}
+is non-@code{nil}, the buffer becomes multibyte.  If @var{multibyte}
+is @code{nil}, the buffer becomes unibyte.
+
+This function leaves the buffer contents unchanged when viewed as a
+sequence of bytes.  As a consequence, it can change the contents viewed
+as characters; a sequence of two bytes which is treated as one character
+in multibyte representation will count as two characters in unibyte
+representation.
+
+This function sets @code{enable-multibyte-characters} to record which
+representation is in use.  It also adjusts various data in the buffer
+(including its overlays, text properties and markers) so that they
+cover or fall between the same text as they did before.
+@end defun
+
+@tindex string-as-unibyte
+@defun string-as-unibyte string
+This function returns a string with the same bytes as @var{string} but
+treating each byte as a character.  This means that the value may have
+more characters than @var{string} has.
+
+If @var{string} is unibyte already, then the value may be @var{string}
+itself.
+@end defun
+
+@tindex string-as-multibyte
+@defun string-as-multibyte string
+This function returns a string with the same bytes as @var{string} but
+treating each multibyte sequence as one character.  This means that the
+value may have fewer characters than @var{string} has.
+
+If @var{string} is multibyte already, then the value may be @var{string}
+itself.
+@end defun
+
+@node Character Codes
+@section Character Codes
+@cindex character codes
+
+  The unibyte and multibyte text representations use different character
+codes.  The valid character codes for unibyte representation range from
+0 to 255---the values that can fit in one byte.  The valid character
+codes for multibyte representation range from 0 to 524287, but not all
+values in that range are valid.  In particular, the values 128 through
+255 are not valid in multibyte text.  Only the @sc{ASCII} codes 0
+through 127 are used in both representations.
+
+@defun char-valid-p charcode
+This returns @code{t} if @var{charcode} is valid for either one of the two
+text representations.
+
+@example
+(char-valid-p 65)
+     @result{} t
+(char-valid-p 256)
+     @result{} nil
+(char-valid-p 2248)
+     @result{} t
+@end example
+@end defun
+
+@node Character Sets
+@section Character Sets
+@cindex character sets
+
+  Emacs classifies characters into various @dfn{character sets}, each of
+which has a name which is a symbol.  Each character belongs to one and
+only one character set.
+
+  In general, there is one character set for each distinct script.  For
+example, @code{latin-iso8859-1} is one character set,
+@code{greek-iso8859-7} is another, and @code{ascii} is another.  An
+Emacs character set can hold at most 9025 characters; therefore. in some
+cases, a set of characters that would logically be grouped together are
+split into several character sets.  For example, one set of Chinese
+characters is divided into eight Emacs character sets,
+@code{chinese-cns11643-1} through @code{chinese-cns11643-7}.
+
+@tindex charsetp
+@defun charsetp object
+Return @code{t} if @var{object} is a character set name symbol,
+@code{nil} otherwise.
+@end defun
+
+@tindex charset-list
+@defun charset-list
+This function returns a list of all defined character set names.
+@end defun
+
+@tindex char-charset
+@defun char-charset character
+This function returns the the name of the character
+set that @var{character} belongs to.
+@end defun
+
+@node Scanning Charsets
+@section Scanning for Character Sets
+
+  Sometimes it is useful to find out which character sets appear in a
+part of a buffer or a string.  One use for this is in determining which
+coding systems (@pxref{Coding Systems}) are capable of representing all
+of the text in question.
+
+@tindex find-charset-region
+@defun find-charset-region beg end &optional unification
+This function returns a list of the character sets
+that appear in the current buffer between positions @var{beg}
+and @var{end}.
+@end defun
+
+@tindex find-charset-string
+@defun find-charset-string string &optional unification
+This function returns a list of the character sets
+that appear in the string @var{string}.
+@end defun
+
+@node Chars and Bytes
+@section Characters and Bytes
+@cindex bytes and characters
+
+  In multibyte representation, each character occupies one or more
+bytes.  The functions in this section convert between characters and the
+byte values used to represent them.
+
+@tindex char-bytes
+@defun char-bytes character
+This function returns the number of bytes used to represent the
+character @var{character}.  In most cases, this is the same as
+@code{(length (split-char @var{character}))}; the only exception is for
+ASCII characters, which use just one byte.
+
+@example
+(char-bytes 2248)
+     @result{} 2
+(char-bytes 65)
+     @result{} 1
+@end example
+
+This function's values are correct for both multibyte and unibyte
+representations, because the non-@sc{ASCII} character codes used in
+those two representations do not overlap.
+
+@example
+(char-bytes 192)
+     @result{} 1
+@end example
+@end defun
+
+@tindex split-char
+@defun split-char character
+Return a list containing the name of the character set of
+@var{character}, followed by one or two byte-values which identify
+@var{character} within that character set.
+
+@example
+(split-char 2248)
+     @result{} (latin-iso8859-1 72)
+(split-char 65)
+     @result{} (ascii 65)
+@end example
+
+Unibyte non-@sc{ASCII} characters are considered as part of
+the @code{ascii} character set:
+
+@example
+(split-char 192)
+     @result{} (ascii 192)
+@end example
+@end defun
+
+@tindex make-char
+@defun make-char charset &rest byte-values
+Thus function returns the character in character set @var{charset}
+identified by @var{byte-values}.  This is roughly the opposite of
+split-char.
+
+@example
+(make-char 'latin-iso8859-1 72)
+     @result{} 2248
+@end example
+@end defun
+
+@node Coding Systems
+@section Coding Systems
+
+@cindex coding system
+  When Emacs reads or writes a file, and when Emacs sends text to a
+subprocess or receives text from a subprocess, it normally performs
+character code conversion and end-of-line conversion as specified
+by a particular @dfn{coding system}.
+
+@cindex character code conversion
+  @dfn{Character code conversion} involves conversion between the encoding
+used inside Emacs and some other encoding.  Emacs supports many
+different encodings, in that it can convert to and from them.  For
+example, it can convert text to or from encodings such as Latin 1, Latin
+2, Latin 3, Latin 4, Latin 5, and several variants of ISO 2022.  In some
+cases, Emacs supports several alternative encodings for the same
+characters; for example, there are three coding systems for the Cyrillic
+(Russian) alphabet: ISO, Alternativnyj, and KOI8.
+
+@cindex end of line conversion
+  @dfn{End of line conversion} handles three different conventions used
+on various systems for end of line.  The Unix convention is to use the
+linefeed character (also called newline).  The DOS convention is to use
+the two character sequence, carriage-return linefeed, at the end of a
+line.  The Mac convention is to use just carriage-return.
+
+  Most coding systems specify a particular character code for
+conversion, but some of them leave this unspecified---to be chosen
+heuristically based on the data.
+
+@cindex base coding system
+@cindex variant coding system
+  @dfn{Base coding systems} such as @code{latin-1} leave the end-of-line
+conversion unspecified, to be chosen based on the data.  @dfn{Variant
+coding systems} such as @code{latin-1-unix}, @code{latin-1-dos} and
+@code{latin-1-mac} specify the end-of-line conversion explicitly as
+well.  Each base coding system has three corresponding variants whose
+names are formed by adding @samp{-unix}, @samp{-dos} and @samp{-mac}.
+
+  Here are Lisp facilities for working with coding systems;
+
+@tindex coding-system-list
+@defun coding-system-list &optional base-only
+This function returns a list of all coding system names (symbols).  If
+@var{base-only} is non-@code{nil}, the value includes only the
+base coding systems.  Otherwise, it includes variant coding systems as well.
+@end defun
+
+@tindex coding-system-p
+@defun coding-system-p object
+This function returns @code{t} if @var{object} is a coding system
+name.
+@end defun
+
+@tindex check-coding-system
+@defun check-coding-system coding-system
+This function checks the validity of @var{coding-system}.
+If that is valid, it returns @var{coding-system}.
+Otherwise it signals an error with condition @code{coding-system-error}.
+@end defun
+
+@tindex detect-coding-region
+@defun detect-coding-region start end highest
+This function chooses a plausible coding system for decoding the text
+from @var{start} to @var{end}.  This text should be ``raw bytes''
+(@pxref{Specifying Coding Systems}).
+
+Normally this function returns is a list of coding systems that could
+handle decoding the text that was scanned.  They are listed in order of
+decreasing priority, based on the priority specified by the user with
+@code{prefer-coding-system}.  But if @var{highest} is non-@code{nil},
+then the return value is just one coding system, the one that is highest
+in priority.
+@end defun
+
+@tindex detect-coding-string string highest
+@defun detect-coding-string
+This function is like @code{detect-coding-region} except that it
+operates on the contents of @var{string} instead of bytes in the buffer.
+@end defun
+
+@defun find-operation-coding-system operation &rest arguments
+This function returns the coding system to use (by default) for
+performing @var{operation} with @var{arguments}.  The value has this
+form:
+
+@example
+(@var{decoding-system} @var{encoding-system})
+@end example
+
+The first element, @var{decoding-system}, is the coding system to use
+for decoding (in case @var{operation} does decoding), and
+@var{encoding-system} is the coding system for encoding (in case
+@var{operation} does encoding).
+
+The argument @var{operation} should be an Emacs I/O primitive:
+@code{insert-file-contents}, @code{write-region}, @code{call-process},
+@code{call-process-region}, @code{start-process}, or
+@code{open-network-stream}.
+
+The remaining arguments should be the same arguments that might be given
+to that I/O primitive.  Depending on which primitive, one of those
+arguments is selected as the @dfn{target}.  For example, if
+@var{operation} does file I/O, whichever argument specifies the file
+name is the target.  For subprocess primitives, the process name is the
+target.  For @code{open-network-stream}, the target is the service name
+or port number.
+
+This function looks up the target in @code{file-coding-system-alist},
+@code{process-coding-system-alist}, or
+@code{network-coding-system-alist}, depending on @var{operation}.
+@xref{Default Coding Systems}.
+@end defun
+
+@node Default Coding Systems
+@section Default Coding Systems
+
+  These variable specify which coding system to use by default for
+certain files or when running certain subprograms.  The idea of these
+variables is that you set them once and for all to the defaults you
+want, and then do not change them again.  To specify a particular coding
+system for a particular operation, don't change these variables;
+instead, override them using @code{coding-system-for-read} and
+@code{coding-system-for-write} (@pxref{Specifying Coding Systems}).
+
+@tindex file-coding-system-alist
+@defvar file-coding-system-alist
+This variable is an alist that specifies the coding systems to use for
+reading and writing particular files.  Each element has the form
+@code{(@var{pattern} . @var{coding})}, where @var{pattern} is a regular
+expression that matches certain file names.  The element applies to file
+names that match @var{pattern}.
+
+The @sc{cdr} of the element, @var{val}, should be either a coding
+system, a cons cell containing two coding systems, or a function symbol.
+If @var{val} is a coding system, that coding system is used for both
+reading the file and writing it.  If @var{val} is a cons cell containing
+two coding systems, its @sc{car} specifies the coding system for
+decoding, and its @sc{cdr} specifies the coding system for encoding.
+
+If @var{val} is a function symbol, the function must return a coding
+system or a cons cell containing two coding systems.  This value is used
+as described above.
+@end defvar
+
+@tindex process-coding-system-alist
+@defvar process-coding-system-alist
+This variable is an alist specifying which coding systems to use for a
+subprocess, depending on which program is running in the subprocess.  It
+works like @code{file-coding-system-alist}, except that @var{pattern} is
+matched against the program name used to start the subprocess.  The coding
+system or systems specified in this alist are used to initialize the
+coding systems used for I/O to the subprocess, but you can specify
+other coding systems later using @code{set-process-coding-system}.
+@end defvar
+
+@tindex network-coding-system-alist
+@defvar network-coding-system-alist
+This variable is an alist that specifies the coding system to use for
+network streams.  It works much like @code{file-coding-system-alist},
+with the difference that the @var{pattern} in an elemetn may be either a
+port number or a regular expression.  If it is a regular expression, it
+is matched against the network service name used to open the network
+stream.
+@end defvar
+
+@tindex default-process-coding-system
+@defvar default-process-coding-system
+This variable specifies the coding systems to use for subprocess (and
+network stream) input and output, when nothing else specifies what to
+do.
+
+The value should be a cons cell of the form @code{(@var{output-coding}
+. @var{input-coding})}.  Here @var{output-coding} applies to output to
+the subprocess, and @var{input-coding} applies to input from it.
+@end defvar
+
+@node Specifying Coding Systems
+@section Specifying a Coding System for One Operation
+
+  You can specify the coding system for a specific operation by binding
+the variables @code{coding-system-for-read} and/or
+@code{coding-system-for-write}.
+
+@tindex coding-system-for-read
+@defvar coding-system-for-read
+If this variable is non-@code{nil}, it specifies the coding system to
+use for reading a file, or for input from a synchronous subprocess.
+
+It also applies to any asynchronous subprocess or network stream, but in
+a different way: the value of @code{coding-system-for-read} when you
+start the subprocess or open the network stream specifies the input
+decoding method for that subprocess or network stream.  It remains in
+use for that subprocess or network stream unless and until overridden.
+
+The right way to use this variable is to bind it with @code{let} for a
+specific I/O operation.  Its global value is normally @code{nil}, and
+you should not globally set it to any other value.  Here is an example
+of the right way to use the variable:
+
+@example
+;; @r{Read the file with no character code conversion.}
+;; @r{Assume CRLF represents end-of-line.}
+(let ((coding-system-for-write 'emacs-mule-dos))
+  (insert-file-contents filename))
+@end example
+
+When its value is non-@code{nil}, @code{coding-system-for-read} takes
+precedence all other methods of specifying a coding system to use for
+input, including @code{file-coding-system-alist},
+@code{process-coding-system-alist} and
+@code{network-coding-system-alist}.
+@end defvar
+
+@tindex coding-system-for-write
+@defvar coding-system-for-write
+This works much like @code{coding-system-for-read}, except that it
+applies to output rather than input.  It affects writing to files,
+subprocesses, and net connections.
+
+When a single operation does both input and output, as do
+@code{call-process-region} and @code{start-process}, both
+@code{coding-system-for-read} and @code{coding-system-for-write}
+affect it.
+@end defvar
+
+@tindex last-coding-system-used
+@defvar last-coding-system-used
+All operations that use a coding system set this variable
+to the coding system name that was used.
+@end defvar
+
+@tindex inhibit-eol-conversion
+@defvar inhibit-eol-conversion
+When this variable is non-@code{nil}, no end-of-line conversion is done,
+no matter which coding system is specified.  This applies to all the
+Emacs I/O and subprocess primitives, and to the explicit encoding and
+decoding functions (@pxref{Explicit Encoding}).
+@end defvar
+
+@tindex keyboard-coding-system
+@defun keyboard-coding-system
+This function returns the coding system that is in use for decoding
+keyboard input---or @code{nil} if no coding system is to be used.
+@end defun
+
+@tindex set-keyboard-coding-system
+@defun set-keyboard-coding-system coding-system
+This function specifies @var{coding-system} as the coding system to
+use for decoding keyboard input.  If @var{coding-system} is @code{nil},
+that means do not decode keyboard input.
+@end defun
+
+@tindex terminal-coding-system
+@defun terminal-coding-system
+This function returns the coding system that is in use for encoding
+terminal output---or @code{nil} for no encoding.
+@end defun
+
+@tindex set-terminal-coding-system
+@defun set-terminal-coding-system coding-system
+This function specifies @var{coding-system} as the coding system to use
+for encoding terminal output.  If @var{coding-system} is @code{nil},
+that means do not encode terminal output.
+@end defun
+
+  See also the functions @code{process-coding-system} and
+@code{set-process-coding-system}.  @xref{Process Information}.
+
+  See also @code{read-coding-system} in @ref{High-Level Completion}.
+
+@node Explicit Encoding
+@section Explicit Encoding and Decoding
+@cindex encoding text
+@cindex decoding text
+
+  All the operations that transfer text in and out of Emacs have the
+ability to use a coding system to encode or decode the text.
+You can also explicitly encode and decode text using the functions
+in this section.
+
+@cindex raw bytes
+  The result of encoding, and the input to decoding, are not ordinary
+text.  They are ``raw bytes''---bytes that represent text in the same
+way that an external file would.  When a buffer contains raw bytes, it
+is most natural to mark that buffer as using unibyte representation,
+using @code{set-buffer-multibyte} (@pxref{Selecting a Representation}),
+but this is not required.
+
+  The usual way to get raw bytes in a buffer, for explicit decoding, is
+to read them with from a file with @code{insert-file-contents-literally}
+(@pxref{Reading from Files}) or specify a non-@code{nil} @var{rawfile}
+arguments when visiting a file with @code{find-file-noselect}.
+
+  The usual way to use the raw bytes that result from explicitly
+encoding text is to copy them to a file or process---for example, to
+write it with @code{write-region} (@pxref{Writing to Files}), and
+suppress encoding for that @code{write-region} call by binding
+@code{coding-system-for-write} to @code{no-conversion}.
+
+@tindex encode-coding-region
+@defun encode-coding-region start end coding-system
+This function encodes the text from @var{start} to @var{end} according
+to coding system @var{coding-system}.  The encoded text replaces
+the original text in the buffer.  The result of encoding is
+``raw bytes.''
+@end defun
+
+@tindex encode-coding-string
+@defun encode-coding-string string coding-system
+This function encodes the text in @var{string} according to coding
+system @var{coding-system}.  It returns a new string containing the
+encoded text.  The result of encoding is ``raw bytes.''
+@end defun
+
+@tindex decode-coding-region
+@defun decode-coding-region start end coding-system
+This function decodes the text from @var{start} to @var{end} according
+to coding system @var{coding-system}.  The decoded text replaces the
+original text in the buffer.  To make explicit decoding useful, the text
+before decoding ought to be ``raw bytes.''
+@end defun
+
+@tindex decode-coding-string
+@defun decode-coding-string string coding-system
+This function decodes the text in @var{string} according to coding
+system @var{coding-system}.  It returns a new string containing the
+decoded text.  To make explicit decoding useful, the contents of
+@var{string} ought to be ``raw bytes.''
+@end defun