aboutsummaryrefslogtreecommitdiffhomepage
path: root/contrib
diff options
context:
space:
mode:
authorGravatar David Aspinall <da@inf.ed.ac.uk>2010-08-27 11:25:10 +0000
committerGravatar David Aspinall <da@inf.ed.ac.uk>2010-08-27 11:25:10 +0000
commit8c55c79574c3078489f98bd8300241b57e9fc33b (patch)
tree864669ad0d121c37a049be1610a6e6ad2b04fb1a /contrib
parent48f5bcabe1e475984a485adfab569358da11e42f (diff)
Renamed file contrib/mmm/mmm.texinfo, formerly mmm/mmm.texinfo
Diffstat (limited to 'contrib')
-rw-r--r--contrib/mmm/mmm.texinfo2117
1 files changed, 2117 insertions, 0 deletions
diff --git a/contrib/mmm/mmm.texinfo b/contrib/mmm/mmm.texinfo
new file mode 100644
index 00000000..aa0b0eaf
--- /dev/null
+++ b/contrib/mmm/mmm.texinfo
@@ -0,0 +1,2117 @@
+\input texinfo
+@c %**start of header
+@setfilename mmm.info
+@settitle MMM Mode Manual
+@c %**end of header
+@syncodeindex vr fn
+@set MASON_VERSION 0.896
+
+@dircategory GNU Emacs Lisp
+@direntry
+* MMM-Mode: (mmm). Multiple Major Modes for Emacs
+@end direntry
+
+@include version.texi
+
+@ifinfo
+This is edition @value{EDITION} of the MMM Mode Manual, last updated
+@value{UPDATED}. It documents version @value{VERSION} of MMM Mode.
+
+Copyright 2000 Michael Abraham Shulman.
+
+Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries a copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+
+@end ignore
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+sections entitled ``Copying'' and ``GNU General Public License'' are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation
+approved by the Free Software Foundation.
+
+@end ifinfo
+
+@titlepage
+@title MMM Mode Manual
+@subtitle Multiple Major Modes for Emacs
+@subtitle Edition @value{EDITION}
+@subtitle @value{UPDATED}
+@author Michael Abraham Shulman
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} 2000 Michael Abraham Shulman.
+
+Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+sections entitled ``Copying'' and ``GNU General Public License'' are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation
+approved by the Free Software Foundation.
+
+@end titlepage
+
+@ifinfo
+@node Top, Overview, (dir), (dir)
+@top MMM Mode
+
+MMM Mode is a minor mode for Emacs which allows Multiple Major Modes to
+coexist in a single buffer.
+
+This is edition @value{EDITION} of the MMM Mode Manual, last updated
+@value{UPDATED}, which documents version @value{VERSION} of MMM Mode.
+
+@end ifinfo
+
+@menu
+* Overview:: An overview and introduction to MMM Mode.
+* Basics:: The basics of how to use it.
+* Customizing:: Customizing how it works to your needs.
+* Supplied Classes:: The supplied submode classes.
+* Writing Classes:: Writing your own submode classes.
+* Indices:: Just that.
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Overview of MMM Mode
+
+* Basic Concepts:: A simple explanation of how it works.
+* Installation:: How to install MMM Mode.
+* Quick Start:: Getting started using MMM Mode quickly.
+
+MMM Mode Basics
+
+* MMM Minor Mode:: The Emacs minor mode that manages it all.
+* Submode Classes:: What they are and how to use them.
+* Selecting Classes:: How MMM Mode knows what classes to use.
+* Insertion:: Inserting new submode regions automatically.
+* Re-parsing:: Re-scanning for submode regions.
+* Interactive:: Adding submode regions manually.
+* Global Mode:: Turning MMM Mode on automatically.
+
+The MMM Minor Mode
+
+* Enabling MMM Mode:: Turning MMM Mode on and off.
+* MMM Mode Keys:: Default key bindings in MMM Mode.
+
+How MMM Mode selects submode classes
+
+* File Classes:: Classes for a single file.
+* Mode-Ext Classes:: Classes for a given mode or extension.
+* Global Classes:: Classes for all MMM Mode buffers.
+
+MMM Global Mode
+
+* Major Mode Hook:: Using MMM's Major Mode Hook
+
+Customizing MMM Mode
+
+* Region Coloring:: Changing or removing background colors.
+* Preferred Modes:: Choosing which major modes to use.
+* Mode Line:: What is displayed in the mode line.
+* Key Bindings:: Customizing the MMM Mode key bindings.
+* Local Variables:: What local variables are saved for submodes.
+* Changing Classes:: Changing the supplied submode classes.
+* Hooks:: How to make MMM Mode run your code.
+
+Supplied Submode Classes
+
+* Mason:: Mason server-side Perl in HTML.
+* File Variables:: Elisp code in File Variables.
+* Here-documents:: Code in shell and Perl here-documents.
+* Javascript:: Javascript embedded in HTML.
+* Embedded CSS:: CSS Styles embedded in HTML.
+* Embperl:: Another syntax for Perl in HTML.
+* ePerl:: A general Perl-embedding syntax.
+* JSP:: Java code embedded in HTML.
+* RPM:: Shell scripts in RPM Spec Files.
+* Noweb:: Noweb literate programs.
+
+Writing Submode Classes
+
+* Basic Classes:: Writing a simple submode class.
+* Paired Delimiters:: Matching paired delimiters.
+* Region Placement:: Placing the region more accurately.
+* Submode Groups:: Grouping several classes together.
+* Calculated Submodes:: Deciding the submode at run-time.
+* Calculated Faces:: Deciding the display face at run-time.
+* Insertion Commands:: Inserting regions automatically.
+* Region Names:: Naming regions for syntax grouping.
+* Other Hooks:: Running code at arbitrary points.
+* Delimiters:: Controlling delimiter overlays.
+* Misc Keywords:: Other miscellaneous options.
+
+Indices
+
+* Concept Index:: Index of MMM Mode Concepts.
+* Function Index:: Index of functions and variables.
+* Keystroke Index:: Index of key bindings in MMM Mode.
+
+@end detailmenu
+@end menu
+
+@node Overview, Basics, Top, Top
+@comment node-name, next, previous, up
+@chapter Overview of MMM Mode
+@cindex overview of mmm-mode
+@cindex mmm-mode, overview of
+
+MMM Mode is a minor mode for Emacs which allows Multiple Major Modes to
+coexist in a single buffer. The name is an abbreviation of `Multiple
+Major Modes'@footnote{The name is derived from @file{mmm.el} for XEmacs
+by Gongquan Chen <chen@@posc.org>, from which MMM Mode was adapted.}. A
+major mode is a customization of Emacs for editing a certain type of
+text, such as code for a specific programming language. @xref{Major
+Modes, , , emacs, The Emacs Manual}, for details.
+
+MMM Mode is a general extension to Emacs which is useful whenever one
+file contains text in two or more programming languages, or that
+should be in two or more different modes. For example:
+
+@itemize @bullet
+@item
+CGI scripts written in any language, from Perl to PL/SQL, may want to
+output verbatim HTML, and the writer of such scripts may want to use
+Emacs' html-mode or sgml-mode to edit this HTML code, while remaining
+in the appropriate programming language mode for the rest of the
+file. @xref{Here-documents}, for example.
+
+@item
+There are now many ``content delivery systems'' which turn the CGI
+script idea around and simply add extra commands to an HTML file,
+often in some programming language, which are interpreted on the
+server. @xref{Mason}, @xref{Embperl}, @xref{ePerl}, @xref{JSP}.
+
+@item
+HTML itself can also contain embedded languages such as Javascript and
+CSS styles, for which Emacs has different major modes.
+@xref{Javascript}, and @xref{Embedded CSS}, for example.
+
+@item
+The idea of ``literate programming'' requires the same file to contain
+documentation (written as text, html, latex, etc.) and code (in an
+appropriate programming language). @xref{Noweb}, for example.
+
+@item
+Emacs allows files of any type to contain `local variables', which can
+include Emacs Lisp code to be evaluated. @xref{File Variables, , ,
+emacs, The Emacs Manual}. It may be easier to edit this code in Emacs
+Lisp mode than in whatever mode is used for the rest of the file.
+@xref{File Variables}.
+
+@item
+There are many more possible uses for MMM Mode. RPM spec files can
+contain shell scripts (@pxref{RPM}). Email or newsgroup messages may
+contain sample code. And so on. We encourage you to experiment.
+@end itemize
+
+@menu
+* Basic Concepts:: A simple explanation of how it works.
+* Installation:: How to install MMM Mode.
+* Quick Start:: Getting started using MMM Mode quickly.
+@end menu
+
+@node Basic Concepts, Installation, Overview, Overview
+@comment node-name, next, previous, up
+@section Basic Concepts
+@cindex dominant major mode
+@cindex major mode, dominant
+@cindex default major mode
+@cindex major mode, default
+@cindex submode regions
+@cindex regions, submode
+@cindex overlays, submode
+@cindex submode overlays
+@cindex mmm-ification
+
+The way MMM Mode works is as follows. Each buffer has a @dfn{dominant}
+or @dfn{default} major mode, which is chosen as major modes normally
+are: the user can set it interactively, or it can be chosen
+automatically with `auto-mode-alist' (@pxref{Choosing Modes, , , emacs,
+The Emacs Manual}). Within the file, MMM Mode creates @dfn{submode
+regions} within which other major modes are in effect. While the point
+is in a submode region, the following changes occur:
+
+@enumerate
+@item
+The local keymap is that of the submode. This means the key bindings for
+the submode are available, while those of the dominant mode are not.
+@item
+The mode line (@pxref{Mode Line, , , emacs, The Emacs Manual}) changes
+to show which submode region is active. This can be configured; see
+@ref{Mode Line}.
+@item
+The major mode menu, both on the menu bar and the mouse popup, are that
+of the submode.
+@item
+Some local variables of the submode shadow those of the default mode
+(@pxref{Local Variables}). For the user, this serves to help make Emacs
+behave as if the submode were the major mode.
+@item
+The syntax table and indentation are those of the submode.
+@item
+Font-lock (@pxref{Font Lock, , , emacs, The Emacs Manual}) fontifies
+correctly for the submode.
+@item
+The submode regions are highlighted by a background color; see
+@ref{Region Coloring}.
+
+@end enumerate
+
+The submode regions are represented internally by Emacs Lisp objects
+known as @dfn{overlays}. Some of the above are implemented by overlay
+properties, and others are updated by an MMM Mode function in
+`post-command-hook'. You don't need to know this to use MMM Mode, but it
+may make any error messages you come across more understandable.
+@xref{Overlays, , , elisp, The GNU Emacs Lisp Reference Manual}, for
+more information on overlays.
+
+Because overlays are not saved with a file, every time a file is opened,
+they must be created. Creating submode regions is occasionally referred
+to as @dfn{mmm-ification}. (I've never had occasion to pronounce this,
+but if I did I would probably say `mummification'. Like what they did in
+ancient Egypt.) You can mmm-ify a buffer interactively, but most often
+MMM Mode will find and create submode regions automatically based on a
+buffer's file extension, dominant mode, or local variables.
+
+
+@node Installation, Quick Start, Basic Concepts, Overview
+@comment node-name, next, previous, up
+@section Installing MMM Mode
+
+MMM Mode has a standard installation process. See the file INSTALL for
+generic information on this process. To summarize, unpack the archive,
+@command{cd} to the created MMM Mode directory, type @samp{./configure},
+then @samp{make}, then @samp{make install}. If all goes correctly, this
+will compile the MMM Mode elisp files, install them in your local
+site-lisp directory, and install the MMM Mode info file @file{mmm.info}
+in your local info directory.
+
+Now you need to configure your Emacs initialization file (usually
+@file{~/.emacs}) to use MMM Mode. First, Emacs has to know where to
+find MMM Mode. In other words, the MMM Mode directory has to be in
+@code{load-path}. This can be done in the parent directory's
+@file{subdirs.el} file, or in the init file with a line such as:
+
+@lisp
+(add-to-list 'load-path "/path/to/site-lisp/mmm/")
+@end lisp
+
+Once @code{load-path} is configured, MMM Mode must be loaded. You can
+load all of MMM Mode with the line
+
+@lisp
+(require 'mmm-mode)
+@end lisp
+
+@noindent
+but if you use MMM Mode only rarely, it may not be desirable to load all
+of it at the beginning of every editing session. You can load just
+enough of MMM Mode so it will turn itself on when necessary and load the
+rest of itself, by using instead the line
+
+@lisp
+(require 'mmm-auto)
+@end lisp
+
+@noindent
+in your initialization file.
+
+One more thing you may want to do right now is to set the variable
+@code{mmm-global-mode}. If this variable is @code{nil} (the default),
+MMM Mode will never turn itself on. If it is @code{t}, MMM Mode will
+turn itself on in every buffer. Probably the most useful value for it,
+however, is the symbol @code{maybe} (actually, anything that is not
+@code{nil} and not @code{t}), which causes MMM Mode to turn itself on in
+precisely those buffers where it would be useful. You can do this with
+a line such as:
+
+@lisp
+(setq mmm-global-mode 'maybe)
+@end lisp
+
+@noindent
+in your initialization file. @xref{Global Mode}, for more detailed
+information.
+
+
+@node Quick Start, , Installation, Overview
+@comment node-name, next, previous, up
+@section Getting Started Quickly
+
+Perhaps the simplest way to create submode regions is to do it
+interactively by specifying a region. First you must turn MMM Mode
+on---say, with @kbd{M-x mmm-mode}---then place point and mark around the
+area you want to make into a submode region, type @kbd{C-c % C-r}, and
+enter the desired major mode. @xref{Interactive}, for more details.
+
+A better way to add submode regions is by using submode classes, which
+store a lot of useful information for MMM Mode about how to add and
+manipulate the regions created. @xref{Submode Classes}, for more
+details. There are several sample submode classes that come with MMM
+Mode, which are documented later in this manual. Look through these and
+determine if one of them fits your needs. If so, I suggest reading the
+comments on that mode. Then come back here to find out to use it.
+
+To apply a submode class to a buffer interactively, turn MMM Mode on as
+above, then type @kbd{C-c % C-c} and enter the name of the class.
+Submode regions should be added automatically, if there are any regions
+in the buffer appropriate to the submode class.
+
+If you want a given file to always use a given submode class, you can
+express this in a file variable: add a line containing the string
+@samp{-*- mmm-classes: @var{class} -*-} at the top of the file.
+@xref{File Variables, , , emacs, The Emacs Manual}, for more information
+and other methods. Now whenever MMM Mode is turned on in that file, it
+will be mmm-ified according to @var{class}. If @code{mmm-global-mode} is
+non-nil, then MMM Mode will turn itself on whenever a file with a
+@code{mmm-classes} local variable is opened. @xref{Global Mode}, for more
+information.
+
+If you want a submode class to apply to @emph{all} files in a certain
+major mode or with a certain extension, add a line such as this to your
+initialization file:
+
+@lisp
+(mmm-add-mode-ext-class @var{mode} @var{extension} @var{class})
+@end lisp
+
+@noindent
+After this call, any file opened whose name matches the regular
+expression @var{extension} @emph{and} whose default mode is @var{mode}
+will be automatically mmm-ified according to @var{class} (assuming
+@code{mmm-global-mode} is non-nil). If one of @var{extension} or
+@var{mode} is @code{nil}, a file need only satisfy the other one to be
+mmm-ified.
+
+You can now read the rest of this manual to learn more about how MMM
+Mode works and how to configure it to your preferences. If none of the
+supplied submode classes fit your needs, then you can try to write your
+own. @xref{Writing Classes}, for more information.
+
+@node Basics, Customizing, Overview, Top
+@comment node-name, next, previous, up
+@chapter MMM Mode Basics
+
+This chapter explains the most important parts of how to use MMM Mode.
+
+@menu
+* MMM Minor Mode:: The Emacs minor mode that manages it all.
+* Submode Classes:: What they are and how to use them.
+* Selecting Classes:: How MMM Mode knows what classes to use.
+* Insertion:: Inserting new submode regions automatically.
+* Re-parsing:: Re-scanning for submode regions.
+* Interactive:: Adding submode regions manually.
+* Global Mode:: Turning MMM Mode on automatically.
+@end menu
+
+@node MMM Minor Mode, Submode Classes, Basics, Basics
+@comment node-name, next, previous, up
+@section The MMM Minor Mode
+@cindex mode, mmm minor
+@cindex minor mode, mmm
+@cindex mmm minor mode
+
+An Emacs minor mode is an optional feature which can be turned on or off
+in a given buffer, independently of the major mode. @xref{Minor Modes, ,
+, emacs, The Emacs Manual}. MMM Mode is implemented as a minor mode
+which manages the submode regions. This minor mode must be turned on in
+a buffer for submode regions to be effective. When activated, the MMM
+Minor mode is denoted by @samp{MMM} in the mode line (@pxref{Mode
+Line}).
+
+@menu
+* Enabling MMM Mode:: Turning MMM Mode on and off.
+* MMM Mode Keys:: Default key bindings in MMM Mode.
+@end menu
+
+
+@node Enabling MMM Mode, MMM Mode Keys, MMM Minor Mode, MMM Minor Mode
+@comment node-name, next, previous, up
+@subsection Enabling MMM Mode
+@cindex mmm mode, turning on
+@cindex mmm mode, turning off
+@cindex turning on mmm mode
+@cindex turning off mmm mode
+@cindex mmm mode, enabling
+@cindex mmm mode, disabling
+@cindex enabling mmm mode
+@cindex disabling mmm mode
+
+If @code{mmm-global-mode} is non-@code{nil} (@pxref{Global Mode}),
+then the MMM minor mode will be turned on automatically whenever a file
+with associated submode classes is opened (@pxref{Selecting Classes}).
+It is also turned on by interactive mmm-ification (@pxref{Interactive}),
+although the interactive commands do not have key bindings when it is
+not on and must be invoked via @kbd{M-x}. You can also turn it on (or
+off) manually with @kbd{M-x mmm-mode}, in which case it applies all
+submode classes associated with the buffer. Turning MMM Mode off
+automatically removes all submode regions from the buffer.
+
+@deffn Command mmm-mode @var{arg}
+Toggle the state of MMM Mode in the current buffer. If @var{arg} is
+supplied, turn MMM Mode on if and only if @var{arg} is positive.
+@end deffn
+
+@defun mmm-mode-on
+Turn MMM Mode on unconditionally in the current buffer.
+@end defun
+
+@defun mmm-mode-off
+Turn MMM Mode off unconditionally in the current buffer.
+@end defun
+
+@defvar mmm-mode
+This variable represents whether MMM Mode is on in the current buffer.
+Do not set this variable directly; use one of the above functions.
+@end defvar
+
+
+@node MMM Mode Keys, , Enabling MMM Mode, MMM Minor Mode
+@comment node-name, next, previous, up
+@subsection Key Bindings in MMM Mode
+@cindex mmm mode key bindings
+@cindex key bindings in mmm mode
+@findex mmm-insertion-help
+@kindex C-c % h
+
+When MMM Mode is on, it defines a number of key bindings. By default,
+these are bound after the prefix sequence @kbd{C-c %}. Minor mode
+keymaps are supposed to use @kbd{C-c @var{punctuation}} sequences, and I
+find this one to be a good mnemonic because @samp{%} is used by Mason to
+denote special tags. This prefix key can be customized; @ref{Key
+Bindings}.
+
+There are two types of key bindings in MMM Mode: @dfn{commands} and
+@dfn{insertions}. Command bindings run MMM Mode interactive functions to
+do things like re-parse the buffer or end the current submode region,
+and are defined statically as normal Emacs key-bindings. Insertion
+bindings insert submode region skeletons with delimiters into the
+buffer, and are defined dynamically, according to which submode classes
+(@pxref{Submode Classes}) are in effect, via a keymap default binding.
+
+To distinguish between the two, MMM Mode uses distinct modifier keys for
+each. By default, command bindings use the control key (e.g. @kbd{C-c %
+C-b} re-parses the buffer), and insertion bindings do not (e.g. @kbd{C-c
+% p}, when the Mason class is in effect, inserts a
+@samp{<%perl>...</%perl>} region). This makes the command bindings
+different from in previous versions, however, so the variable
+@code{mmm-use-old-bindings} is provided. If this variable is set to `t'
+before MMM Mode is loaded, the bindings will be reversed: insertion
+bindings will use the control key and command bindings will not.
+
+Normally, Emacs gives help on a prefix command if you type @kbd{C-h}
+after that command (e.g. @kbd{C-x C-h} displays all key bindings
+starting with @kbd{C-x}). Because of how insertion bindings are
+implemented dynamically with a default binding, they do not show up when
+you hit @kbd{C-c % C-h}. For this reason, MMM Mode defines the command
+@kbd{C-c % h} which displays a list of all currently valid insertion key
+sequences. If you use the defaults for command and insertion bindings,
+the @kbd{C-h} and @kbd{h} should be mnemonic.
+
+In the rest of this manual, I will assume you are using the defaults for
+the mode prefix (@kbd{C-c %}) and the command and insertion modifiers.
+You can customize them, however; @ref{Key Bindings}.
+
+
+@node Submode Classes, Selecting Classes, MMM Minor Mode, Basics
+@comment node-name, next, previous, up
+@section Understanding Submode Classes
+@cindex submode classes
+@cindex classes, submode
+
+A submode class represents a ``type'' of submode region. It specifies
+how to find the regions, what their delimiters look like, what submode
+they should be, how to insert them, and how they behave in other ways.
+It is represented by a symbol, such as @code{mason} or
+@code{eval-elisp}.
+
+For example, in the Mason set of classes, there is one class
+representing all @samp{<%...%>} inline Perl regions, and one
+representing regions such as @samp{<%perl>...</%perl>},
+@samp{<%init>...</%init>}, and so on. These are different to Mason, but
+to Emacs they are all just Perl sections, so they are covered by the
+same submode class.
+
+But it would be tedious if whenever we wanted to use the Mason classes,
+we had to specify both of these. (Actually, this is a simplification:
+there are some half a dozen Mason submode classes.) So submode classes
+can also ``group'' others together, and we can refer to the @code{mason}
+class and mean all of them.
+
+The way a submode class is used is to @dfn{apply} it to a buffer. This
+scans the buffer for regions which should be submode regions according
+to that class, and also remembers the class for later, so that new
+submode regions can be inserted and scanned for later.
+
+
+@node Selecting Classes, Insertion, Submode Classes, Basics
+@comment node-name, next, previous, up
+@section How MMM Mode selects submode classes
+
+Submode classes that apply to a buffer come from three sources:
+mode/extension-associated classes, file-local classes, and interactive
+MMM-ification (@pxref{Interactive}). Whenever MMM Mode is turned on in a
+buffer (@pxref{MMM Minor Mode}, and @ref{Global Mode}), it inspects the
+value of two variables to determine which classes to automatically apply
+to the buffer. This covers the first two sources; the latter is covered
+in a later chapter.
+
+@menu
+* File Classes:: Classes for a single file.
+* Mode-Ext Classes:: Classes for a given mode or extension.
+* Global Classes:: Classes for all MMM Mode buffers.
+@end menu
+
+
+@node File Classes, Mode-Ext Classes, Selecting Classes, Selecting Classes
+@comment node-name, next, previous, up
+@subsection File-Local Submode Classes
+
+@defvar mmm-classes
+This variable is always buffer-local when set. Its value should be
+either a single symbol or a list of symbols. Each symbol represents a
+submode class that is applied to the buffer.
+@end defvar
+
+@code{mmm-classes} is usually set in a file local variables list.
+@xref{File Variables, , , emacs, The Emacs Manual}. The easiest way to
+do this is for the first line of the file to contain the string
+@samp{-*- mmm-classes: @var{classes} -*-}, where @var{classes} is the
+desired value of @code{mmm-classes} for the file in question. It can
+also be done with a local variables list at the end of the file.
+
+
+@node Mode-Ext Classes, Global Classes, File Classes, Selecting Classes
+@comment node-name, next, previous, up
+@subsection Submode Classes Associated with Modes and Extensions
+
+@defopt mmm-mode-ext-classes-alist
+This global variable associates certain submode classes with major modes
+and/or file extensions. Its value is a list of elements of the form
+@code{(@var{mode} @var{ext} @var{class})}. Any buffer whose major mode
+is @var{mode} (a symbol) @emph{and} whose file name matches @var{ext} (a
+regular expression) will automatically have the submode class
+@var{class} applied to it.
+
+If @var{mode} is @code{nil}, then only @var{ext} is considered to
+determine if a buffer fits the criteria, and vice versa. Thus if both
+@var{mode} and @var{ext} are nil, then @var{class} is applied to
+@emph{all} buffers in which MMM Mode is on. Note that @var{ext} can be
+any regular expression, although its name indicates that it most often
+refers to the file extension.
+
+If @var{class} is the symbol @code{t}, then no submode class is actually
+applied for this association. However, if @code{mmm-global-mode} is
+non-@code{nil} and non-@code{t}, MMM Mode will be turned on in matching
+buffers even if there are no actual submode classes being applied.
+@xref{Global Mode}.
+@end defopt
+
+@defun mmm-add-mode-ext-class @var{mode} @var{ext} @var{class}
+This function adds an element to @code{mmm-mode-ext-classes-alist},
+associating the submode class @var{class} with the major mode @var{mode}
+and extension @var{ext}.
+
+Older versions of MMM Mode required this function to be used to control
+the value of @code{mmm-mode-ext-classes-alist}, rather than setting it
+directly. In this version it is provided purely for convenience and
+backward compatibility.
+@end defun
+
+
+@node Global Classes, , Mode-Ext Classes, Selecting Classes
+@comment node-name, next, previous, up
+@subsection Globally Applied Classes and the Universal Class
+
+In addition to file-local and mode-ext-associated submode classes, MMM
+Mode also allows you to specify that certain submode classes apply to
+@emph{all} buffers in which MMM Mode is enabled.
+
+@defopt mmm-global-classes
+This variable's value should be a list of submode classes that apply to
+all buffers with MMM Mode on. It can be overriden in a file local
+variables list, such as to disable global class for a specific file.
+Its default value is @code{(universal)}.
+@end defopt
+
+The default global class is the ``universal class'', which is defined in
+the file @file{mmm-univ.el} (loaded automatically), and allows the
+author of text to specify that a certain section of it be in a specific
+major mode. Thus, for example, when writing an email message that
+includes sample code, the author can allow readers of the message (who
+use emacs and MMM) to view the code in the appropriate major mode. The
+syntax used is @samp{@{%@var{mode}%@} ... @{%/@var{mode}%@}}, where
+@var{mode} should be the name of the major mode, with or without the
+customary @samp{-mode} suffix: for example, both @samp{cperl} and
+@samp{cperl-mode} are acceptable.
+
+The universal class also defines an insertion key, @samp{/}, which
+prompts for the submode to use. @xref{Insertion}. The universal class
+is most useful when @code{mmm-global-mode} is set to @code{t};
+@ref{Global Mode}.
+
+
+@node Insertion, Re-parsing, Selecting Classes, Basics
+@comment node-name, next, previous, up
+@section Inserting new submode regions
+
+So much for noticing submode regions already present when you open a
+file. When editing a file with MMM Mode on, you will often want to add a
+new submode region. MMM Mode provides several facilities to help you.
+The simplest is to just hit a few keys and have the region and its
+delimiters inserted for you.
+
+Each submode class can define an association of keystrokes with
+``skeletons'' to insert a submode region. If there are several submode
+classes enabled in a buffer, it is conceivable that the keys they use
+for insertion might conflict, but unlikely as most buffers will not use
+more than one or two submode classes groups.
+
+As an example of how insertion works, consider the Mason classes. In a
+buffer with MMM Mode enabled and Mason associated, the key sequence
+@kbd{C-c % p} inserts the following perl section (the semicolon is to
+prevent CPerl Mode from getting confused---@pxref{Mason}):
+
+@example
+<%perl>-<-;
+-!-
+->-</%perl>
+@end example
+
+In this schematic representation, the string @samp{-!-} represents the
+position of point (the cursor), @samp{-<-} represents the beginning of
+the submode region, and @samp{->-} its end.
+
+All insertion keys come after the MMM Mode prefix keys (by default
+@kbd{C-c %}; @pxref{Key Bindings}) and are by default single characters
+such as @kbd{p}, @kbd{%}, and @kbd{i}. To avoid confusion, all the MMM
+Mode commands are bound by default to control characters (after the same
+prefix keys), such as @kbd{C-b}, @kbd{C-%} and @kbd{C-r}. This is a
+change from earlier versions of MMM Mode, and can be customized; see
+@ref{Key Bindings}.
+
+To find out what insertion keys are available, consult the documentation
+for the submode class you are using. If it is one of the classes
+supplied with MMM Mode, you can find it in this Info file.
+
+Because insertion keys are implemented with a ``default binding'' for
+flexibility, they do not show up in the output of @kbd{C-h m} and cannot
+be found with @kbd{C-h k}. For this reason, MMM Mode supplies the
+command @kbd{C-c % h} (@code{mmm-insertion-help} to view the available
+insertion keys.
+
+
+@node Re-parsing, Interactive, Insertion, Basics
+@comment node-name, next, previous, up
+@section Re-Parsing Submode Regions
+@cindex re-parsing submode regions
+@cindex parsing submode regions
+@cindex submode regions, re-parsing
+@cindex regions, submode, re-parsing
+@cindex submode regions, clearing
+@cindex clearing submode regions
+@cindex regions, submode, clearing
+@kindex C-c % C-b
+@kindex C-c % C-g
+@kindex C-c % C-%
+@kindex C-c % C-5
+@kindex C-c % C-k
+
+Describe @code{mmm-parse-buffer}, @code{mmm-parse-region},
+@code{mmm-parse-block}, and @code{mmm-clear-current-region}.
+
+@node Interactive, Global Mode, Re-parsing, Basics
+@comment node-name, next, previous, up
+@section Interactive MMM-ification Functions
+@cindex interactive mmm-ification
+@cindex mmm-ification, interactive
+@cindex mmm-ification by region
+@cindex mmm-ification by regexp
+@cindex mmm-ification by class
+@cindex region, mmm-ification by
+@cindex regexp, mmm-ification by
+@cindex class, mmm-ification by
+@kindex C-c % C-r
+@kindex C-c % C-c
+@kindex C-c % C-x
+@cindex mmm-ification, interactive history
+@cindex history of interactive mmm-ification
+@cindex interactive mmm-ification, history of
+
+There are several commands you can use to create submode regions
+interactively, rather than by applying a submode class to a buffer.
+These commands (in particular, @code{mmm-ify-region}), can be useful
+when editing a file or email message containing a snippet of code in
+some other language. Also see @ref{Global Classes}, for an alternate
+approach to the same problem.
+
+@table @kbd
+@item C-c % C-r
+Creates a submode region between point and mark. Prompts for the submode
+to use, which must be a valid Emacs major mode name, such as
+@code{emacs-lisp-mode} or @code{cperl-mode}. Adds markers to the
+interactive history. (@code{mmm-ify-region})
+
+@item C-c % C-c
+Applies an already-defined submode class to the buffer, which it prompts
+for. Adds this class to the interactive history.
+(@code{mmm-ify-by-class})
+
+@item C-c % C-x
+Scans the buffer for submode regions (prompts for the submode) using
+front and back regular expressions that it also prompts for. Briefly, it
+starts at the beginning of the buffer and searches for the front regexp.
+If it finds a match, it searches for the back regexp. If it finds a
+match for that as well, it makes a submode region between the two
+matches and continues searching until no more matches are found. Adds
+the regexps to the interactive history. (@code{mmm-ify-by-regexp})
+
+@end table
+
+These commands are also useful when designing a new submode class
+(@pxref{Submode Classes}). Working with the regexps interactively can
+make it easier to debug and tune the class before starting to use it on
+automatic. All these commands also add to value of the following
+variable.
+
+@defvar mmm-interactive-history
+Stores a history of all interactive mmm-ification that has been
+performed in the current buffer. This way, for example, the re-parsing
+functions (@pxref{Re-parsing}) will respect interactively added regions,
+and the insertion keys for classes that were added interactively are
+available.
+@end defvar
+
+If for any reason you want to ``wipe the slate clean'', this command
+should help you. By default, it has no key binding, so you must invoke
+it with @kbd{M-x mmm-clear-history @key{RET}}.
+
+@deffn Command mmm-clear-history
+Clears all history of interactive mmm-ification in the current buffer.
+This command does not affect existing submode regions; to remove them,
+you may want to re-parse the buffer with @kbd{C-c % C-b}
+(@code{mmm-parse-buffer}).
+@end deffn
+
+
+@node Global Mode, , Interactive, Basics
+@comment node-name, next, previous, up
+@section MMM Global Mode
+@cindex mode, mmm global
+@cindex global mmm mode
+@cindex mmm global mode
+@vindex mmm-never-modes
+
+When a file has associated submode classes (@pxref{Selecting Classes}),
+you may want MMM Mode to turn itself on and parse that file for submode
+regions automatically whenever it is opened in an Emacs buffer. The
+value of the following variable controls when MMM Mode turns itself on
+automatically.
+
+@defopt mmm-global-mode
+Do not be misled by the fact that this variable's name ends in
+@samp{-mode}: it is not a simple on/off switch. There are three possible
+(meanings of) values for it: @code{t}, @code{nil}, and anything else.
+
+When this variable is @code{nil}, MMM Mode is never enabled
+automatically. If it is enabled manually, such as by typing @kbd{M-x
+mmm-mode}, any submode classes associated with the buffer will still be
+used, however.
+
+When this variable is @code{t}, MMM Mode is enabled automatically in
+@emph{all} buffers, including those not visiting files, except those
+whose major mode is an element of @code{mmm-never-modes}. The default
+value of this variable contains modes such as @code{help-mode} and
+@code{dired-mode} in which most users would never want MMM Mode, and
+in which MMM might cause problems.
+
+When this variable is neither @code{nil} nor @code{t}, MMM Mode is
+enabled automatically in all buffers that would have associated submode
+classes; i.e. only if there would be something for it to do. The value
+of @code{mmm-never-modes} is still respected, however. Note that this
+can include buffers not visiting files, if that buffer's major mode is
+present in @code{mmm-mode-ext-classes-alist} with a @code{nil} value for
+@var{ext} (@pxref{Mode-Ext Classes}). Submode class values of @code{t}
+in @code{mmm-mode-ext-classes-alist} cause MMM Mode to be enabled in
+matching buffers, but supply no submode classes to be applied.
+@end defopt
+
+@menu
+* Major Mode Hook:: Using MMM's Major Mode Hook
+@end menu
+
+
+@node Major Mode Hook, , Global Mode, Global Mode
+@comment node-name, next, previous, up
+@subsection The Major Mode Hook
+@cindex hook, major mode
+@cindex major mode hook
+@vindex mmm-major-mode-hook
+
+This section is intended for users who understand Emacs Lisp and want to
+know how MMM Global Mode is implemented, and perhaps use the same
+technique. In fact, MMM Mode exports a hook variable that you can use
+easily, without understanding any of the details---see below.
+
+In order to enable itself in @emph{all} buffers, however, MMM Mode has
+to hook itself into all major modes. Global Font Lock Mode from the
+standard Emacs distribution (@pxref{Font Lock, , , emacs, The Emacs
+Manual}) has a similar problem, and solves it by adding a function to
+@code{change-major-mode-hook}, which is run by
+@code{kill-all-local-variables}, which is run in turn by all major mode
+functions at the @emph{beginning}. This function stores a list of which
+buffers need fontification. It then adds a different function to
+@code{post-command-hook}, which checks if the current buffer needs
+fontification, and if so performs it. MMM Global Mode uses the same
+technique.
+
+In the interests of generality, and for your use, the function that MMM
+Mode runs in @code{post-command-hook} (@code{mmm-run-major-mode-hook})
+is not specific to MMM Mode, but rather runs the hook variable
+@code{mmm-major-mode-hook}, which by default contains a function
+(@code{mmm-mode-on-maybe}) which possibly turns MMM Mode on, depending
+on the value of @code{mmm-global-mode}. Thus, to run another function
+in all major modes, all you need to do is add it to this hook. For
+example, the following line in an initialization file will turn on Auto
+Fill Mode (@pxref{Auto Fill, , , emacs, The Emacs Manual}) in all
+buffers:
+
+@lisp
+(add-hook 'mmm-major-mode-hook 'turn-on-auto-fill)
+@end lisp
+
+@node Customizing, Supplied Classes, Basics, Top
+@comment node-name, next, previous, up
+@chapter Customizing MMM Mode
+
+This chapter explains how to customize the appearance and functioning of
+MMM Mode however you want.
+
+@menu
+* Region Coloring:: Changing or removing background colors.
+* Preferred Modes:: Choosing which major modes to use.
+* Mode Line:: What is displayed in the mode line.
+* Key Bindings:: Customizing the MMM Mode key bindings.
+* Local Variables:: What local variables are saved for submodes.
+* Changing Classes:: Changing the supplied submode classes.
+* Hooks:: How to make MMM Mode run your code.
+@end menu
+
+@node Region Coloring, Preferred Modes, Customizing, Customizing
+@comment node-name, next, previous, up
+@section Customizing Region Coloring
+@cindex faces, submode
+@cindex submode faces
+@cindex customizing submode faces
+@cindex default submode face
+
+By default, MMM Mode highlights all submode regions with a background
+color. There are three levels of this decoration, controlled by the
+following variable:
+
+@defopt mmm-submode-decoration-level
+This variable controls the level of coloring of submode regions. It
+should be one of the integers 0, 1, or 2, representing (respectively)
+none, low, and high coloring.
+@end defopt
+
+No coloring means exactly that. Submode regions have the same
+background as the rest of the text. This produces the minimal
+interference with font-lock coloration. In particular, if you want to
+use background colors for font-lock, this may be a good idea, because
+the submode highlight, if present, overrides any font-lock background
+coloring.
+
+Low coloring uses the same background color for all submode regions.
+This color is specified with the face @code{mmm-default-submode-face}
+(@pxref{Faces, , , emacs, The Emacs Manual}) which can be customized,
+either through the Emacs ``customize'' interface or using direct Lisp
+commands such as @code{set-face-background}. Of course, other aspects
+of the face can also be set, such as the foreground color, bold,
+underline, etc. These are more likely to conflict with font-lock,
+however, so only a background color is recommended.
+
+High coloring uses multiple background colors, depending on the function
+of the submode region. The recognized functions and their meanings are
+as follows:
+
+@table @samp
+@item init
+Code that is executed at the beginning of (something), as initialization
+of some sort.
+
+@item cleanup
+Code that is executed at the end of (something), as some sort of clean
+up facility.
+
+@item declaration
+Code that provides declarations of some sort, perhaps global or local
+arguments, variables, or methods.
+
+@item comment
+Text that is not executed as code, but instead serves to document the
+code around it. Submode regions of this function often use a mode such
+as Text Mode rather than a programming language mode.
+
+@item output
+An expression that is evaluated and its value interpolated into the
+output produced.
+
+@item code
+Executed code not falling under any other category.
+
+@item special
+Submode regions not falling under any other category, such as component
+calls.
+
+@end table
+
+The different background colors are provided by the faces
+@code{mmm-@var{function}-submode-face}, which can be customized in the
+same way as @code{mmm-default-submode-face}.
+
+
+@node Preferred Modes, Mode Line, Region Coloring, Customizing
+@comment node-name, next, previous, up
+@section Preferred Major Modes
+
+Certain of the supplied submode classes know only the language that
+certain sections are written in, but not what major mode you prefer to
+use to edit such code. For example, many people prefer CPerl mode over
+Perl mode; you may have a special mode for Javascript or just use C++
+mode. This variable allows you to tell submodes such as Mason
+(@pxref{Mason}) and Embedded Javascript (@pxref{Javascript}) what major
+mode to use for the submodes:
+
+@defopt mmm-major-mode-preferences
+The elements of this list are cons cells of the form
+@code{(@var{language} . @var{mode})}. @var{language} should be a symbol
+such as @code{perl}, @code{html-js}, or @code{java}, while @var{mode}
+should be the name of a major mode such as @code{perl-mode},
+@code{cperl-mode}, @code{javascript-mode}, or @code{c++-mode}.
+
+You probably won't have to set this variable at all; MMM tries to make
+intelligent guesses about what modes you prefer. For example, if a
+function called @code{javascript-mode} exists, it is chosen, otherwise
+@code{c++-mode} is used. Similarly for @code{jde-mode} and
+@code{java-mode}.
+@end defopt
+
+If you do need to change the defaults, you may find the following
+function convenient.
+
+@defun mmm-set-major-mode-preferences @var{language} @var{mode} &optional @var{default}
+Set the preferred major mode for LANGUAGE to MODE. If there is already
+a mode specified for LANGUAGE, and DEFAULT is nil or unsupplied, then it
+is changed. If DEFAULT is non-nil, then any existing mode is unchanged.
+This is used by packages to ensure that some mode is present, but not
+override any user-specified mode. If you are not writing a submode
+class, you should ignore the third argument.
+@end defun
+
+Thus, for example, to use @code{my-java-mode} for Java code, you would
+use the following line:
+
+@lisp
+(mmm-set-major-mode-preferences 'java 'my-java-mode)
+@end lisp
+
+
+@node Mode Line, Key Bindings, Preferred Modes, Customizing
+@comment node-name, next, previous, up
+@section Customizing the Mode Line Display
+
+By default, when in a submode region, MMM Mode changes the section of
+the mode line (@pxref{Mode Line, , , emacs, The Emacs Manual}) that
+normally displays the major mode name---for example, @samp{HTML}---to
+instead show both the dominant major mode and the currently active
+submode---for example, @samp{HTML[CPerl]}. You can change this format,
+however.
+
+@defopt mmm-submode-mode-line-format
+The value of this variable should be a string containing one or both of
+the escape sequences @samp{~M} and @samp{~m}. The string displayed in
+the major mode section of the mode line when in a submode is obtained by
+replacing all occurrences of @samp{~M} with the dominant major mode name
+and @samp{~m} with the currently active submode name. For example, to
+display only the currently active submode, set this variable to
+@samp{~m}. The default value is @samp{~M[~m]}.
+@end defopt
+
+The MMM minor mode also normally displays the string @samp{MMM} in the
+minor mode section of the mode line to indicate when it is active. You
+can customize or disable this as well.
+
+@defopt mmm-mode-string
+This string is displayed in the minor mode section of the mode line when
+the MMM minor mode is active. If nonempty, it should begin with a space
+to separate the MMM indicator from that of other minor modes. To
+eliminate the indicator entirely, set this variable to the empty string.
+@end defopt
+
+
+@node Key Bindings, Local Variables, Mode Line, Customizing
+@comment node-name, next, previous, up
+@section Customizing the MMM Mode Key Bindings
+
+The default MMM Mode key bindings are explained in @ref{MMM Mode Keys},
+and in @ref{Insertion}. There are a couple of ways to customize these
+bindings.
+
+@defopt mmm-mode-prefix-key
+The value of this variable (default is @kbd{C-c %}) should be a key
+sequence to use as the prefix for the MMM Mode keymap. Minor modes
+typically use @kbd{C-c} followed by a punctuation character, but you can
+change it to any user-available key sequence. To have an effect, this
+variable should be set before MMM Mode is loaded.
+@end defopt
+
+@defopt mmm-use-old-command-keys
+When this variable is @code{nil}, MMM Mode commands use the control
+modifier and insertion keys no modifier. Any other value switches the
+two, so that @code{mmm-parse-buffer}, for example, is bound to @kbd{C-c
+% b}, while perl-section insertion in the Mason class is bound to
+@kbd{C-c % C-p}. This variable should be set before MMM Mode is loaded
+to have an effect.
+@end defopt
+
+When MMM is loaded, it uses the value of @code{mmm-use-old-command-keys}
+to set the values of the variables @code{mmm-command-modifiers} and
+@code{mmm-insert-modifiers}, so if you prefer you can set these
+variables instead. They should each be a list of key modifiers, such as
+@code{(control)} or @code{()}. The Meta modifier is used in some of the
+command and insertion keys, so it should not be used, and the Shift
+modifier is not particularly portable between Emacsen---if it works for
+you, feel free to use it. Other modifiers, such as Hyper and Super, are
+not universally available, but are valid when present.
+
+
+@node Local Variables, Changing Classes, Key Bindings, Customizing
+@comment node-name, next, previous, up
+@section Changing Saved Local Variables
+
+A lot of the functionality of MMM Mode---that which makes the major mode
+appear to change---is implemented by saving and restoring the values of
+local variables, or pseudo-variables. You can customize what variables
+are saved, and how, with the following variable.
+
+@defvar mmm-save-local-variables
+At its simplest, this is a list each of whose elements is a buffer-local
+variable whose value is saved and restored for each major mode. Each
+elements can also, however, be a list whose first element is the
+variable symbol and whose subsequent elements specify how and where the
+variable is to be saved. The second element of the list, if present,
+should be one of the symbols @code{global}, @code{buffer}, or
+@code{region}. If not present, the default value is @code{global}. The
+third element, if present, should be a list of major mode symbols in
+which to save the variable. In the list form, the variable symbol
+itself can be replaced with a cons cell of two functions, one to get the
+value and one to set the value. This is called a ``pseudo-variable''.
+@end defvar
+
+Globally saved variables are the same in all (MMM-controlled) buffers
+and submode regions of each major mode listed in the third argument, or
+all major modes if it is @code{t} or not present. Buffer-saved
+variables are the same in all submode regions of a given major mode in
+each buffer, and region-saved variables can be different for each
+submode region.
+
+Pseudo-variables are used, for example, to save and restore the syntax
+table (@pxref{Syntax, , , emacs, The Emacs Manual}) and mode keymaps
+(@pxref{Keymaps, , , emacs, The Emacs Manual}).
+
+
+@node Changing Classes, Hooks, Local Variables, Customizing
+@comment node-name, next, previous, up
+@section Changing the Supplied Submode Classes
+
+If you need to use MMM with a syntax for which a submode class is not
+supplied, and you have some facility with Emacs Lisp, you can write your
+own; see @ref{Writing Classes}. However, sometimes you will only want
+to make a slight change to one of the supplied submode classes. You can
+do this, after that class is loaded, with the following functions.
+
+@defun mmm-set-class-parameter @var{class} @var{param} @var{value}
+Set the value of the keyword parameter @var{param} of the submode class
+@var{class} to @var{value}. @xref{Writing Classes}, for an explanation
+of the meaning of each keyword parameter. This creates a new parameter
+if one is not already present in the class.
+@end defun
+
+@defun mmm-get-class-parameter @var{class} @var{param}
+Get the value of the keyword parameter @var{param} for the submode class
+@var{class}. Returns @code{nil} if there is no such parameter.
+@end defun
+
+
+
+@node Hooks, , Changing Classes, Customizing
+@comment node-name, next, previous, up
+@section Hooks Provided by MMM Mode
+
+MMM Mode defines several hook variables (@pxref{Hooks, , , emacs, The
+Emacs Manual}) which are run at different times. The most often used is
+@code{mmm-major-mode-hook} which is described in @ref{Major Mode Hook},
+but there are a couple others.
+
+@defvar mmm-mode-hook
+This normal hook is run whenever MMM Mode is enabled in a buffer.
+@end defvar
+
+@defvar mmm-@var{major-mode}-hook
+This is actually a whole set of hook variables, a different one for
+every major mode. Whenever MMM Mode is enabled in a buffer, the
+corresponding hook variable for the dominant major mode is run.
+@end defvar
+
+@defvar mmm-@var{submode}-submode-hook
+Again, this is a set of one hook variable per major mode. These hooks
+are run whenever a submode region of the corresponding major mode is
+created in any buffer, with point at the start of the new submode
+region.
+@end defvar
+
+@defvar mmm-@var{class}-class-hook
+This is a set of one hook variable per submode class. These hooks are
+run when a submode class is first applied to a given buffer.
+@end defvar
+
+Submode classes also have a @code{:creation-hook} parameter which should
+be a function to run whenever a submode region is created with that
+class, with point at the beginning of the submode region. This can be
+set for supplied submode classes with @code{mmm-set-class-parameter};
+@ref{Changing Classes}.
+
+
+@node Supplied Classes, Writing Classes, Customizing, Top
+@comment node-name, next, previous, up
+@chapter Supplied Submode Classes
+
+This chapter describes the submode classes that are supplied with MMM
+Mode.
+
+@menu
+* Mason:: Mason server-side Perl in HTML.
+* File Variables:: Elisp code in File Variables.
+* Here-documents:: Code in shell and Perl here-documents.
+* Javascript:: Javascript embedded in HTML.
+* Embedded CSS:: CSS Styles embedded in HTML.
+* Embperl:: Another syntax for Perl in HTML.
+* ePerl:: A general Perl-embedding syntax.
+* JSP:: Java code embedded in HTML.
+* RPM:: Shell scripts in RPM Spec Files.
+* Noweb:: Noweb literate programs.
+@end menu
+
+@node Mason, File Variables, Supplied Classes, Supplied Classes
+@comment node-name, next, previous, up
+@section Mason: Perl in HTML
+
+Mason is a syntax to embed Perl code in HTML and other documents. See
+@uref{http://www.masonhq.com} for more information. The submode class
+for Mason components is called `mason' and is loaded on demand from
+`mmm-mason.el'. The current Mason class is intended to correctly
+recognize all syntax valid in Mason @value{MASON_VERSION}. There are
+insertion keys for most of the available syntax; use
+@code{mmm-insertion-help} (@kbd{C-c % h} by default) with Mason on to
+get a list.
+
+If you want to have mason submodes automatically in all Mason files, you
+can use automatic mode and filename associations; the details depend on
+what you call your Mason components and what major mode you use.
+@xref{Mode-Ext Classes}. If you use an extension for your Mason files
+that emacs does not automatically place in your preferred HTML Mode, you
+will probably want to associate that extension with your HTML Mode as
+well; @ref{Choosing Modes, , , emacs, The Emacs Manual}. This also goes
+for ``special'' Mason files such as autohandlers and dhandlers.
+
+The Perl mode used is controlled by the user: @xref{Preferred Modes}.
+The default is to use CPerl mode, if present. Unfortunately, there are
+also certain problems with CPerl mode in submode regions. (Not to say
+that the original perl-mode would do any better---it hasn't been much
+tried.) First of all, the first line of a Perl section is usually
+indented as if it were a continuation line. A fix for this is to start
+with a semicolon on the first line. The insertion key commands do this
+whenever the Mason syntax allows it.
+
+@example
+<%perl>;
+print $var;
+</%perl>
+@end example
+
+In addition, some users have reported that the CPerl indentation
+sometimes does not work. This problem has not yet been tracked down,
+however, and more data about when it happens would be helpful.
+
+Some people have reported problems using PSGML with Mason. Adding the
+following line to a @file{.emacs} file should suffice to turn PSGML off
+and cause emacs to use a simpler HTML mode:
+
+@lisp
+(autoload 'html-mode "sgml-mode" "HTML Mode" t)
+@end lisp
+
+Earlier versions of PSGML may require instead the following fix:
+
+@lisp
+(delete '("\\.html$" . sgml-html-mode) auto-mode-alist)
+(delete '("\\.shtml$" . sgml-html-mode) auto-mode-alist)
+@end lisp
+
+Other users report using PSGML with Mason and MMM Mode without
+difficulty. If you don't have problems and want to use PSGML, you may
+need to replace @code{html-mode} in the suggested code with
+@code{sgml-html-mode}. (Depending on your version of PSGML, this may
+not be necessary.) Similarly, if you are using XEmacs and want to use
+the alternate HTML mode @code{hm--html-mode}, replace @code{html-mode}
+with that symbol.
+
+One problem that crops up when using PSGML with Mason is that even
+ignoring the special tags and Perl code (which, as I've said, haven't
+caused me any problems), Mason components often are not a complete SGML
+document. For instance, my autohandlers often say
+
+@example
+<body>
+ <% $m->call_next %>
+</body>
+@end example
+
+in which case the actual components contain no doctype declaration,
+@code{<html>}, @code{<head>}, or @code{<body>}, confusing PSGML. One
+solution I've found is to use the variable @code{sgml-parent-document}
+in such incomplete components; try, for example, these lines at the end
+of a component.
+
+@example
+%# Local Variables:
+%# sgml-parent-document: ("autohandler" "body" nil ("body"))
+%# sgml-doctype: "/top/level/autohandler"
+%# End:
+@end example
+
+This tells PSGML that the current file is a sub-document of the file
+@file{autohandler} and is included inside a @code{<body>} tag, thus
+alleviating its confusion.
+
+
+@node File Variables, Here-documents, Mason, Supplied Classes
+@comment node-name, next, previous, up
+@section Elisp in a Local Variables List
+
+Emacs allows the author of a file to specify major and minor modes to be
+used while editing that file, as well as specifying values for other
+local Elisp variables, with a File Variables list. @xref{File
+Variables, , , emacs, The Emacs Manual}. Since file variables values
+are Elisp objects (and with the @code{eval} special ``variable'', they
+are forms to be evaluated), one might want to edit them in
+@code{emacs-lisp-mode}. The submode class @code{file-variables} allows
+this, and is suitable for turning on in a given file with
+@code{mmm-classes}, or in all files with @code{mmm-global-classes}.
+
+
+@node Here-documents, Javascript, File Variables, Supplied Classes
+@comment node-name, next, previous, up
+@section Here-documents
+
+One of the long-time standard syntaxes for outputting large amounts of
+code (or text, or HTML, or whatever) from a script (notably shell
+scripts and Perl scripts) is the here-document syntax:
+
+@example
+print <<END_HTML;
+<html>
+ <head>
+ <title>Test Page</title>
+ </head>
+ <body>
+END_HTML
+@end example
+
+The @code{here-doc} submode class recognizes this syntax, and can even
+guess the correct submode to use in many cases. For instance, it would
+put the above example in @code{html-mode}, noticing the string
+@samp{HTML} in the name of the here-document. If you use less than
+evocative here-document names, or if the submode is recognized
+incorrectly for any other reason, you can tell it explicitly what
+submode to use.
+
+@defopt mmm-here-doc-mode-alist
+The value of this variable should be an alist, each element a cons pair
+associating a regular expression to a submode symbol. Whenever a
+here-document name matches one of these regexps, the corresponding
+submode is applied. For example, if this variable contains the element
+@code{("CODE" . cc-mode)}, then any here-document whose name contains
+the string @samp{CODE} will be put in @code{cc-mode}. The value of this
+variable overrides any guessing that the @code{here-doc} submode class
+would do otherwise.
+@end defopt
+
+
+@node Javascript, Embedded CSS, Here-documents, Supplied Classes
+@comment node-name, next, previous, up
+@section Javascript in HTML
+
+The submode class @code{html-js} allows for embedding Javascript code in
+HTML documents. It recognizes both this syntax:
+
+@example
+<script language="Javascript">
+function foo(...) @{
+ ...
+@}
+</script>
+@end example
+
+and this syntax:
+
+@example
+<input type="button" onClick="validate();">
+@end example
+
+The mode used for Javascript regions is controlled by the user;
+@xref{Preferred Modes}.
+
+
+@node Embedded CSS, Embperl, Javascript, Supplied Classes
+@comment node-name, next, previous, up
+@section CSS embedded in HTML
+
+CSS (Cascading Style Sheets) can also be embedded in HTML. The
+@code{embedded-css} submode class recognizes this syntax:
+
+@example
+<style>
+h1 @{
+ ...
+@}
+</style>
+@end example
+
+It uses @code{css-mode} if present, @code{c++-mode} otherwise. This can
+be customized: @xref{Preferred Modes}.
+
+
+@node Embperl, ePerl, Embedded CSS, Supplied Classes
+@comment node-name, next, previous, up
+@section Embperl: More Perl in HTML
+
+Embperl is another syntax for embedding Perl in HTML. See
+@uref{http://perl.apache.org/embperl} for more information. The
+@code{embperl} submode class recognizes most if not all of the Embperl
+embedding syntax. Its Perl mode is also controllable by the user;
+@xref{Preferred Modes}.
+
+
+@node ePerl, JSP, Embperl, Supplied Classes
+@comment node-name, next, previous, up
+@section ePerl: General Perl Embedding
+
+Yet another syntax for embedding Perl is called ePerl. See
+@uref{http://www.engelschall.com/sw/eperl/} for more information. The
+@code{eperl} submode class handles this syntax, using the Perl mode
+specified by the user; @xref{Preferred Modes}.
+
+
+@node JSP, RPM, ePerl, Supplied Classes
+@comment node-name, next, previous, up
+@section JSP: Java Embedded in HTML
+
+JSP (Java Server Pages) is a syntax for embedding Java code in HTML.
+The submode class @code{jsp} handles this syntax, using a Java mode
+specified by the user; @xref{Preferred Modes}. The default is
+@code{jde-mode} if present, otherwise @code{java-mode}.
+
+
+@node RPM, Noweb, JSP, Supplied Classes
+@comment node-name, next, previous, up
+@section RPM Spec Files
+
+@file{mmm-rpm.el} contains the definition of an MMM Mode submode class
+for editing shell script sections within RPM (Redhat Package Manager)
+spec files. It is recommended for use in combination with
+@file{rpm-spec-mode.el} by Stig Bjørlykke <stigb@@tihlde.hist.no> and
+Steve Sanbeg <sanbeg@@dset.com>
+(@uref{http://www.xemacs.org/~stigb/rpm-spec-mode.el}).
+
+Suggested setup code:
+
+@lisp
+(add-to-list 'mmm-mode-ext-classes-alist
+ '(rpm-spec-mode "\\.spec\\'" rpm-sh))
+@end lisp
+
+Thanks to Marcus Harnisch <Marcus.Harnisch@@gmx.net> for contributing
+this submode class.
+
+@node Noweb, , RPM, Supplied Classes
+@comment node-name, next, previous, up
+@section Noweb literate programming
+
+@file{mmm-noweb.el} contains the definition of an MMM Mode submode
+class for editing Noweb documents. Most Noweb documents use \LaTeX
+for the documentation chunks. Code chunks in Noweb are
+document-specific, and the mode may be set with a local variable
+setting in the document. The variable @var{mmm-noweb-code-mode}
+controls the global code chunk mode. Since Noweb files may have many
+languages in their code chunks, this mode also allows setting the mode
+by specifying a mode in the first line or two of a code chunk, using
+the normal Emacs first-line mode setting syntax. Note that this
+first-line mode setting only matches a single word for the mode name,
+and does not support the variable name setting of the generalized
+first file line syntax.
+
+@verbatim
+% -*- mode: latex; mmm-noweb-code-mode: c++; -*-
+% First chunk delimiter!
+@
+\noweboptions{smallcode}
+
+\title{Sample Noweb File}
+\author{Joe Kelsey\\
+\nwanchorto{mailto:bozo@bozo.bozo}{\tt bozo@bozo.bozo}}
+\maketitle
+
+@
+\section{Introduction}
+Normal noweb documentation for the required [[*]] chunk.
+<<*>>=
+// C++ mode here!
+// We might list the program here, or simply included chunks.
+<<myfile.cc>>
+@ %def myfile.cc
+
+@
+\section{[[myfile.cc]]}
+This is [[myfile.cc]]. MMM noweb-mode understands code quotes in
+documentation.
+<<myfile.cc>>=
+// This section is indented separately from previous.
+@
+
+@
+\section{A Perl Chunk}
+We need a Perl chunk.
+<<myfile.pl>>=
+#!/usr/bin/perl
+# -*- perl -*-
+# Each differently named chunk is flowed separately.
+@
+
+\section{Finish [[myfile.cc]]}
+When we resume a previously defined chunk, they are indented together.
+<<myfile.cc>>=
+// Pick up where we left off...
+@
+
+@end verbatim
+
+The quoted code chunks inside documentation chunks are given the mode
+found in the variable @var{mmm-noweb-quote-mode}, if set, or the value
+in @var{mmm-noweb-code-mode} otherwise. Also, each quoted chunk is
+set to have a unique name to prevent them from being indented as a
+unit.
+
+Suggested setup code:
+@lisp
+(mmm-add-mode-ext-class 'latex-mode "\\.nw\\'" 'noweb)
+(add-to-list 'auto-mode-alist '("\\.nw\\'" . latex-mode))
+@end lisp
+
+In mmm-noweb buffers, each differently-named code chunk has a
+different @code{:name}, allowing all chunks with the same name to get
+indented together.
+
+This mode also supplies special paragraph filling operations for use
+in documentation areas of the buffer. From a primary-mode
+(@code{latex-mode, , emacs}) region, pressing @kbd{C-c % C-q} will mark all
+submode regions with word syntax (@code{mmm-word-other-regions}), fill
+the current paragraph (@code{(fill-paragraph justify)}), and remove the
+syntax markings (@code{mmm-undo-syntax-other-regions}).
+
+Thanks to Joe Kelsey <joe@@zircon.seattle.wa.us> for contributing this
+class.
+
+
+@node Writing Classes, Indices, Supplied Classes, Top
+@comment node-name, next, previous, up
+@chapter Writing Submode Classes
+
+Sometimes (perhaps often) you may want to use MMM with a syntax for
+which it is suited, but for which no submode is supplied. In such cases
+you may have to write your own submode class. This chapter briefly
+describes how to write a submode class, from the basic to the advanced,
+with examples.
+
+@menu
+* Basic Classes:: Writing a simple submode class.
+* Paired Delimiters:: Matching paired delimiters.
+* Region Placement:: Placing the region more accurately.
+* Submode Groups:: Grouping several classes together.
+* Calculated Submodes:: Deciding the submode at run-time.
+* Calculated Faces:: Deciding the display face at run-time.
+* Insertion Commands:: Inserting regions automatically.
+* Region Names:: Naming regions for syntax grouping.
+* Other Hooks:: Running code at arbitrary points.
+* Delimiters:: Controlling delimiter overlays.
+* Misc Keywords:: Other miscellaneous options.
+@end menu
+
+@node Basic Classes, Paired Delimiters, Writing Classes, Writing Classes
+@comment node-name, next, previous, up
+@section Writing Basic Submode Classes
+@cindex simple submode classes
+@cindex submode classes, simple
+
+Writing a submode class can become rather complex, if the syntax to
+match is complicated and you want to take advantage of some of MMM
+Mode's extra features. But a simple submode class is not particularly
+difficult to write. This section describes the basics of writing
+submode classes.
+
+Submode classes are stored in the variable @code{mmm-classes-alist}.
+Each element of this list represents a single submode class. For
+convenience, the function @code{mmm-add-classes} takes a list of submode
+classes and adds them all to this alist. Each class is represented by a
+list containing the class name---a symbol such as @code{mason} or
+@code{html-js}---followed by pairs of keywords and arguments called a
+@dfn{class specifier}. For example, consider the specifier for the
+submode class @code{embedded-css}:
+
+@lisp
+(mmm-add-classes
+ '((embedded-css
+ :submode css
+ :face mmm-declaration-submode-face
+ :front "<style[^>]*>"
+ :back "</style>")))
+@end lisp
+
+The name of the submode is @code{embedded-css}, the first element of the
+list. The rest of the list consists of pairs of keywords (symbols
+beginning with a colon) such as @code{:submode} and @code{:front}, and
+arguments, such as @code{css} and @code{"<style[^>]*>"}. It is the
+keywords and arguments that specify how the submode works. The order of
+keywords is not important; all that matters is the arguments that follow
+them.
+
+The three most important keywords are @code{:submode}, @code{:front},
+and @code{:back}. The argument following @code{:submode} names the
+major mode to use in submode regions. It can be either a symbol naming
+a major mode, such as @code{text-mode} or @code{c++-mode}, or a symbol
+to look up in @code{mmm-major-mode-preferences} (@pxref{Preferred
+Modes}) such as @code{css}, as in this case.
+
+The arguments following @code{:front} and @code{:back} are regular
+expressions (@pxref{Regexps, , , emacs, The Emacs Manual}) that should
+match the delimiter strings which begin and end the submode regions. In
+our example, CSS regions begin with a @samp{<style>} tag, possibly with
+parameters, and end with a @samp{</style>} tag.
+
+The argument following @code{:face} specifies the face (background
+color) to use when @code{mmm-submode-decoration-level} is 2 (high
+coloring). @xref{Region Coloring}, for a list of canonical available
+faces.
+
+There are many more possible keywords arguments. In the following
+sections, we will examine each of them and their uses in writing submode
+classes.
+
+
+@node Paired Delimiters, Region Placement, Basic Classes, Writing Classes
+@comment node-name, next, previous, up
+@section Matching Paired Delimiters
+
+A simple pair of regular expressions does not always suffice to exactly
+specify the beginning and end of submode regions correctly. For this
+reason, there are several other possible keyword/argument pairs which
+influence the matching process.
+
+Many submode regions are marked by paired delimiters. For example, the
+tags used by Mason (@pxref{Mason}) include @samp{<%init>...</%init>} and
+@samp{<%args>...</%args>}. It would be possible to write a separate
+submode class for each type of region, but there is an easier way: the
+keyword argument @code{:save-matches}. If supplied and non-nil, it
+causes the regular expression @code{:back}, before being searched for,
+to be formatted by replacing all strings of the form @samp{~@var{N}}
+(where @var{N} is an integer) with the corresponding numbered
+subexpression of the match for @code{:front}. As an example, here is an
+excerpt from the @code{here-doc} submode class. @xref{Here-documents},
+for more information about this submode.
+
+@lisp
+:front "<<\\([a-zA-Z0-9_-]+\\)"
+:back "^~1$"
+:save-matches 1
+@end lisp
+
+The regular expression for @code{:front} matches @samp{<<} followed by a
+string of one or more alphanumeric characters, underscores, and dashes.
+The latter string, which happens to be the name of the here-document, is
+saved as the first subexpression, since it is surrounded by
+@samp{\(...\)}. Then, because the value of @code{:save-matches} is
+present and non-nil, the string @samp{~1} is replaced in the value of
+@code{:back} by the name of the here-document, thus creating a regular
+expression to match the correct ending delimiter.
+
+
+@node Region Placement, Submode Groups, Paired Delimiters, Writing Classes
+@comment node-name, next, previous, up
+@section Placing Submode Regions Precisely
+
+Normally, a submode region begins immediately after the end of the
+string matching the @code{:front} regular expression and ends
+immediately before the beginning of the string matching the @code{:back}
+regular expression. This can be changed with the keywords
+@code{:include-front} and @code{:include-back}. If their arguments are
+@code{nil}, or they do not appear, the default behavior is unchanged.
+But if the argument of @code{:include-front} (respectively,
+@code{:include-back}) is non-nil, the submode region will begin
+(respectively, end) immediately before (respectively, after) the string
+matching the @code{:front} (respectively, @code{:back}) regular
+expression. In other words, these keywords specify whether or not the
+delimiter strings are @emph{included} in the submode region.
+
+When @code{:front} and @code{:back} are regexps, the delimiter is
+normally considered to be the entire matched region. This can be
+changed using the @code{:front-match} and @code{:back-match}
+keywords. The values of the keywords is a number specifying the
+submatch. This defaults to zero (specifying the whole regexp).
+
+Two more keywords which affect the placement of the region
+@code{:front-offset} and @code{:back-offset}, which both take integers
+as arguments. The argument of @code{:front-offset} (respectively,
+@code{:back-offset}) gives the distance in characters from the beginning
+(respectively, ending) location specified so far, to the actual point
+where the submode region begins (respectively, ends). For example, if
+@code{:include-front} is nil or unsupplied and @code{:front-offset} is
+2, the submode region will begin two characters after the end of the
+match for @code{:front}, and if @code{:include-back} is non-nil and
+@code{:back-offset} is -1, the region will end one character before the
+end of the match for @code{:back}.
+
+In addition to integers, the arguments of @code{:front-offset} and
+@code{:back-offset} can be functions which are invoked to move the point
+from the position specified by the matches and inclusions to the correct
+beginning or end of the submode region, or lists whose elements are
+either functions or numbers and whose effects are applied in sequence.
+To help disentangle these options, here is another excerpt from the
+@code{here-doc} submode class:
+
+@lisp
+:front "<<\\([a-zA-Z0-9_-]+\\)"
+:front-offset (end-of-line 1)
+:back "^~1$"
+:save-matches 1
+@end lisp
+
+Here the value of @code{:front-offset} is the list @code{(end-of-line
+1)}, meaning that from the end of the match for @code{:front}, go to the
+end of the line, and then one more character forward (thus to the
+beginning of the next line), and begin the submode region there. This
+coincides with the normal behavior of here-documents: they begin on the
+following line and go until the ending flag.
+
+If the @code{:back} should not be able to start a new submode region,
+set the @code{:end-not-begin} keyword to non-nil.
+
+@node Submode Groups, Calculated Submodes, Region Placement, Writing Classes
+@comment node-name, next, previous, up
+@section Defining Groups of Submodes
+
+Sometimes more than one submode class is required to accurately reflect
+the behavior of a single type of syntax. For example, Mason has three
+very different types of Perl regions: blocks bounded by matched tags
+such as @samp{<%perl>...</%perl>}, inline output expressions bounded by
+@samp{<%...%>}, and single lines of code which simply begin with a
+@samp{%} character. In cases like these, it is possible to specify an
+``umbrella'' class, to turn all these classes on or off together.
+
+@defun mmm-add-group @var{group} @var{classes}
+The submode classes @var{classes}, which should be a list of lists,
+similar to what might be passed to @code{mmm-add-classes}, are added
+just as by that function. Furthermore, another class named
+@var{group} is added, which encompasses all the classes in
+@var{classes}.
+@end defun
+
+Technically, an group class is specified with a @code{:classes} keyword
+argument, and the subsidiary classes are given a non-nil @code{:private}
+keyword argument to make them invisible. But in general, all you should
+ever need to know is how to invoke the function above.
+
+@defun mmm-add-to-group @var{group} @var{classes}
+Adds a list of classes to an already existing group. This can be
+used, for instance, to add a new quoting definition to @var{html-js}
+using this example to add the quote characters ``%=%'':
+
+@lisp
+(mmm-add-to-group 'html-js '((js-html
+ :submode javascript
+ :face mmm-code-submode-face
+ :front "%=%"
+ :back "%=%"
+ :end-not-begin t)))
+@end lisp
+@end defun
+
+
+@node Calculated Submodes, Calculated Faces, Submode Groups, Writing Classes
+@comment node-name, next, previous, up
+@section Calculating the Correct Submode
+
+In most cases, the author of a submode class will know in advance what
+major mode to use, such as @code{text-mode} or @code{c++-mode}. If
+there are multiple possible modes that the user might desire, then
+@code{mmm-major-mode-preferences} should be used (@pxref{Preferred
+Modes}). The function @code{mmm-set-major-mode-preferences} can be
+used, with a third argument, to ensure than the mode is present.
+
+In some cases, however, the author has no way of knowing in advance even
+what language the submode region will be in. The @code{here-doc} class
+is one of these. In such cases, instead of the @code{:submode} keyword,
+the @code{:match-submode} keyword must be used. Its argument should be
+a function, probably written by the author of the submode class, which
+calculates what major mode each region should use.
+
+It is invoked immediately after a match is found for @code{:front}, and
+is passed one argument: a string representing the front delimiter.
+Normally this string is simply whatever was matched by @code{:front},
+but this can be changed with the keyword @code{:front-form}
+(@pxref{Delimiters}). The function should then return a symbol
+that would be a valid argument to @code{:submode}: either the name of a
+mode, or that of a language to look up a preferred mode. If it detects
+an invalid match---for example, the user has specified a mode which is
+not available---it should @code{(signal 'mmm-no-matching-submode nil)}.
+
+Since here-documents can contain code in any language, the
+@code{here-doc} submode class uses @code{:match-submode} rather than
+@code{:submode}. The function it uses is @code{mmm-here-doc-get-mode},
+defined in @file{mmm-sample.el}, which inspects the name of the
+here-document for flags indicating the proper mode. For example, this
+code should probably be in @code{perl-mode} (or @code{cperl-mode}):
+
+@example
+print <<PERL;
+s/foo/bar/g;
+PERL
+@end example
+
+This function is also a good example of proper elisp hygiene: when
+writing accessory functions for a submode class, they should usually be
+prefixed with @samp{mmm-} followed by the name of the submode class, to
+avoid namespace conflicts.
+
+
+@node Calculated Faces, Insertion Commands, Calculated Submodes, Writing Classes
+@comment node-name, next, previous, up
+@section Calculating the Correct Highlight Face
+
+As explained in @ref{Basic Classes}, the keyword @code{:face} should be
+used to specify which of the standard submode faces (@pxref{Region
+Coloring}) a submode region should be highlighted with under high
+decoration. However, sometimes the function of a region can depend on
+the form of the delimiters as well. In this case, a more flexible
+alternative to @code{:face} is @code{:match-face}. Its value can be a
+function, which is called with one argument---the form of the front
+delimiter, as with @code{:match-submode}---and should return the face to
+use. A more common value for @code{:match-face} is an association list,
+a list of pairs @code{(@var{delim} . @var{face})}, each specifying that
+if the delimiter is @var{delim}, the corresponding region should be
+highlighted with @var{face}. For example, here is an excerpt from the
+@code{embperl} submode class:
+
+@lisp
+:submode perl
+:front "\\[\\([-\\+!\\*\\$]\\)"
+:back "~1\\]"
+:save-matches 1
+:match-face (("[+" . mmm-output-submode-face)
+ ("[-" . mmm-code-submode-face)
+ ("[!" . mmm-init-submode-face)
+ ("[*" . mmm-code-submode-face)
+ ("[$" . mmm-special-submode-face))
+@end lisp
+
+Thus, regions beginning with @samp{[+} are highlighted as output
+expressions, which they are, while @samp{[-} and @samp{[*} regions are
+highlighted as simple executed code, and so on. Note that
+@var{mmm-submode-decoration-level} must be set to 2 (high decoration)
+for different faces to be displayed.
+
+
+@node Insertion Commands, Region Names, Calculated Faces, Writing Classes
+@comment node-name, next, previous, up
+@section Specifying Insertion Commands
+
+As described in @ref{Insertion}, submode classes can specify key
+sequences which automatically insert submode regions, with delimiters
+already in place. This is done by the keyword argument @code{:insert}.
+Its value should be a list, each element of which specifies a single
+insertion key sequence. As an example, consider the following insertion
+key sequence specifier, from the @code{embperl} submode class:
+
+@lisp
+(?p embperl "Region Type (Character): "
+ @@ "[" str @@ " " _ " " @@ str "]" @@)
+@end lisp
+
+As you can see, the specifier is a list. The first element of the list
+is the character @samp{p}. (The question mark tells Emacs that this is
+a character object, not a one-character symbol.) In general, the first
+element can be any key, including both characters such as @samp{?p} and
+function keys such as @samp{return}. It can also be a dotted pair in
+which the first element is a modifier symbol such as @code{meta}, and
+the second is a character or function key. The use of any other
+modifier than meta is discouraged, as `mmm-insert-modifiers' is
+sometimes set to \(control), and other modifiers are not very portable.
+The second element is a symbol identifying this key sequence. The third
+element is a prompt string which is used to ask the user for input when
+this key sequence is invoked. If it is nil, the user is not prompted.
+
+The rest of the list specifies the actual text to be inserted, where the
+submode region and delimiters should be, and where the point should end
+up. (Actually, this string is simply passed to @code{skeleton-insert};
+see the documentation string of that function for more details on the
+permissible elements of such a skeleton.) Strings and variable names
+are inserted and interpolated. The value entered by the user when
+prompted, if any, is available in the variable @code{str}. The final
+location of the point (or the text around which the region is to be
+wrapped) is marked with a single underscore @samp{_}. Finally, the
+@@-signs mark the delimiters and submode regions. There should be four
+@@-signs: one at the beginning of the front delimiter, one at the
+beginning of the submode region, one at the end of the submode region,
+and one at the end of the back delimiter.
+
+The above key sequence, bound by default to @kbd{C-c % p}, always
+prompts the user for the type of region to insert. It can also be
+convenient to have separate key sequences for each type of region to be
+inserted, such as @kbd{C-c % +} for @samp{[+...+]} regions, @kbd{C-c %
+-} for @samp{[-...-]} regions, and so on. So that the whole skeleton
+doesn't have to be written out half a dozen times, there is a shortcut
+syntax, as follows:
+
+@lisp
+(?+ embperl+ ?p . "+")
+@end lisp
+
+If the key sequence specification is a dotted list with four elements,
+as this example is, it means to use the skeleton defined for the key
+sequence given as the third element (@code{?p}), but to pass it the
+fourth (dotted) element (@code{"+"}) as the `str' variable; the user is
+not prompted.
+
+
+@node Region Names, Other Hooks, Insertion Commands, Writing Classes
+@comment node-name, next, previous, up
+@section Giving Names to Submode Regions for Grouping
+
+Submode regions can be given ``names'' which are used for grouping.
+Names are always strings and are compared as strings. Regions with
+the same name are considered part of the same chunk of code. This is
+used by the syntax and fontification functions. Unnamed regions are
+not grouped with any others.
+
+By default, regions are nameless, but with the @code{:match-name}
+keyword argument a name can be supplied. This argument must be a
+string or a function. If it is a function, it is passed a string
+representing the front delimiter found, and must return the name to
+use. If it is a string, it is used as-is for the name, unless
+@code{:save-name} has a non-nil value, in which case expressions such
+as @samp{~1} are substituted with the corresponding matched
+subexpression from @code{:front}. This is the same as how
+@code{:back} is interpreted when @code{:save-matches} is non-nil.
+
+As a special optimization for region insertion (@pxref{Insertion
+Commands}), the argument @code{:skel-name} can be set to a non-nil
+value, in which case the insertion code will use the user-prompted
+string value as the region name, instead of going through the normal
+matching procedure.
+
+
+@node Other Hooks, Delimiters, Region Names, Writing Classes
+@comment node-name, next, previous, up
+@section Other Hooks into the Scanning Process
+
+Sometimes, even the flexibility allowed by all the keyword arguments
+discussed so far is insufficient to correctly match submode regions.
+There are several other keyword arguments which accept custom functions
+to be invoked at various points in the MMM-ification process.
+
+First of all, the arguments of @code{:front} and @code{:back}, in
+addition to regular expressions, can be themselves functions. Such
+functions should ``act like'' a regular expression search: they should
+start searching at point, take one argument as a limit for the search,
+and return its result by setting the match data (presumably by calling
+some regexp matching function).
+
+This is rarely necessary, however, because often all that is needed is a
+simple regexp search, followed by some sort of verification. The
+keyword arguments @code{:front-verify} and @code{:back-verify}, if
+supplied, may be functions which are invoked after a match is found for
+@code{:front} or @code{:back}, respectively, and should inspect the
+match data (such as with @code{match-string}) and return non-nil if a
+submode region should be begun at this match, nil if this match should
+be ignored and the search continue after it.
+
+The keyword argument @code{:creation-hook}, if supplied, should be a
+function that is invoked whenever a submode region of this class is
+created, with point at the beginning of the new region. This can be
+used, for example, to set local variables appropriately.
+
+Finally, the entire MMM-ification process has a ``back door'' which
+allows class authors to take control of the entire thing. If the
+keyword argument @code{:handler} is supplied, it overrides any other
+processing and is called, and passed all other class keyword arguments,
+instead of @code{mmm-ify} to create submode regions. If you need to
+write a handler function, I suggest looking at the source for
+@code{mmm-ify} to get an idea of what must be done.
+
+
+@node Delimiters, Misc Keywords, Other Hooks, Writing Classes
+@comment node-name, next, previous, up
+@section Controlling the Delimiter Regions and Forms
+
+MMM also makes overlays for the delimiter regions, to keep track of
+their position and form. Normally, the front delimiter overlay starts
+at the beginning of the match for @code{:front} and ends at the
+beginning of the submode region overlay, while the back delimiter
+overlay starts at the end of the submode region overlay and ends at
+the end of the match for @code{:back}. You can supply offsets from
+these positions using the keyword arguments @code{:front-delim} and
+@code{:back-delim}, which take values of the same sort as
+@code{:front-offset} and @code{:back-offset}.
+
+In addition, the delimiter regions can be in a major mode of their
+own. There are usually only two meaningful modes to use: the primary
+mode or a non-mode like fundamental-mode. These correspond to the
+following two situations:
+
+@itemize
+@item
+If the delimiter syntax which specifies the submode regions is
+something @emph{added to} the syntax of the primary mode by a
+pre-interpreter, then the delimiter regions should be in a non-mode.
+This is the case, for example, with all server-side HTML script
+extensions, such as @xref{Mason}, @xref{Embperl}, and @xref{ePerl}.
+It is also the case for literate programming such as @xref{Noweb}.
+This is the default behavior. The non-mode used is controlled by the
+variable @code{mmm-delimiter-mode}, which defaults to
+fundamental-mode.
+
+@item
+If, on the other hand, the delimiter syntax and inclusion of different
+modes is an @emph{intrinsic part} of the primary mode, then the
+delimiter regions should remain in the primary mode. This is the
+case, for example, with @xref{Embedded CSS}, and @xref{Javascript},
+since the @code{<style>} and @code{<script>} tags are perfectly valid
+HTML. In this case, you should give the keyword parameter
+@code{:delimiter-mode} with a value of @code{nil}, meaning to use the
+primary mode.
+@end itemize
+
+The keyword parameter @code{:delimiter-mode} can be given any major
+mode as an argument, but the above two situations should cover the
+vast majority of cases.
+
+The delimiter regions can also be highlighted, if you wish. The
+keyword parameters @code{:front-face} and @code{:back-face} may be
+faces specifying how to highlight these regions under high
+decoration. Under low decoration, the value of the variable
+@code{mmm-delimiter-face} is used (by default, nothing), and of course
+under no decoration there is no coloring.
+
+Finally, for each submode region overlay, MMM Mode stores the ``form''
+of the front and back delimiters, which are regular expressions that
+match the delimiters. At present these are not used for much, but in
+the future they may be used to help with automatic updating of regions
+as you type. Normally, the form stored is the result of evaluating
+the expression @code{(regexp-quote (match-string 0))} after each match
+is found.
+
+You can customize this with the keyword argument @code{:front-form}
+(respectively, @code{:back-form}). If it is a string, it is used
+verbatim for the front (respectively, back) form. If it is a function,
+that function is called and should inspect the match data and return the
+regular expression to use as the form.
+
+In addition, the form itself can be set to a function, by giving a
+one-element list containing only that function as the argument to
+@code{:front-form} or @code{:back-form}. Such a function should take
+1-2 arguments. The first argument is the overlay to match the delimiter
+for. If the second is non-nil, it means to insert the delimiter and
+adjust the overlay; if nil it means to match the delimiter and return
+the result in the match data.
+
+
+@node Misc Keywords, , Delimiters, Writing Classes
+@comment node-name, next, previous, up
+@section Miscellaneous Other Keyword Arguments
+
+You can specify whether delimiter searches should be case-sensitive with
+the keyword argument @code{:case-fold-search}. It defaults to @code{t},
+meaning that case should be ignored. See the documentation for the
+variable @code{case-fold-search}.
+
+@node Indices, , Writing Classes, Top
+@comment node-name, next, previous, up
+@chapter Indices
+
+@menu
+* Concept Index:: Index of MMM Mode Concepts.
+* Function Index:: Index of functions and variables.
+* Keystroke Index:: Index of key bindings in MMM Mode.
+@end menu
+
+@node Concept Index, Function Index, Indices, Indices
+@comment node-name, next, previous, up
+@section Concept Index
+
+@printindex cp
+
+
+@node Function Index, Keystroke Index, Concept Index, Indices
+@comment node-name, next, previous, up
+@section Function and Variable Index
+
+@printindex fn
+
+
+@node Keystroke Index, , Function Index, Indices
+@comment node-name, next, previous, up
+@section Keystroke Index
+
+@printindex ky
+
+
+@bye
+
+@c Local Variables:
+@c mode: texinfo
+@c mode: font-lock
+@c mode: outline-minor
+@c End: