[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/lispref/modes.texi,v
From: |
Richard M. Stallman |
Subject: |
[Emacs-diffs] Changes to emacs/lispref/modes.texi,v |
Date: |
Tue, 08 Aug 2006 17:39:01 +0000 |
CVSROOT: /cvsroot/emacs
Module name: emacs
Changes by: Richard M. Stallman <rms> 06/08/08 17:39:01
Index: modes.texi
===================================================================
RCS file: /cvsroot/emacs/emacs/lispref/modes.texi,v
retrieving revision 1.151
retrieving revision 1.152
diff -u -b -r1.151 -r1.152
--- modes.texi 7 Aug 2006 13:39:53 -0000 1.151
+++ modes.texi 8 Aug 2006 17:39:01 -0000 1.152
@@ -52,8 +52,8 @@
the @dfn{mode hook} as the one of the last steps of initialization.
This makes it easy for a user to customize the behavior of the mode,
by overriding the buffer-local variable assignments already made by
-the mode. Most minor modes also run a mode hook at their end. But
-hooks are used in other contexts too. For example, the hook
+the mode. Most minor mode functions also run a mode hook at the end.
+But hooks are used in other contexts too. For example, the hook
@code{suspend-hook} runs just before Emacs suspends itself
(@pxref{Suspending Emacs}).
@@ -66,17 +66,16 @@
@cindex abnormal hook
If the hook variable's name does not end with @samp{-hook}, that
-indicates it is probably an @dfn{abnormal hook}. Then you should look at its
-documentation to see how to use the hook properly.
-
- @dfn{Abnormal hooks} are hooks in which the functions are called
-with arguments, or the return values are used in some way. By
-convention, abnormal hook names end in @samp{-functions} or
address@hidden You can use @code{add-hook} to add a function to the
-list, but you must take care in writing the function.
-
- If the variable's name ends in @samp{-function}, then its value
-is just a single function, not a list of functions.
+indicates it is probably an @dfn{abnormal hook}. That means the hook
+functions are called with arguments, or their return values are used
+in some way. The hook's documentation says how the functions are
+called. You can use @code{add-hook} to add a function to an abnormal
+hook, but you must write the function to follow the hook's calling
+convention.
+
+ By convention, abnormal hook names end in @samp{-functions} or
address@hidden If the variable's name ends in @samp{-function}, then
+its value is just a single function, not a list of functions.
Here's an example that uses a mode hook to turn on Auto Fill mode when
in Lisp Interaction mode:
@@ -95,12 +94,12 @@
in the order specified.
If a hook variable has a address@hidden value, that value should be a
-list of functions. Each function in this list is called,
-consecutively, with no arguments.
+list of functions. @code{run-hooks} calls all the functions, one by
+one, with no arguments.
-A hook variable can also be a single function (either a lambda
-expression or a symbol with a function definition) to be called. This
-use is considered obsolete.
+The hook variable's value can also be a single function---either a
+lambda expression or a symbol with a function definition---which
address@hidden calls. But this usage is obsolete.
@end defun
@defun run-hook-with-args hook &rest args
@@ -357,9 +356,10 @@
@item
Major modes modes for editing text should not define @key{RET} to do
-anything other than insert a newline. The command to insert a newline
-and then indent is @kbd{C-j}. It is ok for more specialized modes,
-such as Info mode, to redefine @key{RET} to something else.
+anything other than insert a newline. However, it is ok for
+specialized modes for text that users don't directly edit, such as
+Dired and Info modes, to redefine @key{RET} to do something entirely
+different.
@item
Major modes should not alter options that are primarily a matter of user
@@ -801,101 +801,92 @@
@subsection Generic Modes
@cindex generic mode
address@hidden modes} are simple major modes with basic support for
+ @dfn{Generic modes} are simple major modes with basic support for
comment syntax and Font Lock mode. To define a generic mode, use the
macro @code{define-generic-mode}. See the file @file{generic-x.el}
for some examples of the use of @code{define-generic-mode}.
@defmac define-generic-mode mode comment-list keyword-list font-lock-list
auto-mode-list function-list &optional docstring
-This macro creates a new generic mode. The argument @var{mode} (an
-unquoted symbol) is the major mode command. The optional argument
address@hidden is the documentation for the mode command. If you do
-not supply it, @code{define-generic-mode} uses a default documentation
-string instead.
-
address@hidden is a list in which each element is either a
-character, a string of one or two characters, or a cons cell. A
-character or a string is set up in the mode's syntax table as a
+This macro defines a generic mode command named @var{mode} (a symbol,
+not quoted). The optional argument @var{docstring} is the
+documentation for the mode command. If you do not supply it,
address@hidden generates one by default.
+
+The argument @var{comment-list} is a list in which each element is
+either a character, a string of one or two characters, or a cons cell.
+A character or a string is set up in the mode's syntax table as a
``comment starter.'' If the entry is a cons cell, the @sc{car} is set
up as a ``comment starter'' and the @sc{cdr} as a ``comment ender.''
(Use @code{nil} for the latter if you want comments to end at the end
-of the line.) Note that the syntax table has limitations about what
-comment starters and enders are actually possible. @xref{Syntax
-Tables}.
-
address@hidden is a list of keywords to highlight with
address@hidden Each keyword should be a string.
address@hidden is a list of additional expressions to highlight.
-Each element of this list should have the same form as an element of
address@hidden @xref{Search-based Fontification}.
-
address@hidden is a list of regular expressions to add to the
-variable @code{auto-mode-alist}. These regular expressions are added
-when Emacs runs the macro expansion.
-
address@hidden is a list of functions to call to do some
-additional setup. The mode command calls these functions just before
-it runs the mode hook variable @address@hidden
+of the line.) Note that the syntax table mechanism has limitations
+about what comment starters and enders are actually possible.
address@hidden Tables}.
+
+The argument @var{keyword-list} is a list of keywords to highlight
+with @code{font-lock-keyword-face}. Each keyword should be a string.
+Meanwhile, @var{font-lock-list} is a list of additional expressions to
+highlight. Each element of this list should have the same form as an
+element of @code{font-lock-keywords}. @xref{Search-based
+Fontification}.
+
+The argument @var{auto-mode-list} is a list of regular expressions to
+add to the variable @code{auto-mode-alist}. They are added by the execution
+of the @code{define-generic-mode} form, not by expanding the macro call.
+
+Finally, @var{function-list} is a list of functions for the mode
+command to call for additional setup. It calls these functions just
+before it runs the mode hook variable @address@hidden
@end defmac
@node Mode Hooks
@subsection Mode Hooks
- The two last things a major mode function should do is run its mode
-hook and finally the mode independent normal hook
address@hidden If the major mode is a derived
-mode, that is if it calls another major mode (the parent mode) in its
-body, then the parent's mode hook is run just before the derived
-mode's hook. Neither the parent's mode hook nor
address@hidden are run at the end of the actual
-call to the parent mode. This applies recursively if the parent mode
-has itself a parent. That is, the mode hooks of all major modes
-called directly or indirectly by the major mode function are all run
-in sequence at the end, just before
address@hidden
-
- These conventions are new in Emacs 22, and some major modes
-implemented by users do not follow them yet. So if you put a function
-onto @code{after-change-major-mode-hook}, keep in mind that some modes
-will fail to run it. If a user complains about that, you can respond,
-``That major mode fails to follow Emacs conventions, and that's why it
-fails to work. Please fix the major mode.'' In most cases, that is
-good enough, so go ahead and use @code{after-change-major-mode-hook}.
-However, if a certain feature needs to be completely reliable,
-it should not use @code{after-change-major-mode-hook} as of yet.
+ Every major mode function should finish by running its mode hook and
+the mode-independent normal hook @code{after-change-major-mode-hook}.
+It does this by calling @code{run-mode-hooks}. If the major mode is a
+derived mode, that is if it calls another major mode (the parent mode)
+in its body, it should do this inside @code{delay-mode-hooks} so that
+the parent won't run these hooks itself. Instead, the derived mode's
+call to @code{run-mode-hooks} runs the parent's mode hook too.
address@hidden Mode Conventions}.
+
+ Emacs versions before Emacs 22 did not have @code{delay-mode-hooks}.
+When user-implemented major modes have not been updated to use it,
+they won't entirely follow these conventions: they may run the
+parent's mode hook too early, or fail to run
address@hidden If you encounter such a major
+mode, please correct it to follow these conventions.
When you defined a major mode using @code{define-derived-mode}, it
automatically makes sure these conventions are followed. If you
-define a major mode ``from scratch,'' not using
address@hidden, make sure the major mode command follows
-these and other conventions. @xref{Major Mode Conventions}. You use
-these functions to do it properly.
+define a major mode ``by hand,'' not using @code{define-derived-mode},
+use the following functions to handle these conventions automatically.
@defun run-mode-hooks &rest hookvars
Major modes should run their mode hook using this function. It is
similar to @code{run-hooks} (@pxref{Hooks}), but it also runs
@code{after-change-major-mode-hook}.
-When the call to this function is dynamically inside a
address@hidden form, this function does not run any hooks.
+When this function is called during the execution of a
address@hidden form, it does not run the hooks immediately.
Instead, it arranges for the next call to @code{run-mode-hooks} to run
address@hidden
+them.
@end defun
@defmac delay-mode-hooks address@hidden
-This macro executes @var{body} like @code{progn}, but all calls to
address@hidden inside @var{body} delay running their hooks.
-They will be run by the first call to @code{run-mode-hooks} after exit
-from @code{delay-mode-hooks}. This is the proper way for a major mode
-command to invoke its parent mode.
+When one major mode command calls another, it should do so inside of
address@hidden
+
+This macro executes @var{body}, but tells all @code{run-mode-hooks}
+calls during the execution of @var{body} to delay running their hooks.
+The hooks will actually run during the next call to
address@hidden after the end of the @code{delay-mode-hooks}
+construct.
@end defmac
@defvar after-change-major-mode-hook
-Every major mode function should run this normal hook at its very end.
-It normally does not need to do so explicitly. Indeed, a major mode
-function should normally run its mode hook with @code{run-mode-hooks}
-as the very last thing it does, and the last thing
address@hidden does is run @code{after-change-major-mode-hook}.
+This is a normal hook run by @code{run-mode-hooks}. It is run at the
+very end of every properly-written major mode function.
@end defvar
@node Example Major Modes
@@ -1058,9 +1049,8 @@
@end group
@end smallexample
- Much code is shared among the three Lisp modes. The following
-function sets various variables; it is called by each of the major Lisp
-mode functions:
+ The three modes for Lisp share much of their code. For instance,
+each calls the following function to set various variables:
@smallexample
@group
@@ -1072,13 +1062,10 @@
@end group
@end smallexample
- Functions such as @code{forward-paragraph} use the value of the
address@hidden variable. Since Lisp code is different from
-ordinary text, the @code{paragraph-start} variable needs to be set
-specially to handle Lisp. Also, comments are indented in a special
-fashion in Lisp and the Lisp modes need their own mode-specific
address@hidden The code to set these variables is the
-rest of @code{lisp-mode-variables}.
+ In Lisp and most programming languages, we want the paragraph
+commands to treat only blank lines as paragraph separators. And the
+modes should undestand the Lisp conventions for comments. The rest of
address@hidden sets this up:
@smallexample
@group
- [Emacs-diffs] Changes to emacs/lispref/modes.texi,v, Stefan Monnier, 2006/08/03
- [Emacs-diffs] Changes to emacs/lispref/modes.texi,v, Stefan Monnier, 2006/08/03
- [Emacs-diffs] Changes to emacs/lispref/modes.texi,v, Juanma Barranquero, 2006/08/03
- [Emacs-diffs] Changes to emacs/lispref/modes.texi,v, Chong Yidong, 2006/08/07
- [Emacs-diffs] Changes to emacs/lispref/modes.texi,v,
Richard M. Stallman <=
- [Emacs-diffs] Changes to emacs/lispref/modes.texi,v, Stefan Monnier, 2006/08/31
- [Emacs-diffs] Changes to emacs/lispref/modes.texi,v, Richard M. Stallman, 2006/08/31