aboutsummaryrefslogtreecommitdiffhomepage
path: root/contrib/mmm/mmm.texinfo
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/mmm/mmm.texinfo')
-rw-r--r--contrib/mmm/mmm.texinfo2117
1 files changed, 0 insertions, 2117 deletions
diff --git a/contrib/mmm/mmm.texinfo b/contrib/mmm/mmm.texinfo
deleted file mode 100644
index aa0b0eaf..00000000
--- a/contrib/mmm/mmm.texinfo
+++ /dev/null
@@ -1,2117 +0,0 @@
-\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: