diff options
| author | Karoly Lorentey | 2006-10-14 16:56:21 +0000 |
|---|---|---|
| committer | Karoly Lorentey | 2006-10-14 16:56:21 +0000 |
| commit | 3f87f67ee215ffeecbd2f53bd7f342cdf03f47df (patch) | |
| tree | 16f2af9111af08a94d608d96a957f5c3ec5effcc /lispref/modes.texi | |
| parent | 350e4fb815d7413ef6d339dd664014706f742927 (diff) | |
| parent | 7a210b69c7f92650c524766d1b9d3f3eefdd67c7 (diff) | |
| download | emacs-3f87f67ee215ffeecbd2f53bd7f342cdf03f47df.tar.gz emacs-3f87f67ee215ffeecbd2f53bd7f342cdf03f47df.zip | |
Merged from emacs@sv.gnu.org
Patches applied:
* emacs@sv.gnu.org/emacs--devo--0--patch-371
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-372
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-373
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-374
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-375
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-376
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-377
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-378
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-379
Merge from erc--emacs--21
* emacs@sv.gnu.org/emacs--devo--0--patch-380
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-381
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-382
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-383
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-384
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-385
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-386
Update from erc--emacs--22
* emacs@sv.gnu.org/emacs--devo--0--patch-387
Fix ERC bug introduced in last patch
* emacs@sv.gnu.org/emacs--devo--0--patch-388
Update from erc--emacs--22
* emacs@sv.gnu.org/emacs--devo--0--patch-389
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-390
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-391
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-392
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-393
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-394
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-395
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-396
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-397
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-398
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-399
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-400
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-401
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-402
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-403
Rcirc update from Ryan Yeske
* emacs@sv.gnu.org/emacs--devo--0--patch-404
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-405
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-406
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-407
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-408
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-409
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-410
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-411
Miscellaneous tq-related fixes.
* emacs@sv.gnu.org/emacs--devo--0--patch-412
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-121
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-122
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-123
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-124
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-125
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-126
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-127
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-581
Diffstat (limited to 'lispref/modes.texi')
| -rw-r--r-- | lispref/modes.texi | 842 |
1 files changed, 420 insertions, 422 deletions
diff --git a/lispref/modes.texi b/lispref/modes.texi index b0c057ec1c9..f8afcd8a829 100644 --- a/lispref/modes.texi +++ b/lispref/modes.texi | |||
| @@ -43,18 +43,19 @@ up in the init file (@pxref{Init File}), but Lisp programs can set them also. | |||
| 43 | 43 | ||
| 44 | @cindex normal hook | 44 | @cindex normal hook |
| 45 | Most of the hooks in Emacs are @dfn{normal hooks}. These variables | 45 | Most of the hooks in Emacs are @dfn{normal hooks}. These variables |
| 46 | contain lists of functions to be called with no arguments. When the | 46 | contain lists of functions to be called with no arguments. By |
| 47 | hook name ends in @samp{-hook}, that tells you it is normal. We try to | 47 | convention, whenever the hook name ends in @samp{-hook}, that tells |
| 48 | make all hooks normal, as much as possible, so that you can use them in | 48 | you it is normal. We try to make all hooks normal, as much as |
| 49 | a uniform way. | 49 | possible, so that you can use them in a uniform way. |
| 50 | 50 | ||
| 51 | Every major mode function is supposed to run a normal hook called the | 51 | Every major mode function is supposed to run a normal hook called |
| 52 | @dfn{mode hook} as the last step of initialization. This makes it easy | 52 | the @dfn{mode hook} as the one of the last steps of initialization. |
| 53 | for a user to customize the behavior of the mode, by overriding the | 53 | This makes it easy for a user to customize the behavior of the mode, |
| 54 | buffer-local variable assignments already made by the mode. Most | 54 | by overriding the buffer-local variable assignments already made by |
| 55 | minor modes also run a mode hook at their end. But hooks are used in | 55 | the mode. Most minor mode functions also run a mode hook at the end. |
| 56 | other contexts too. For example, the hook @code{suspend-hook} runs | 56 | But hooks are used in other contexts too. For example, the hook |
| 57 | just before Emacs suspends itself (@pxref{Suspending Emacs}). | 57 | @code{suspend-hook} runs just before Emacs suspends itself |
| 58 | (@pxref{Suspending Emacs}). | ||
| 58 | 59 | ||
| 59 | The recommended way to add a hook function to a normal hook is by | 60 | The recommended way to add a hook function to a normal hook is by |
| 60 | calling @code{add-hook} (see below). The hook functions may be any of | 61 | calling @code{add-hook} (see below). The hook functions may be any of |
| @@ -65,20 +66,16 @@ globally or buffer-locally with @code{add-hook}. | |||
| 65 | 66 | ||
| 66 | @cindex abnormal hook | 67 | @cindex abnormal hook |
| 67 | If the hook variable's name does not end with @samp{-hook}, that | 68 | If the hook variable's name does not end with @samp{-hook}, that |
| 68 | indicates it is probably an @dfn{abnormal hook}. Then you should look at its | 69 | indicates it is probably an @dfn{abnormal hook}. That means the hook |
| 69 | documentation to see how to use the hook properly. | 70 | functions are called with arguments, or their return values are used |
| 71 | in some way. The hook's documentation says how the functions are | ||
| 72 | called. You can use @code{add-hook} to add a function to an abnormal | ||
| 73 | hook, but you must write the function to follow the hook's calling | ||
| 74 | convention. | ||
| 70 | 75 | ||
| 71 | If the variable's name ends in @samp{-functions} or @samp{-hooks}, | 76 | By convention, abnormal hook names end in @samp{-functions} or |
| 72 | then the value is a list of functions, but it is abnormal in that either | 77 | @samp{-hooks}. If the variable's name ends in @samp{-function}, then |
| 73 | these functions are called with arguments or their values are used in | 78 | its value is just a single function, not a list of functions. |
| 74 | some way. You can use @code{add-hook} to add a function to the list, | ||
| 75 | but you must take care in writing the function. (A few of these | ||
| 76 | variables, notably those ending in @samp{-hooks}, are actually | ||
| 77 | normal hooks which were named before we established the convention of | ||
| 78 | using @samp{-hook} for them.) | ||
| 79 | |||
| 80 | If the variable's name ends in @samp{-function}, then its value | ||
| 81 | is just a single function, not a list of functions. | ||
| 82 | 79 | ||
| 83 | Here's an example that uses a mode hook to turn on Auto Fill mode when | 80 | Here's an example that uses a mode hook to turn on Auto Fill mode when |
| 84 | in Lisp Interaction mode: | 81 | in Lisp Interaction mode: |
| @@ -96,12 +93,13 @@ arguments, and runs each hook in turn. Each argument should be a | |||
| 96 | symbol that is a normal hook variable. These arguments are processed | 93 | symbol that is a normal hook variable. These arguments are processed |
| 97 | in the order specified. | 94 | in the order specified. |
| 98 | 95 | ||
| 99 | If a hook variable has a non-@code{nil} value, that value may be a | 96 | If a hook variable has a non-@code{nil} value, that value should be a |
| 100 | function or a list of functions. (The former option is considered | 97 | list of functions. @code{run-hooks} calls all the functions, one by |
| 101 | obsolete.) If the value is a function (either a lambda expression or | 98 | one, with no arguments. |
| 102 | a symbol with a function definition), it is called. If it is a list | 99 | |
| 103 | that isn't a function, its elements are called, consecutively. All | 100 | The hook variable's value can also be a single function---either a |
| 104 | the hook functions are called with no arguments. | 101 | lambda expression or a symbol with a function definition---which |
| 102 | @code{run-hooks} calls. But this usage is obsolete. | ||
| 105 | @end defun | 103 | @end defun |
| 106 | 104 | ||
| 107 | @defun run-hook-with-args hook &rest args | 105 | @defun run-hook-with-args hook &rest args |
| @@ -187,7 +185,6 @@ to another major mode in the same buffer. | |||
| 187 | @menu | 185 | @menu |
| 188 | * Major Mode Basics:: | 186 | * Major Mode Basics:: |
| 189 | * Major Mode Conventions:: Coding conventions for keymaps, etc. | 187 | * Major Mode Conventions:: Coding conventions for keymaps, etc. |
| 190 | * Example Major Modes:: Text mode and Lisp modes. | ||
| 191 | * Auto Major Mode:: How Emacs chooses the major mode automatically. | 188 | * Auto Major Mode:: How Emacs chooses the major mode automatically. |
| 192 | * Mode Help:: Finding out how to use a mode. | 189 | * Mode Help:: Finding out how to use a mode. |
| 193 | * Derived Modes:: Defining a new major mode based on another major | 190 | * Derived Modes:: Defining a new major mode based on another major |
| @@ -195,6 +192,7 @@ to another major mode in the same buffer. | |||
| 195 | * Generic Modes:: Defining a simple major mode that supports | 192 | * Generic Modes:: Defining a simple major mode that supports |
| 196 | comment syntax and Font Lock mode. | 193 | comment syntax and Font Lock mode. |
| 197 | * Mode Hooks:: Hooks run at the end of major mode functions. | 194 | * Mode Hooks:: Hooks run at the end of major mode functions. |
| 195 | * Example Major Modes:: Text mode and Lisp modes. | ||
| 198 | @end menu | 196 | @end menu |
| 199 | 197 | ||
| 200 | @node Major Mode Basics | 198 | @node Major Mode Basics |
| @@ -214,14 +212,14 @@ specialized editing task, creating a new major mode is usually a good | |||
| 214 | idea. In practice, writing a major mode is easy (in contrast to | 212 | idea. In practice, writing a major mode is easy (in contrast to |
| 215 | writing a minor mode, which is often difficult). | 213 | writing a minor mode, which is often difficult). |
| 216 | 214 | ||
| 217 | If the new mode is similar to an old one, it is often unwise to modify | 215 | If the new mode is similar to an old one, it is often unwise to |
| 218 | the old one to serve two purposes, since it may become harder to use and | 216 | modify the old one to serve two purposes, since it may become harder |
| 219 | maintain. Instead, copy and rename an existing major mode definition | 217 | to use and maintain. Instead, copy and rename an existing major mode |
| 220 | and alter the copy---or define a @dfn{derived mode} (@pxref{Derived | 218 | definition and alter the copy---or use @code{define-derived-mode} to |
| 221 | Modes}). For example, Rmail Edit mode, which is in | 219 | define a @dfn{derived mode} (@pxref{Derived Modes}). For example, |
| 222 | @file{emacs/lisp/mail/rmailedit.el}, is a major mode that is very similar to | 220 | Rmail Edit mode is a major mode that is very similar to Text mode |
| 223 | Text mode except that it provides two additional commands. Its | 221 | except that it provides two additional commands. Its definition is |
| 224 | definition is distinct from that of Text mode, but uses that of Text mode. | 222 | distinct from that of Text mode, but uses that of Text mode. |
| 225 | 223 | ||
| 226 | Even if the new mode is not an obvious derivative of any other mode, | 224 | Even if the new mode is not an obvious derivative of any other mode, |
| 227 | it is convenient to use @code{define-derived-mode} with a @code{nil} | 225 | it is convenient to use @code{define-derived-mode} with a @code{nil} |
| @@ -287,8 +285,10 @@ Documentation}. | |||
| 287 | 285 | ||
| 288 | @item | 286 | @item |
| 289 | The major mode command should start by calling | 287 | The major mode command should start by calling |
| 290 | @code{kill-all-local-variables}. This is what gets rid of the | 288 | @code{kill-all-local-variables}. This runs the normal hook |
| 291 | buffer-local variables of the major mode previously in effect. | 289 | @code{change-major-mode-hook}, then gets rid of the buffer-local |
| 290 | variables of the major mode previously in effect. @xref{Creating | ||
| 291 | Buffer-Local}. | ||
| 292 | 292 | ||
| 293 | @item | 293 | @item |
| 294 | The major mode command should set the variable @code{major-mode} to the | 294 | The major mode command should set the variable @code{major-mode} to the |
| @@ -355,9 +355,11 @@ Rmail that do not allow self-insertion of text can reasonably redefine | |||
| 355 | letters and other printing characters as special commands. | 355 | letters and other printing characters as special commands. |
| 356 | 356 | ||
| 357 | @item | 357 | @item |
| 358 | Major modes must not define @key{RET} to do anything other than insert | 358 | Major modes modes for editing text should not define @key{RET} to do |
| 359 | a newline. The command to insert a newline and then indent is | 359 | anything other than insert a newline. However, it is ok for |
| 360 | @kbd{C-j}. Please keep this distinction uniform for all major modes. | 360 | specialized modes for text that users don't directly edit, such as |
| 361 | Dired and Info modes, to redefine @key{RET} to do something entirely | ||
| 362 | different. | ||
| 361 | 363 | ||
| 362 | @item | 364 | @item |
| 363 | Major modes should not alter options that are primarily a matter of user | 365 | Major modes should not alter options that are primarily a matter of user |
| @@ -427,10 +429,11 @@ other packages would interfere with them. | |||
| 427 | @item | 429 | @item |
| 428 | @cindex mode hook | 430 | @cindex mode hook |
| 429 | @cindex major mode hook | 431 | @cindex major mode hook |
| 430 | Each major mode should have a @dfn{mode hook} named | 432 | Each major mode should have a normal @dfn{mode hook} named |
| 431 | @code{@var{modename}-mode-hook}. The major mode command should run that | 433 | @code{@var{modename}-mode-hook}. The very last thing the major mode command |
| 432 | hook, with @code{run-mode-hooks}, as the very last thing it | 434 | should do is to call @code{run-mode-hooks}. This runs the mode hook, |
| 433 | does. @xref{Mode Hooks}. | 435 | and then runs the normal hook @code{after-change-major-mode-hook}. |
| 436 | @xref{Mode Hooks}. | ||
| 434 | 437 | ||
| 435 | @item | 438 | @item |
| 436 | The major mode command may start by calling some other major mode | 439 | The major mode command may start by calling some other major mode |
| @@ -488,281 +491,6 @@ that they may be evaluated more than once without adverse consequences. | |||
| 488 | Even if you never load the file more than once, someone else will. | 491 | Even if you never load the file more than once, someone else will. |
| 489 | @end itemize | 492 | @end itemize |
| 490 | 493 | ||
| 491 | @node Example Major Modes | ||
| 492 | @subsection Major Mode Examples | ||
| 493 | |||
| 494 | Text mode is perhaps the simplest mode besides Fundamental mode. | ||
| 495 | Here are excerpts from @file{text-mode.el} that illustrate many of | ||
| 496 | the conventions listed above: | ||
| 497 | |||
| 498 | @smallexample | ||
| 499 | @group | ||
| 500 | ;; @r{Create the syntax table for this mode.} | ||
| 501 | (defvar text-mode-syntax-table | ||
| 502 | (let ((st (make-syntax-table))) | ||
| 503 | (modify-syntax-entry ?\" ". " st) | ||
| 504 | (modify-syntax-entry ?\\ ". " st) | ||
| 505 | ;; Add `p' so M-c on `hello' leads to `Hello', not `hello'. | ||
| 506 | (modify-syntax-entry ?' "w p" st) | ||
| 507 | st) | ||
| 508 | "Syntax table used while in `text-mode'.") | ||
| 509 | @end group | ||
| 510 | |||
| 511 | ;; @r{Create the keymap for this mode.} | ||
| 512 | @group | ||
| 513 | (defvar text-mode-map | ||
| 514 | (let ((map (make-sparse-keymap))) | ||
| 515 | (define-key map "\e\t" 'ispell-complete-word) | ||
| 516 | (define-key map "\es" 'center-line) | ||
| 517 | (define-key map "\eS" 'center-paragraph) | ||
| 518 | map) | ||
| 519 | "Keymap for `text-mode'. | ||
| 520 | Many other modes, such as Mail mode, Outline mode | ||
| 521 | and Indented Text mode, inherit all the commands | ||
| 522 | defined in this map.") | ||
| 523 | @end group | ||
| 524 | @end smallexample | ||
| 525 | |||
| 526 | Here is how the actual mode command is defined now: | ||
| 527 | |||
| 528 | @smallexample | ||
| 529 | @group | ||
| 530 | (define-derived-mode text-mode nil "Text" | ||
| 531 | "Major mode for editing text written for humans to read. | ||
| 532 | In this mode, paragraphs are delimited only by blank or white lines. | ||
| 533 | You can thus get the full benefit of adaptive filling | ||
| 534 | (see the variable `adaptive-fill-mode'). | ||
| 535 | \\@{text-mode-map@} | ||
| 536 | Turning on Text mode runs the normal hook `text-mode-hook'." | ||
| 537 | @end group | ||
| 538 | @group | ||
| 539 | (make-local-variable 'text-mode-variant) | ||
| 540 | (setq text-mode-variant t) | ||
| 541 | ;; @r{These two lines are a feature added recently.} | ||
| 542 | (set (make-local-variable 'require-final-newline) | ||
| 543 | mode-require-final-newline) | ||
| 544 | (set (make-local-variable 'indent-line-function) 'indent-relative)) | ||
| 545 | @end group | ||
| 546 | @end smallexample | ||
| 547 | |||
| 548 | But here is how it was defined formerly, before | ||
| 549 | @code{define-derived-mode} existed: | ||
| 550 | |||
| 551 | @smallexample | ||
| 552 | @group | ||
| 553 | ;; @r{This isn't needed nowadays, since @code{define-derived-mode} does it.} | ||
| 554 | (defvar text-mode-abbrev-table nil | ||
| 555 | "Abbrev table used while in text mode.") | ||
| 556 | (define-abbrev-table 'text-mode-abbrev-table ()) | ||
| 557 | @end group | ||
| 558 | |||
| 559 | @group | ||
| 560 | (defun text-mode () | ||
| 561 | "Major mode for editing text intended for humans to read... | ||
| 562 | Special commands: \\@{text-mode-map@} | ||
| 563 | @end group | ||
| 564 | @group | ||
| 565 | Turning on text-mode runs the hook `text-mode-hook'." | ||
| 566 | (interactive) | ||
| 567 | (kill-all-local-variables) | ||
| 568 | (use-local-map text-mode-map) | ||
| 569 | @end group | ||
| 570 | @group | ||
| 571 | (setq local-abbrev-table text-mode-abbrev-table) | ||
| 572 | (set-syntax-table text-mode-syntax-table) | ||
| 573 | @end group | ||
| 574 | @group | ||
| 575 | ;; @r{These four lines are absent from the current version} | ||
| 576 | ;; @r{not because this is done some other way, but rather} | ||
| 577 | ;; @r{because nowadays Text mode uses the normal definition of paragraphs.} | ||
| 578 | (make-local-variable 'paragraph-start) | ||
| 579 | (setq paragraph-start (concat "[ \t]*$\\|" page-delimiter)) | ||
| 580 | (make-local-variable 'paragraph-separate) | ||
| 581 | (setq paragraph-separate paragraph-start) | ||
| 582 | (make-local-variable 'indent-line-function) | ||
| 583 | (setq indent-line-function 'indent-relative-maybe) | ||
| 584 | @end group | ||
| 585 | @group | ||
| 586 | (setq mode-name "Text") | ||
| 587 | (setq major-mode 'text-mode) | ||
| 588 | (run-mode-hooks 'text-mode-hook)) ; @r{Finally, this permits the user to} | ||
| 589 | ; @r{customize the mode with a hook.} | ||
| 590 | @end group | ||
| 591 | @end smallexample | ||
| 592 | |||
| 593 | @cindex @file{lisp-mode.el} | ||
| 594 | The three Lisp modes (Lisp mode, Emacs Lisp mode, and Lisp | ||
| 595 | Interaction mode) have more features than Text mode and the code is | ||
| 596 | correspondingly more complicated. Here are excerpts from | ||
| 597 | @file{lisp-mode.el} that illustrate how these modes are written. | ||
| 598 | |||
| 599 | @cindex syntax table example | ||
| 600 | @smallexample | ||
| 601 | @group | ||
| 602 | ;; @r{Create mode-specific table variables.} | ||
| 603 | (defvar lisp-mode-syntax-table nil "") | ||
| 604 | (defvar lisp-mode-abbrev-table nil "") | ||
| 605 | @end group | ||
| 606 | |||
| 607 | @group | ||
| 608 | (defvar emacs-lisp-mode-syntax-table | ||
| 609 | (let ((table (make-syntax-table))) | ||
| 610 | (let ((i 0)) | ||
| 611 | @end group | ||
| 612 | |||
| 613 | @group | ||
| 614 | ;; @r{Set syntax of chars up to @samp{0} to say they are} | ||
| 615 | ;; @r{part of symbol names but not words.} | ||
| 616 | ;; @r{(The digit @samp{0} is @code{48} in the @acronym{ASCII} character set.)} | ||
| 617 | (while (< i ?0) | ||
| 618 | (modify-syntax-entry i "_ " table) | ||
| 619 | (setq i (1+ i))) | ||
| 620 | ;; @r{@dots{} similar code follows for other character ranges.} | ||
| 621 | @end group | ||
| 622 | @group | ||
| 623 | ;; @r{Then set the syntax codes for characters that are special in Lisp.} | ||
| 624 | (modify-syntax-entry ? " " table) | ||
| 625 | (modify-syntax-entry ?\t " " table) | ||
| 626 | (modify-syntax-entry ?\f " " table) | ||
| 627 | (modify-syntax-entry ?\n "> " table) | ||
| 628 | @end group | ||
| 629 | @group | ||
| 630 | ;; @r{Give CR the same syntax as newline, for selective-display.} | ||
| 631 | (modify-syntax-entry ?\^m "> " table) | ||
| 632 | (modify-syntax-entry ?\; "< " table) | ||
| 633 | (modify-syntax-entry ?` "' " table) | ||
| 634 | (modify-syntax-entry ?' "' " table) | ||
| 635 | (modify-syntax-entry ?, "' " table) | ||
| 636 | @end group | ||
| 637 | @group | ||
| 638 | ;; @r{@dots{}likewise for many other characters@dots{}} | ||
| 639 | (modify-syntax-entry ?\( "() " table) | ||
| 640 | (modify-syntax-entry ?\) ")( " table) | ||
| 641 | (modify-syntax-entry ?\[ "(] " table) | ||
| 642 | (modify-syntax-entry ?\] ")[ " table)) | ||
| 643 | table)) | ||
| 644 | @end group | ||
| 645 | @group | ||
| 646 | ;; @r{Create an abbrev table for lisp-mode.} | ||
| 647 | (define-abbrev-table 'lisp-mode-abbrev-table ()) | ||
| 648 | @end group | ||
| 649 | @end smallexample | ||
| 650 | |||
| 651 | Much code is shared among the three Lisp modes. The following | ||
| 652 | function sets various variables; it is called by each of the major Lisp | ||
| 653 | mode functions: | ||
| 654 | |||
| 655 | @smallexample | ||
| 656 | @group | ||
| 657 | (defun lisp-mode-variables (lisp-syntax) | ||
| 658 | (when lisp-syntax | ||
| 659 | (set-syntax-table lisp-mode-syntax-table)) | ||
| 660 | (setq local-abbrev-table lisp-mode-abbrev-table) | ||
| 661 | @dots{} | ||
| 662 | @end group | ||
| 663 | @end smallexample | ||
| 664 | |||
| 665 | Functions such as @code{forward-paragraph} use the value of the | ||
| 666 | @code{paragraph-start} variable. Since Lisp code is different from | ||
| 667 | ordinary text, the @code{paragraph-start} variable needs to be set | ||
| 668 | specially to handle Lisp. Also, comments are indented in a special | ||
| 669 | fashion in Lisp and the Lisp modes need their own mode-specific | ||
| 670 | @code{comment-indent-function}. The code to set these variables is the | ||
| 671 | rest of @code{lisp-mode-variables}. | ||
| 672 | |||
| 673 | @smallexample | ||
| 674 | @group | ||
| 675 | (make-local-variable 'paragraph-start) | ||
| 676 | (setq paragraph-start (concat page-delimiter "\\|$" )) | ||
| 677 | (make-local-variable 'paragraph-separate) | ||
| 678 | (setq paragraph-separate paragraph-start) | ||
| 679 | @dots{} | ||
| 680 | @end group | ||
| 681 | @group | ||
| 682 | (make-local-variable 'comment-indent-function) | ||
| 683 | (setq comment-indent-function 'lisp-comment-indent)) | ||
| 684 | @dots{} | ||
| 685 | @end group | ||
| 686 | @end smallexample | ||
| 687 | |||
| 688 | Each of the different Lisp modes has a slightly different keymap. For | ||
| 689 | example, Lisp mode binds @kbd{C-c C-z} to @code{run-lisp}, but the other | ||
| 690 | Lisp modes do not. However, all Lisp modes have some commands in | ||
| 691 | common. The following code sets up the common commands: | ||
| 692 | |||
| 693 | @smallexample | ||
| 694 | @group | ||
| 695 | (defvar shared-lisp-mode-map () | ||
| 696 | "Keymap for commands shared by all sorts of Lisp modes.") | ||
| 697 | |||
| 698 | ;; @r{Putting this @code{if} after the @code{defvar} is an older style.} | ||
| 699 | (if shared-lisp-mode-map | ||
| 700 | () | ||
| 701 | (setq shared-lisp-mode-map (make-sparse-keymap)) | ||
| 702 | (define-key shared-lisp-mode-map "\e\C-q" 'indent-sexp) | ||
| 703 | (define-key shared-lisp-mode-map "\177" | ||
| 704 | 'backward-delete-char-untabify)) | ||
| 705 | @end group | ||
| 706 | @end smallexample | ||
| 707 | |||
| 708 | @noindent | ||
| 709 | And here is the code to set up the keymap for Lisp mode: | ||
| 710 | |||
| 711 | @smallexample | ||
| 712 | @group | ||
| 713 | (defvar lisp-mode-map () | ||
| 714 | "Keymap for ordinary Lisp mode...") | ||
| 715 | |||
| 716 | (if lisp-mode-map | ||
| 717 | () | ||
| 718 | (setq lisp-mode-map (make-sparse-keymap)) | ||
| 719 | (set-keymap-parent lisp-mode-map shared-lisp-mode-map) | ||
| 720 | (define-key lisp-mode-map "\e\C-x" 'lisp-eval-defun) | ||
| 721 | (define-key lisp-mode-map "\C-c\C-z" 'run-lisp)) | ||
| 722 | @end group | ||
| 723 | @end smallexample | ||
| 724 | |||
| 725 | Finally, here is the complete major mode function definition for | ||
| 726 | Lisp mode. | ||
| 727 | |||
| 728 | @smallexample | ||
| 729 | @group | ||
| 730 | (defun lisp-mode () | ||
| 731 | "Major mode for editing Lisp code for Lisps other than GNU Emacs Lisp. | ||
| 732 | Commands: | ||
| 733 | Delete converts tabs to spaces as it moves back. | ||
| 734 | Blank lines separate paragraphs. Semicolons start comments. | ||
| 735 | \\@{lisp-mode-map@} | ||
| 736 | Note that `run-lisp' may be used either to start an inferior Lisp job | ||
| 737 | or to switch back to an existing one. | ||
| 738 | @end group | ||
| 739 | |||
| 740 | @group | ||
| 741 | Entry to this mode calls the value of `lisp-mode-hook' | ||
| 742 | if that value is non-nil." | ||
| 743 | (interactive) | ||
| 744 | (kill-all-local-variables) | ||
| 745 | @end group | ||
| 746 | @group | ||
| 747 | (use-local-map lisp-mode-map) ; @r{Select the mode's keymap.} | ||
| 748 | (setq major-mode 'lisp-mode) ; @r{This is how @code{describe-mode}} | ||
| 749 | ; @r{finds out what to describe.} | ||
| 750 | (setq mode-name "Lisp") ; @r{This goes into the mode line.} | ||
| 751 | (lisp-mode-variables t) ; @r{This defines various variables.} | ||
| 752 | (make-local-variable 'comment-start-skip) | ||
| 753 | (setq comment-start-skip | ||
| 754 | "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *") | ||
| 755 | (make-local-variable 'font-lock-keywords-case-fold-search) | ||
| 756 | (setq font-lock-keywords-case-fold-search t) | ||
| 757 | @end group | ||
| 758 | @group | ||
| 759 | (setq imenu-case-fold-search t) | ||
| 760 | (set-syntax-table lisp-mode-syntax-table) | ||
| 761 | (run-mode-hooks 'lisp-mode-hook)) ; @r{This permits the user to use a} | ||
| 762 | ; @r{hook to customize the mode.} | ||
| 763 | @end group | ||
| 764 | @end smallexample | ||
| 765 | |||
| 766 | @node Auto Major Mode | 494 | @node Auto Major Mode |
| 767 | @subsection How Emacs Chooses a Major Mode | 495 | @subsection How Emacs Chooses a Major Mode |
| 768 | 496 | ||
| @@ -1073,104 +801,365 @@ Do not write an @code{interactive} spec in the definition; | |||
| 1073 | @subsection Generic Modes | 801 | @subsection Generic Modes |
| 1074 | @cindex generic mode | 802 | @cindex generic mode |
| 1075 | 803 | ||
| 1076 | @dfn{Generic modes} are simple major modes with basic support for | 804 | @dfn{Generic modes} are simple major modes with basic support for |
| 1077 | comment syntax and Font Lock mode. They are primarily useful for | 805 | comment syntax and Font Lock mode. To define a generic mode, use the |
| 1078 | configuration files. To define a generic mode, use the macro | 806 | macro @code{define-generic-mode}. See the file @file{generic-x.el} |
| 1079 | @code{define-generic-mode}. See the file @file{generic-x.el} for some | 807 | for some examples of the use of @code{define-generic-mode}. |
| 1080 | examples of the use of @code{define-generic-mode}. | ||
| 1081 | 808 | ||
| 1082 | @defmac define-generic-mode mode comment-list keyword-list font-lock-list auto-mode-list function-list &optional docstring | 809 | @defmac define-generic-mode mode comment-list keyword-list font-lock-list auto-mode-list function-list &optional docstring |
| 1083 | This macro creates a new generic mode. The argument @var{mode} (an | 810 | This macro defines a generic mode command named @var{mode} (a symbol, |
| 1084 | unquoted symbol) is the major mode command. The optional argument | 811 | not quoted). The optional argument @var{docstring} is the |
| 1085 | @var{docstring} is the documentation for the mode command. If you do | 812 | documentation for the mode command. If you do not supply it, |
| 1086 | not supply it, @code{define-generic-mode} uses a default documentation | 813 | @code{define-generic-mode} generates one by default. |
| 1087 | string instead. | 814 | |
| 1088 | 815 | The argument @var{comment-list} is a list in which each element is | |
| 1089 | @var{comment-list} is a list in which each element is either a | 816 | either a character, a string of one or two characters, or a cons cell. |
| 1090 | character, a string of one or two characters, or a cons cell. A | 817 | A character or a string is set up in the mode's syntax table as a |
| 1091 | character or a string is set up in the mode's syntax table as a | ||
| 1092 | ``comment starter.'' If the entry is a cons cell, the @sc{car} is set | 818 | ``comment starter.'' If the entry is a cons cell, the @sc{car} is set |
| 1093 | up as a ``comment starter'' and the @sc{cdr} as a ``comment ender.'' | 819 | up as a ``comment starter'' and the @sc{cdr} as a ``comment ender.'' |
| 1094 | (Use @code{nil} for the latter if you want comments to end at the end | 820 | (Use @code{nil} for the latter if you want comments to end at the end |
| 1095 | of the line.) Note that the syntax table has limitations about what | 821 | of the line.) Note that the syntax table mechanism has limitations |
| 1096 | comment starters and enders are actually possible. @xref{Syntax | 822 | about what comment starters and enders are actually possible. |
| 1097 | Tables}. | 823 | @xref{Syntax Tables}. |
| 1098 | 824 | ||
| 1099 | @var{keyword-list} is a list of keywords to highlight with | 825 | The argument @var{keyword-list} is a list of keywords to highlight |
| 1100 | @code{font-lock-keyword-face}. Each keyword should be a string. | 826 | with @code{font-lock-keyword-face}. Each keyword should be a string. |
| 1101 | @var{font-lock-list} is a list of additional expressions to highlight. | 827 | Meanwhile, @var{font-lock-list} is a list of additional expressions to |
| 1102 | Each element of this list should have the same form as an element of | 828 | highlight. Each element of this list should have the same form as an |
| 1103 | @code{font-lock-keywords}. @xref{Search-based Fontification}. | 829 | element of @code{font-lock-keywords}. @xref{Search-based |
| 1104 | 830 | Fontification}. | |
| 1105 | @var{auto-mode-list} is a list of regular expressions to add to the | 831 | |
| 1106 | variable @code{auto-mode-alist}. These regular expressions are added | 832 | The argument @var{auto-mode-list} is a list of regular expressions to |
| 1107 | when Emacs runs the macro expansion. | 833 | add to the variable @code{auto-mode-alist}. They are added by the execution |
| 1108 | 834 | of the @code{define-generic-mode} form, not by expanding the macro call. | |
| 1109 | @var{function-list} is a list of functions to call to do some | 835 | |
| 1110 | additional setup. The mode command calls these functions just before | 836 | Finally, @var{function-list} is a list of functions for the mode |
| 1111 | it runs the mode hook variable @code{@var{mode}-hook}. | 837 | command to call for additional setup. It calls these functions just |
| 838 | before it runs the mode hook variable @code{@var{mode}-hook}. | ||
| 1112 | @end defmac | 839 | @end defmac |
| 1113 | 840 | ||
| 1114 | @node Mode Hooks | 841 | @node Mode Hooks |
| 1115 | @subsection Mode Hooks | 842 | @subsection Mode Hooks |
| 1116 | 843 | ||
| 1117 | The two last things a major mode function should do is run its mode | 844 | Every major mode function should finish by running its mode hook and |
| 1118 | hook and finally the mode independent normal hook | 845 | the mode-independent normal hook @code{after-change-major-mode-hook}. |
| 1119 | @code{after-change-major-mode-hook}. If the major mode is a derived | 846 | It does this by calling @code{run-mode-hooks}. If the major mode is a |
| 1120 | mode, that is if it calls another major mode (the parent mode) in its | 847 | derived mode, that is if it calls another major mode (the parent mode) |
| 1121 | body, then the parent's mode hook is run just before the derived | 848 | in its body, it should do this inside @code{delay-mode-hooks} so that |
| 1122 | mode's hook. Neither the parent's mode hook nor | 849 | the parent won't run these hooks itself. Instead, the derived mode's |
| 1123 | @code{after-change-major-mode-hook} are run at the end of the actual | 850 | call to @code{run-mode-hooks} runs the parent's mode hook too. |
| 1124 | call to the parent mode. This applies recursively if the parent mode | 851 | @xref{Major Mode Conventions}. |
| 1125 | has itself a parent. That is, the mode hooks of all major modes | 852 | |
| 1126 | called directly or indirectly by the major mode function are all run | 853 | Emacs versions before Emacs 22 did not have @code{delay-mode-hooks}. |
| 1127 | in sequence at the end, just before | 854 | When user-implemented major modes have not been updated to use it, |
| 1128 | @code{after-change-major-mode-hook}. | 855 | they won't entirely follow these conventions: they may run the |
| 1129 | 856 | parent's mode hook too early, or fail to run | |
| 1130 | These conventions are new in Emacs 22, and some major modes | 857 | @code{after-change-major-mode-hook}. If you encounter such a major |
| 1131 | implemented by users do not follow them yet. So if you put a function | 858 | mode, please correct it to follow these conventions. |
| 1132 | onto @code{after-change-major-mode-hook}, keep in mind that some modes | ||
| 1133 | will fail to run it. If a user complains about that, you can respond, | ||
| 1134 | ``That major mode fails to follow Emacs conventions, and that's why it | ||
| 1135 | fails to work. Please fix the major mode.'' In most cases, that is | ||
| 1136 | good enough, so go ahead and use @code{after-change-major-mode-hook}. | ||
| 1137 | However, if a certain feature needs to be completely reliable, | ||
| 1138 | it should not use @code{after-change-major-mode-hook} as of yet. | ||
| 1139 | 859 | ||
| 1140 | When you defined a major mode using @code{define-derived-mode}, it | 860 | When you defined a major mode using @code{define-derived-mode}, it |
| 1141 | automatically makes sure these conventions are followed. If you | 861 | automatically makes sure these conventions are followed. If you |
| 1142 | define a major mode ``from scratch,'' not using | 862 | define a major mode ``by hand,'' not using @code{define-derived-mode}, |
| 1143 | @code{define-derived-mode}, make sure the major mode command follows | 863 | use the following functions to handle these conventions automatically. |
| 1144 | these and other conventions. @xref{Major Mode Conventions}. You use | ||
| 1145 | these functions to do it properly. | ||
| 1146 | 864 | ||
| 1147 | @defun run-mode-hooks &rest hookvars | 865 | @defun run-mode-hooks &rest hookvars |
| 1148 | Major modes should run their mode hook using this function. It is | 866 | Major modes should run their mode hook using this function. It is |
| 1149 | similar to @code{run-hooks} (@pxref{Hooks}), but it also runs | 867 | similar to @code{run-hooks} (@pxref{Hooks}), but it also runs |
| 1150 | @code{after-change-major-mode-hook}. | 868 | @code{after-change-major-mode-hook}. |
| 1151 | 869 | ||
| 1152 | When the call to this function is dynamically inside a | 870 | When this function is called during the execution of a |
| 1153 | @code{delay-mode-hooks} form, this function does not run any hooks. | 871 | @code{delay-mode-hooks} form, it does not run the hooks immediately. |
| 1154 | Instead, it arranges for the next call to @code{run-mode-hooks} to run | 872 | Instead, it arranges for the next call to @code{run-mode-hooks} to run |
| 1155 | @var{hookvars}. | 873 | them. |
| 1156 | @end defun | 874 | @end defun |
| 1157 | 875 | ||
| 1158 | @defmac delay-mode-hooks body@dots{} | 876 | @defmac delay-mode-hooks body@dots{} |
| 1159 | This macro executes @var{body} like @code{progn}, but all calls to | 877 | When one major mode command calls another, it should do so inside of |
| 1160 | @code{run-mode-hooks} inside @var{body} delay running their hooks. | 878 | @code{delay-mode-hooks}. |
| 1161 | They will be run by the first call to @code{run-mode-hooks} after exit | 879 | |
| 1162 | from @code{delay-mode-hooks}. This is the proper way for a major mode | 880 | This macro executes @var{body}, but tells all @code{run-mode-hooks} |
| 1163 | command to invoke its parent mode. | 881 | calls during the execution of @var{body} to delay running their hooks. |
| 882 | The hooks will actually run during the next call to | ||
| 883 | @code{run-mode-hooks} after the end of the @code{delay-mode-hooks} | ||
| 884 | construct. | ||
| 1164 | @end defmac | 885 | @end defmac |
| 1165 | 886 | ||
| 1166 | @defvar after-change-major-mode-hook | 887 | @defvar after-change-major-mode-hook |
| 1167 | Every major mode function should run this normal hook at its very end. | 888 | This is a normal hook run by @code{run-mode-hooks}. It is run at the |
| 1168 | It normally does not need to do so explicitly. Indeed, a major mode | 889 | very end of every properly-written major mode function. |
| 1169 | function should normally run its mode hook with @code{run-mode-hooks} | ||
| 1170 | as the very last thing it does, and the last thing | ||
| 1171 | @code{run-mode-hooks} does is run @code{after-change-major-mode-hook}. | ||
| 1172 | @end defvar | 890 | @end defvar |
| 1173 | 891 | ||
| 892 | @node Example Major Modes | ||
| 893 | @subsection Major Mode Examples | ||
| 894 | |||
| 895 | Text mode is perhaps the simplest mode besides Fundamental mode. | ||
| 896 | Here are excerpts from @file{text-mode.el} that illustrate many of | ||
| 897 | the conventions listed above: | ||
| 898 | |||
| 899 | @smallexample | ||
| 900 | @group | ||
| 901 | ;; @r{Create the syntax table for this mode.} | ||
| 902 | (defvar text-mode-syntax-table | ||
| 903 | (let ((st (make-syntax-table))) | ||
| 904 | (modify-syntax-entry ?\" ". " st) | ||
| 905 | (modify-syntax-entry ?\\ ". " st) | ||
| 906 | ;; Add `p' so M-c on `hello' leads to `Hello', not `hello'. | ||
| 907 | (modify-syntax-entry ?' "w p" st) | ||
| 908 | st) | ||
| 909 | "Syntax table used while in `text-mode'.") | ||
| 910 | @end group | ||
| 911 | |||
| 912 | ;; @r{Create the keymap for this mode.} | ||
| 913 | @group | ||
| 914 | (defvar text-mode-map | ||
| 915 | (let ((map (make-sparse-keymap))) | ||
| 916 | (define-key map "\e\t" 'ispell-complete-word) | ||
| 917 | (define-key map "\es" 'center-line) | ||
| 918 | (define-key map "\eS" 'center-paragraph) | ||
| 919 | map) | ||
| 920 | "Keymap for `text-mode'. | ||
| 921 | Many other modes, such as Mail mode, Outline mode | ||
| 922 | and Indented Text mode, inherit all the commands | ||
| 923 | defined in this map.") | ||
| 924 | @end group | ||
| 925 | @end smallexample | ||
| 926 | |||
| 927 | Here is how the actual mode command is defined now: | ||
| 928 | |||
| 929 | @smallexample | ||
| 930 | @group | ||
| 931 | (define-derived-mode text-mode nil "Text" | ||
| 932 | "Major mode for editing text written for humans to read. | ||
| 933 | In this mode, paragraphs are delimited only by blank or white lines. | ||
| 934 | You can thus get the full benefit of adaptive filling | ||
| 935 | (see the variable `adaptive-fill-mode'). | ||
| 936 | \\@{text-mode-map@} | ||
| 937 | Turning on Text mode runs the normal hook `text-mode-hook'." | ||
| 938 | @end group | ||
| 939 | @group | ||
| 940 | (make-local-variable 'text-mode-variant) | ||
| 941 | (setq text-mode-variant t) | ||
| 942 | ;; @r{These two lines are a feature added recently.} | ||
| 943 | (set (make-local-variable 'require-final-newline) | ||
| 944 | mode-require-final-newline) | ||
| 945 | (set (make-local-variable 'indent-line-function) 'indent-relative)) | ||
| 946 | @end group | ||
| 947 | @end smallexample | ||
| 948 | |||
| 949 | But here is how it was defined formerly, before | ||
| 950 | @code{define-derived-mode} existed: | ||
| 951 | |||
| 952 | @smallexample | ||
| 953 | @group | ||
| 954 | ;; @r{This isn't needed nowadays, since @code{define-derived-mode} does it.} | ||
| 955 | (defvar text-mode-abbrev-table nil | ||
| 956 | "Abbrev table used while in text mode.") | ||
| 957 | (define-abbrev-table 'text-mode-abbrev-table ()) | ||
| 958 | @end group | ||
| 959 | |||
| 960 | @group | ||
| 961 | (defun text-mode () | ||
| 962 | "Major mode for editing text intended for humans to read... | ||
| 963 | Special commands: \\@{text-mode-map@} | ||
| 964 | @end group | ||
| 965 | @group | ||
| 966 | Turning on text-mode runs the hook `text-mode-hook'." | ||
| 967 | (interactive) | ||
| 968 | (kill-all-local-variables) | ||
| 969 | (use-local-map text-mode-map) | ||
| 970 | @end group | ||
| 971 | @group | ||
| 972 | (setq local-abbrev-table text-mode-abbrev-table) | ||
| 973 | (set-syntax-table text-mode-syntax-table) | ||
| 974 | @end group | ||
| 975 | @group | ||
| 976 | ;; @r{These four lines are absent from the current version} | ||
| 977 | ;; @r{not because this is done some other way, but rather} | ||
| 978 | ;; @r{because nowadays Text mode uses the normal definition of paragraphs.} | ||
| 979 | (make-local-variable 'paragraph-start) | ||
| 980 | (setq paragraph-start (concat "[ \t]*$\\|" page-delimiter)) | ||
| 981 | (make-local-variable 'paragraph-separate) | ||
| 982 | (setq paragraph-separate paragraph-start) | ||
| 983 | (make-local-variable 'indent-line-function) | ||
| 984 | (setq indent-line-function 'indent-relative-maybe) | ||
| 985 | @end group | ||
| 986 | @group | ||
| 987 | (setq mode-name "Text") | ||
| 988 | (setq major-mode 'text-mode) | ||
| 989 | (run-mode-hooks 'text-mode-hook)) ; @r{Finally, this permits the user to} | ||
| 990 | ; @r{customize the mode with a hook.} | ||
| 991 | @end group | ||
| 992 | @end smallexample | ||
| 993 | |||
| 994 | @cindex @file{lisp-mode.el} | ||
| 995 | The three Lisp modes (Lisp mode, Emacs Lisp mode, and Lisp | ||
| 996 | Interaction mode) have more features than Text mode and the code is | ||
| 997 | correspondingly more complicated. Here are excerpts from | ||
| 998 | @file{lisp-mode.el} that illustrate how these modes are written. | ||
| 999 | |||
| 1000 | @cindex syntax table example | ||
| 1001 | @smallexample | ||
| 1002 | @group | ||
| 1003 | ;; @r{Create mode-specific table variables.} | ||
| 1004 | (defvar lisp-mode-syntax-table nil "") | ||
| 1005 | (defvar lisp-mode-abbrev-table nil "") | ||
| 1006 | @end group | ||
| 1007 | |||
| 1008 | @group | ||
| 1009 | (defvar emacs-lisp-mode-syntax-table | ||
| 1010 | (let ((table (make-syntax-table))) | ||
| 1011 | (let ((i 0)) | ||
| 1012 | @end group | ||
| 1013 | |||
| 1014 | @group | ||
| 1015 | ;; @r{Set syntax of chars up to @samp{0} to say they are} | ||
| 1016 | ;; @r{part of symbol names but not words.} | ||
| 1017 | ;; @r{(The digit @samp{0} is @code{48} in the @acronym{ASCII} character set.)} | ||
| 1018 | (while (< i ?0) | ||
| 1019 | (modify-syntax-entry i "_ " table) | ||
| 1020 | (setq i (1+ i))) | ||
| 1021 | ;; @r{@dots{} similar code follows for other character ranges.} | ||
| 1022 | @end group | ||
| 1023 | @group | ||
| 1024 | ;; @r{Then set the syntax codes for characters that are special in Lisp.} | ||
| 1025 | (modify-syntax-entry ? " " table) | ||
| 1026 | (modify-syntax-entry ?\t " " table) | ||
| 1027 | (modify-syntax-entry ?\f " " table) | ||
| 1028 | (modify-syntax-entry ?\n "> " table) | ||
| 1029 | @end group | ||
| 1030 | @group | ||
| 1031 | ;; @r{Give CR the same syntax as newline, for selective-display.} | ||
| 1032 | (modify-syntax-entry ?\^m "> " table) | ||
| 1033 | (modify-syntax-entry ?\; "< " table) | ||
| 1034 | (modify-syntax-entry ?` "' " table) | ||
| 1035 | (modify-syntax-entry ?' "' " table) | ||
| 1036 | (modify-syntax-entry ?, "' " table) | ||
| 1037 | @end group | ||
| 1038 | @group | ||
| 1039 | ;; @r{@dots{}likewise for many other characters@dots{}} | ||
| 1040 | (modify-syntax-entry ?\( "() " table) | ||
| 1041 | (modify-syntax-entry ?\) ")( " table) | ||
| 1042 | (modify-syntax-entry ?\[ "(] " table) | ||
| 1043 | (modify-syntax-entry ?\] ")[ " table)) | ||
| 1044 | table)) | ||
| 1045 | @end group | ||
| 1046 | @group | ||
| 1047 | ;; @r{Create an abbrev table for lisp-mode.} | ||
| 1048 | (define-abbrev-table 'lisp-mode-abbrev-table ()) | ||
| 1049 | @end group | ||
| 1050 | @end smallexample | ||
| 1051 | |||
| 1052 | The three modes for Lisp share much of their code. For instance, | ||
| 1053 | each calls the following function to set various variables: | ||
| 1054 | |||
| 1055 | @smallexample | ||
| 1056 | @group | ||
| 1057 | (defun lisp-mode-variables (lisp-syntax) | ||
| 1058 | (when lisp-syntax | ||
| 1059 | (set-syntax-table lisp-mode-syntax-table)) | ||
| 1060 | (setq local-abbrev-table lisp-mode-abbrev-table) | ||
| 1061 | @dots{} | ||
| 1062 | @end group | ||
| 1063 | @end smallexample | ||
| 1064 | |||
| 1065 | In Lisp and most programming languages, we want the paragraph | ||
| 1066 | commands to treat only blank lines as paragraph separators. And the | ||
| 1067 | modes should undestand the Lisp conventions for comments. The rest of | ||
| 1068 | @code{lisp-mode-variables} sets this up: | ||
| 1069 | |||
| 1070 | @smallexample | ||
| 1071 | @group | ||
| 1072 | (make-local-variable 'paragraph-start) | ||
| 1073 | (setq paragraph-start (concat page-delimiter "\\|$" )) | ||
| 1074 | (make-local-variable 'paragraph-separate) | ||
| 1075 | (setq paragraph-separate paragraph-start) | ||
| 1076 | @dots{} | ||
| 1077 | @end group | ||
| 1078 | @group | ||
| 1079 | (make-local-variable 'comment-indent-function) | ||
| 1080 | (setq comment-indent-function 'lisp-comment-indent)) | ||
| 1081 | @dots{} | ||
| 1082 | @end group | ||
| 1083 | @end smallexample | ||
| 1084 | |||
| 1085 | Each of the different Lisp modes has a slightly different keymap. For | ||
| 1086 | example, Lisp mode binds @kbd{C-c C-z} to @code{run-lisp}, but the other | ||
| 1087 | Lisp modes do not. However, all Lisp modes have some commands in | ||
| 1088 | common. The following code sets up the common commands: | ||
| 1089 | |||
| 1090 | @smallexample | ||
| 1091 | @group | ||
| 1092 | (defvar shared-lisp-mode-map () | ||
| 1093 | "Keymap for commands shared by all sorts of Lisp modes.") | ||
| 1094 | |||
| 1095 | ;; @r{Putting this @code{if} after the @code{defvar} is an older style.} | ||
| 1096 | (if shared-lisp-mode-map | ||
| 1097 | () | ||
| 1098 | (setq shared-lisp-mode-map (make-sparse-keymap)) | ||
| 1099 | (define-key shared-lisp-mode-map "\e\C-q" 'indent-sexp) | ||
| 1100 | (define-key shared-lisp-mode-map "\177" | ||
| 1101 | 'backward-delete-char-untabify)) | ||
| 1102 | @end group | ||
| 1103 | @end smallexample | ||
| 1104 | |||
| 1105 | @noindent | ||
| 1106 | And here is the code to set up the keymap for Lisp mode: | ||
| 1107 | |||
| 1108 | @smallexample | ||
| 1109 | @group | ||
| 1110 | (defvar lisp-mode-map () | ||
| 1111 | "Keymap for ordinary Lisp mode...") | ||
| 1112 | |||
| 1113 | (if lisp-mode-map | ||
| 1114 | () | ||
| 1115 | (setq lisp-mode-map (make-sparse-keymap)) | ||
| 1116 | (set-keymap-parent lisp-mode-map shared-lisp-mode-map) | ||
| 1117 | (define-key lisp-mode-map "\e\C-x" 'lisp-eval-defun) | ||
| 1118 | (define-key lisp-mode-map "\C-c\C-z" 'run-lisp)) | ||
| 1119 | @end group | ||
| 1120 | @end smallexample | ||
| 1121 | |||
| 1122 | Finally, here is the complete major mode function definition for | ||
| 1123 | Lisp mode. | ||
| 1124 | |||
| 1125 | @smallexample | ||
| 1126 | @group | ||
| 1127 | (defun lisp-mode () | ||
| 1128 | "Major mode for editing Lisp code for Lisps other than GNU Emacs Lisp. | ||
| 1129 | Commands: | ||
| 1130 | Delete converts tabs to spaces as it moves back. | ||
| 1131 | Blank lines separate paragraphs. Semicolons start comments. | ||
| 1132 | \\@{lisp-mode-map@} | ||
| 1133 | Note that `run-lisp' may be used either to start an inferior Lisp job | ||
| 1134 | or to switch back to an existing one. | ||
| 1135 | @end group | ||
| 1136 | |||
| 1137 | @group | ||
| 1138 | Entry to this mode calls the value of `lisp-mode-hook' | ||
| 1139 | if that value is non-nil." | ||
| 1140 | (interactive) | ||
| 1141 | (kill-all-local-variables) | ||
| 1142 | @end group | ||
| 1143 | @group | ||
| 1144 | (use-local-map lisp-mode-map) ; @r{Select the mode's keymap.} | ||
| 1145 | (setq major-mode 'lisp-mode) ; @r{This is how @code{describe-mode}} | ||
| 1146 | ; @r{finds out what to describe.} | ||
| 1147 | (setq mode-name "Lisp") ; @r{This goes into the mode line.} | ||
| 1148 | (lisp-mode-variables t) ; @r{This defines various variables.} | ||
| 1149 | (make-local-variable 'comment-start-skip) | ||
| 1150 | (setq comment-start-skip | ||
| 1151 | "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *") | ||
| 1152 | (make-local-variable 'font-lock-keywords-case-fold-search) | ||
| 1153 | (setq font-lock-keywords-case-fold-search t) | ||
| 1154 | @end group | ||
| 1155 | @group | ||
| 1156 | (setq imenu-case-fold-search t) | ||
| 1157 | (set-syntax-table lisp-mode-syntax-table) | ||
| 1158 | (run-mode-hooks 'lisp-mode-hook)) ; @r{This permits the user to use a} | ||
| 1159 | ; @r{hook to customize the mode.} | ||
| 1160 | @end group | ||
| 1161 | @end smallexample | ||
| 1162 | |||
| 1174 | @node Minor Modes | 1163 | @node Minor Modes |
| 1175 | @section Minor Modes | 1164 | @section Minor Modes |
| 1176 | @cindex minor mode | 1165 | @cindex minor mode |
| @@ -1295,7 +1284,7 @@ check for an existing element, to avoid duplication. For example: | |||
| 1295 | @end smallexample | 1284 | @end smallexample |
| 1296 | 1285 | ||
| 1297 | @noindent | 1286 | @noindent |
| 1298 | or like this, using @code{add-to-list} (@pxref{Setting Variables}): | 1287 | or like this, using @code{add-to-list} (@pxref{List Variables}): |
| 1299 | 1288 | ||
| 1300 | @smallexample | 1289 | @smallexample |
| 1301 | @group | 1290 | @group |
| @@ -1533,16 +1522,14 @@ minor modes. | |||
| 1533 | @subsection Mode Line Basics | 1522 | @subsection Mode Line Basics |
| 1534 | 1523 | ||
| 1535 | @code{mode-line-format} is a buffer-local variable that holds a | 1524 | @code{mode-line-format} is a buffer-local variable that holds a |
| 1536 | @dfn{mode line construct}, a kind of template, which controls the | 1525 | @dfn{mode line construct}, a kind of template, which controls what is |
| 1537 | display the mode line of the current buffer. All windows for the same | 1526 | displayed on the mode line of the current buffer. The value of |
| 1538 | buffer use the same @code{mode-line-format}, so their mode lines | 1527 | @code{header-line-format} specifies the buffer's header line in the |
| 1539 | appear the same---except for scrolling percentages, and line and | 1528 | same way. All windows for the same buffer use the same |
| 1540 | column numbers, since those depend on point and on how the window is | 1529 | @code{mode-line-format} and @code{header-line-format}. |
| 1541 | scrolled. The value of @code{header-line-format} specifies the | 1530 | |
| 1542 | buffer's header line in the same way, with a mode line construct. | 1531 | For efficiency, Emacs does not continuously recompute the mode |
| 1543 | 1532 | line and header line of a window. It does so when circumstances | |
| 1544 | For efficiency, Emacs does not recompute the mode line and header | ||
| 1545 | line of a window in every redisplay. It does so when circumstances | ||
| 1546 | appear to call for it---for instance, if you change the window | 1533 | appear to call for it---for instance, if you change the window |
| 1547 | configuration, switch buffers, narrow or widen the buffer, scroll, or | 1534 | configuration, switch buffers, narrow or widen the buffer, scroll, or |
| 1548 | change the buffer's modification status. If you modify any of the | 1535 | change the buffer's modification status. If you modify any of the |
| @@ -1552,7 +1539,6 @@ how text is displayed (@pxref{Display}), you may want to force an | |||
| 1552 | update of the mode line so as to display the new information or | 1539 | update of the mode line so as to display the new information or |
| 1553 | display it in the new way. | 1540 | display it in the new way. |
| 1554 | 1541 | ||
| 1555 | @c Emacs 19 feature | ||
| 1556 | @defun force-mode-line-update &optional all | 1542 | @defun force-mode-line-update &optional all |
| 1557 | Force redisplay of the current buffer's mode line and header line. | 1543 | Force redisplay of the current buffer's mode line and header line. |
| 1558 | The next redisplay will update the mode line and header line based on | 1544 | The next redisplay will update the mode line and header line based on |
| @@ -1589,15 +1575,17 @@ defined to have mode-line constructs as their values. | |||
| 1589 | @table @code | 1575 | @table @code |
| 1590 | @cindex percent symbol in mode line | 1576 | @cindex percent symbol in mode line |
| 1591 | @item @var{string} | 1577 | @item @var{string} |
| 1592 | A string as a mode-line construct appears verbatim in the mode line | 1578 | A string as a mode-line construct appears verbatim except for |
| 1593 | except for @dfn{@code{%}-constructs} in it. These stand for | 1579 | @dfn{@code{%}-constructs} in it. These stand for substitution of |
| 1594 | substitution of other data; see @ref{%-Constructs}. | 1580 | other data; see @ref{%-Constructs}. |
| 1595 | 1581 | ||
| 1596 | If the string has @code{face} properties, they are copied into the | 1582 | If parts of the string have @code{face} properties, they control |
| 1597 | mode line contents too (@pxref{Properties in Mode}). Any characters | 1583 | display of the text just as they would text in the buffer. Any |
| 1598 | in the mode line which have no @code{face} properties are displayed, | 1584 | characters which have no @code{face} properties are displayed, by |
| 1599 | by default, in the face @code{mode-line} or @code{mode-line-inactive} | 1585 | default, in the face @code{mode-line} or @code{mode-line-inactive} |
| 1600 | (@pxref{Standard Faces,,, emacs, The GNU Emacs Manual}). | 1586 | (@pxref{Standard Faces,,, emacs, The GNU Emacs Manual}). The |
| 1587 | @code{help-echo} and @code{local-map} properties in @var{string} have | ||
| 1588 | special meanings. @xref{Properties in Mode}. | ||
| 1601 | 1589 | ||
| 1602 | @item @var{symbol} | 1590 | @item @var{symbol} |
| 1603 | A symbol as a mode-line construct stands for its value. The value of | 1591 | A symbol as a mode-line construct stands for its value. The value of |
| @@ -1612,7 +1600,9 @@ Unless @var{symbol} is marked as ``risky'' (i.e., it has a | |||
| 1612 | non-@code{nil} @code{risky-local-variable} property), all text | 1600 | non-@code{nil} @code{risky-local-variable} property), all text |
| 1613 | properties specified in @var{symbol}'s value are ignored. This | 1601 | properties specified in @var{symbol}'s value are ignored. This |
| 1614 | includes the text properties of strings in @var{symbol}'s value, as | 1602 | includes the text properties of strings in @var{symbol}'s value, as |
| 1615 | well as all @code{:eval} and @code{:propertize} forms in it. | 1603 | well as all @code{:eval} and @code{:propertize} forms in it. (The |
| 1604 | reason for this is security: non-risky variables could be set | ||
| 1605 | automatically from file variables without prompting the user.) | ||
| 1616 | 1606 | ||
| 1617 | @item (@var{string} @var{rest}@dots{}) | 1607 | @item (@var{string} @var{rest}@dots{}) |
| 1618 | @itemx (@var{list} @var{rest}@dots{}) | 1608 | @itemx (@var{list} @var{rest}@dots{}) |
| @@ -2055,10 +2045,10 @@ structure, and make @var{form} evaluate to a string that has a text | |||
| 2055 | property. | 2045 | property. |
| 2056 | @end enumerate | 2046 | @end enumerate |
| 2057 | 2047 | ||
| 2058 | You use the @code{local-map} property to specify a keymap. Like any | 2048 | You can use the @code{local-map} property to specify a keymap. This |
| 2059 | keymap, it can bind character keys and function keys; but that has no | 2049 | keymap only takes real effect for mouse clicks; binding character keys |
| 2060 | effect, since it is impossible to move point into the mode line. This | 2050 | and function keys to it has no effect, since it is impossible to move |
| 2061 | keymap can only take real effect for mouse clicks. | 2051 | point into the mode line. |
| 2062 | 2052 | ||
| 2063 | When the mode line refers to a variable which does not have a | 2053 | When the mode line refers to a variable which does not have a |
| 2064 | non-@code{nil} @code{risky-local-variable} property, any text | 2054 | non-@code{nil} @code{risky-local-variable} property, any text |
| @@ -2889,6 +2879,10 @@ Used (typically) for constant names. | |||
| 2889 | @vindex font-lock-preprocessor-face | 2879 | @vindex font-lock-preprocessor-face |
| 2890 | Used (typically) for preprocessor commands. | 2880 | Used (typically) for preprocessor commands. |
| 2891 | 2881 | ||
| 2882 | @item font-lock-negation-char-face | ||
| 2883 | @vindex font-lock-negation-char-face | ||
| 2884 | Used (typically) for easily-overlooked negation characters. | ||
| 2885 | |||
| 2892 | @item font-lock-warning-face | 2886 | @item font-lock-warning-face |
| 2893 | @vindex font-lock-warning-face | 2887 | @vindex font-lock-warning-face |
| 2894 | Used (typically) for constructs that are peculiar, or that greatly | 2888 | Used (typically) for constructs that are peculiar, or that greatly |
| @@ -3044,7 +3038,7 @@ closely related, and often getting one of them to work will appear to | |||
| 3044 | make the other also work. However, for reliable results you must | 3038 | make the other also work. However, for reliable results you must |
| 3045 | attend explicitly to both aspects. | 3039 | attend explicitly to both aspects. |
| 3046 | 3040 | ||
| 3047 | There are two ways to ensure correct identification of multiline | 3041 | There are three ways to ensure correct identification of multiline |
| 3048 | constructs: | 3042 | constructs: |
| 3049 | 3043 | ||
| 3050 | @itemize | 3044 | @itemize |
| @@ -3055,6 +3049,10 @@ property on the construct when it is added to the buffer. | |||
| 3055 | Use @code{font-lock-fontify-region-function} hook to extend the scan | 3049 | Use @code{font-lock-fontify-region-function} hook to extend the scan |
| 3056 | so that the scanned text never starts or ends in the middle of a | 3050 | so that the scanned text never starts or ends in the middle of a |
| 3057 | multiline construct. | 3051 | multiline construct. |
| 3052 | @item | ||
| 3053 | Add a function to @code{font-lock-extend-region-functions} that does | ||
| 3054 | the @emph{identification} and extends the scan so that the scanned | ||
| 3055 | text never starts or ends in the middle of a multiline construct. | ||
| 3058 | @end itemize | 3056 | @end itemize |
| 3059 | 3057 | ||
| 3060 | There are three ways to do rehighlighting of multiline constructs: | 3058 | There are three ways to do rehighlighting of multiline constructs: |
| @@ -3144,7 +3142,7 @@ earlier line. | |||
| 3144 | You can enlarge (or even reduce) the region to fontify by setting | 3142 | You can enlarge (or even reduce) the region to fontify by setting |
| 3145 | one the following variables: | 3143 | one the following variables: |
| 3146 | 3144 | ||
| 3147 | @defvar font-lock-extend-region-function | 3145 | @defvar font-lock-extend-after-change-region-function |
| 3148 | This buffer-local variable is either @code{nil} or a function for | 3146 | This buffer-local variable is either @code{nil} or a function for |
| 3149 | Font-Lock to call to determine the region to scan and fontify. | 3147 | Font-Lock to call to determine the region to scan and fontify. |
| 3150 | 3148 | ||