annotate lisp/emacs-lisp/easy-mmode.el @ 29039:d8bafae6beb2

Update copyright and commentary. (easy-mmode-define-toggle): Deprecate the use of *-(on|off)-hook. Print a status message if the toggle is called interactively. (define-minor-mode): Allow INIT-VALUE to be (global . INIT-VALUE) for global minor modes and use `defcustom' for them. Use add-minor-mode. (easy-mmode-define-derived-mode): Remove. (define-derived-mode): Fancier default docstring. (easy-mmode-define-navigation): Signal an error rather than (ding).
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sun, 21 May 2000 01:43:55 +0000
parents 21cd65af5197
children addeae19bf96
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
1 ;;; easy-mmode.el --- easy definition for major and minor modes.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
3 ;; Copyright (C) 1997,2000 Free Software Foundation, Inc.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 ;; Author: Georges Brun-Cottan <Georges.Brun-Cottan@inria.fr>
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
6 ;; Maintainer: Stefan Monnier <monnier@gnu.org>
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; any later version.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; GNU General Public License for more details.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 ;; Boston, MA 02111-1307, USA.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 ;;; Commentary:
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 ;; Minor modes are useful and common. This package makes defining a
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 ;; minor mode easy, by focusing on the writing of the minor mode
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 ;; functionalities themselves. Moreover, this package enforces a
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 ;; conventional naming of user interface primitives, making things
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 ;; natural for the minor-mode end-users.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 ;; For each mode, easy-mmode defines the following:
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 ;; <mode> : The minor mode predicate. A buffer-local variable.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 ;; <mode>-map : The keymap possibly associated to <mode>.
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
36 ;; <mode>-hook : The hook run at the end of the toggle function.
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
37 ;; see `define-minor-mode' documentation
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 ;;
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 ;; eval
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
40 ;; (pp (macroexpand '(define-minor-mode <your-mode> <doc>)))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 ;; to check the result before using it.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 ;; The order in which minor modes are installed is important. Keymap
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 ;; lookup proceeds down minor-mode-map-alist, and the order there
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 ;; tends to be the reverse of the order in which the modes were
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 ;; installed. Perhaps there should be a feature to let you specify
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 ;; orderings.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
49 ;; Additionally to `define-minor-mode', the package provides convenient
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
50 ;; ways to define keymaps, and other helper functions for major and minor modes.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
52 ;;; Code:
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
54 (defmacro easy-mmode-define-toggle (mode &optional doc &rest body)
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 "Define a one arg toggle mode MODE function and associated hooks.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
56 MODE is the so defined function that toggles the mode.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 optional DOC is its associated documentation.
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
58 BODY is executed after the toggling and before running MODE-hook."
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
59 (let* ((mode-name (symbol-name mode))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 (hook (intern (concat mode-name "-hook")))
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 (hook-on (intern (concat mode-name "-on-hook")))
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 (hook-off (intern (concat mode-name "-off-hook")))
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 (toggle-doc (or doc
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
64 (format "With no argument, toggle %s.
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
65 With universal prefix ARG turn mode on.
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
66 With zero or negative ARG turn mode off.
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
67 \\{%s}" mode-name (concat mode-name "-map")))))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 `(progn
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
69 (defcustom ,hook nil
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
70 ,(format "Hook called at the end of function `%s'." mode-name)
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
71 :type 'hook)
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
73 (defun ,mode (&optional arg)
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 ,toggle-doc
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 (interactive "P")
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
76 (setq ,mode
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
77 (if arg
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
78 (> (prefix-numeric-value arg) 0)
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
79 (not ,mode)))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
80 ,@body
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
81 ;; The on/off hooks are here for backward compatibility.
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
82 (run-hooks ',hook (if ,mode ',hook-on ',hook-off))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
83 ;; Return the new setting.
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
84 (if (interactive-p)
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
85 (message ,(format "%s %%sabled"
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
86 (replace-regexp-in-string
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
87 "-Mode" " mode"
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
88 (capitalize (symbol-name mode)) t))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
89 (if ,mode "en" "dis")))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
90 ,mode))))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 ;;;###autoload
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
93 (defalias 'easy-mmode-define-minor-mode 'define-minor-mode)
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
94 ;;;###autoload
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
95 (defmacro define-minor-mode (mode doc &optional init-value lighter keymap &rest body)
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 "Define a new minor mode MODE.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 This function defines the associated control variable, keymap,
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 toggle command, and hooks (see `easy-mmode-define-toggle').
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 DOC is the documentation for the mode toggle command.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
101 Optional INIT-VALUE is the initial value of the mode's variable.
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
102 By default, the variable is made buffer-local. This can be overridden
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
103 by specifying an initial value of (global . INIT-VALUE).
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
104 Optional LIGHTER is displayed in the modeline when the mode is on.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 Optional KEYMAP is the default (defvar) keymap bound to the mode keymap.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106 If it is a list, it is passed to `easy-mmode-define-keymap'
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 in order to build a valid keymap.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
108 BODY contains code that will be executed each time the mode is (dis)activated.
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
109 It will be executed after any toggling but before running the hooks."
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 (let* ((mode-name (symbol-name mode))
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
111 (globalp nil)
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
112 (keymap-sym (intern (concat mode-name "-map")))
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
113 (keymap-doc (format "Keymap for `%s'." mode-name)))
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
114 ;; Check if the mode should be global.
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
115 (when (and (consp init-value) (eq (car init-value) 'global))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
116 (setq init-value (cdr init-value) globalp t))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
117
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 `(progn
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
119 ;; Define the variable to enable or disable the mode.
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
120 ,(if globalp
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
121 `(defcustom ,mode ,init-value ,(format "Toggle %s.
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
122 Setting this variable directly does not take effect;
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
123 use either \\[customize] or the function `%s'." mode mode)
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
124 :set (lambda (symbol value) (funcall symbol (or value 0)))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
125 :initialize 'custom-initialize-default
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
126 :type 'boolean)
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
127 `(progn
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
128 (defvar ,mode ,init-value ,(format "Non-nil if mode is enabled.
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
129 Use the function `%s' to change this variable." mode))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
130 (make-variable-buffer-local ',mode)))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
132 ;; Define the minor-mode keymap.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
133 ,(when keymap
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
134 `(defvar ,keymap-sym
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
135 (cond ((and ,keymap (keymapp ,keymap))
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
136 ,keymap)
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
137 ((listp ,keymap)
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
138 (easy-mmode-define-keymap ,keymap))
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
139 (t (error "Invalid keymap %S" ,keymap)))
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
140 ,keymap-doc))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
142 ;; Define the toggle and the hooks.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
143 (easy-mmode-define-toggle ,mode ,doc ,@body)
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
144 (add-minor-mode ',mode ,lighter
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
145 (if (boundp ',keymap-sym) (symbol-value ',keymap-sym)))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
146
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
147 ;; If the mode is global, call the function according to the default.
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
148 ,(if globalp `(if ,mode (,mode 1))))))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
149
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
150 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
151 ;;; easy-mmode-defmap
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
152 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
153
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
154 (if (fboundp 'set-keymap-parents)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
155 (defalias 'easy-mmode-set-keymap-parents 'set-keymap-parents)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
156 (defun easy-mmode-set-keymap-parents (m parents)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
157 (set-keymap-parent
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
158 m
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
159 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
160 ((not (consp parents)) parents)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
161 ((not (cdr parents)) (car parents))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
162 (t (let ((m (copy-keymap (pop parents))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
163 (easy-mmode-set-keymap-parents m parents)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
164 m))))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
165
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
166 (defun easy-mmode-define-keymap (bs &optional name m args)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
167 "Return a keymap built from bindings BS.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
168 BS must be a list of (KEY . BINDING) where
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
169 KEY and BINDINGS are suited as for define-key.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
170 optional NAME is passed to `make-sparse-keymap'.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
171 optional map M can be used to modify an existing map.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
172 ARGS is a list of additional arguments."
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
173 (let (inherit dense suppress)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
174 (while args
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
175 (let ((key (pop args))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
176 (val (pop args)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
177 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
178 ((eq key :dense) (setq dense val))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
179 ((eq key :inherit) (setq inherit val))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
180 ((eq key :group) )
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
181 ;;((eq key :suppress) (setq suppress val))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
182 (t (message "Unknown argument %s in defmap" key)))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
183 (unless (keymapp m)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
184 (setq bs (append m bs))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
185 (setq m (if dense (make-keymap name) (make-sparse-keymap name))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
186 (dolist (b bs)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
187 (let ((keys (car b))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
188 (binding (cdr b)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
189 (dolist (key (if (consp keys) keys (list keys)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
190 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
191 ((symbolp key)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
192 (substitute-key-definition key binding m global-map))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
193 ((null binding)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
194 (unless (keymapp (lookup-key m key)) (define-key m key binding)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
195 ((let ((o (lookup-key m key)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
196 (or (null o) (numberp o) (eq o 'undefined)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
197 (define-key m key binding))))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
198 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
199 ((keymapp inherit) (set-keymap-parent m inherit))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
200 ((consp inherit) (easy-mmode-set-keymap-parents m inherit)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
201 m))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
202
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
203 ;;;###autoload
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
204 (defmacro easy-mmode-defmap (m bs doc &rest args)
28086
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
205 `(progn
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
206 (autoload 'easy-mmode-define-keymap "easy-mmode")
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
207 (defconst ,m
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
208 (easy-mmode-define-keymap ,bs nil (if (boundp ',m) ,m) ,(cons 'list args))
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
209 ,doc)))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
210
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
211
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
212 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
213 ;;; easy-mmode-defsyntax
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
214 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
215
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
216 (defun easy-mmode-define-syntax (css args)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
217 (let ((st (make-syntax-table (cadr (memq :copy args)))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
218 (dolist (cs css)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
219 (let ((char (car cs))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
220 (syntax (cdr cs)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
221 (if (sequencep char)
28086
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
222 (mapcar (lambda (c) (modify-syntax-entry c syntax st)) char)
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
223 (modify-syntax-entry char syntax st))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
224 st))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
225
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
226 ;;;###autoload
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
227 (defmacro easy-mmode-defsyntax (st css doc &rest args)
28086
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
228 `(progn
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
229 (autoload 'easy-mmode-define-syntax "easy-mmode")
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
230 (defconst ,st (easy-mmode-define-syntax ,css ,(cons 'list args)) doc)))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
231
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
232
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
233
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
234 ;;;
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
235 ;;; A "macro-only" reimplementation of define-derived-mode.
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
236 ;;;
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
237
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
238 ;;;###autoload
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
239 (defmacro define-derived-mode (child parent name &optional docstring &rest body)
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
240 "Create a new mode as a variant of an existing mode.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
241
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
242 The arguments to this command are as follow:
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
243
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
244 CHILD: the name of the command for the derived mode.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
245 PARENT: the name of the command for the parent mode (e.g. `text-mode').
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
246 NAME: a string which will appear in the status line (e.g. \"Hypertext\")
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
247 DOCSTRING: an optional documentation string--if you do not supply one,
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
248 the function will attempt to invent something useful.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
249 BODY: forms to execute just before running the
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
250 hooks for the new mode.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
251
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
252 Here is how you could define LaTeX-Thesis mode as a variant of LaTeX mode:
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
253
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
254 (define-derived-mode LaTeX-thesis-mode LaTeX-mode \"LaTeX-Thesis\")
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
255
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
256 You could then make new key bindings for `LaTeX-thesis-mode-map'
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
257 without changing regular LaTeX mode. In this example, BODY is empty,
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
258 and DOCSTRING is generated by default.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
259
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
260 On a more complicated level, the following command uses `sgml-mode' as
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
261 the parent, and then sets the variable `case-fold-search' to nil:
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
262
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
263 (define-derived-mode article-mode sgml-mode \"Article\"
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
264 \"Major mode for editing technical articles.\"
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
265 (setq case-fold-search nil))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
266
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
267 Note that if the documentation string had been left out, it would have
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
268 been generated automatically, with a reference to the keymap."
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
269
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
270 (let* ((child-name (symbol-name child))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
271 (map (intern (concat child-name "-map")))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
272 (syntax (intern (concat child-name "-syntax-table")))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
273 (abbrev (intern (concat child-name "-abbrev-table")))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
274 (hook (intern (concat child-name "-hook"))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
275
28086
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
276 (when (and docstring (not (stringp docstring)))
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
277 ;; DOCSTRING is really the first command and there's no docstring
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
278 (push docstring body)
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
279 (setq docstring nil))
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
280
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
281 (unless (stringp docstring)
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
282 ;; Use a default docstring.
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
283 (setq docstring
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
284 (format "Major mode derived from `%s' by `define-derived-mode'.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
285 Inherits all of the parent's attributes, but has its own keymap,
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
286 abbrev table and syntax table:
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
287
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
288 `%s', `%s' and `%s'
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
289
28086
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
290 which more-or-less shadow %s's corresponding tables."
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
291 parent map syntax abbrev parent)))
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
292
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
293 (unless (string-match (regexp-quote (symbol-name hook)) docstring)
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
294 ;; Make sure the docstring mentions the mode's hook
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
295 (setq docstring
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
296 (concat docstring
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
297 (unless (eq parent 'fundamental-mode)
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
298 (concat
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
299 "\nAdditionally to any hooks its parent mode "
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
300 (if (string-match (regexp-quote (format "`%s'" parent))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
301 docstring) nil
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
302 (format "`%s' " parent))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
303 "might have run),"))
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
304 (format "\nThis mode runs `%s' just before exiting." hook))))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
305
28086
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
306 (unless (string-match "\\\\[{[]" docstring)
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
307 ;; And don't forget to put the mode's keymap
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
308 (setq docstring (concat docstring "\n\\{" (symbol-name map) "}")))
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
309
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
310 `(progn
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
311 (defvar ,map (make-sparse-keymap))
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
312 (defvar ,syntax (make-char-table 'syntax-table nil))
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
313 (defvar ,abbrev (progn (define-abbrev-table ',abbrev nil) ,abbrev))
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
314
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
315 (defun ,child ()
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
316 ,docstring
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
317 (interactive)
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
318 ; Run the parent.
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
319 (combine-run-hooks
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
320
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
321 (,parent)
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
322 ; Identify special modes.
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
323 (put ',child 'special (get ',parent 'special))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
324 ; Identify the child mode.
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
325 (setq major-mode ',child)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
326 (setq mode-name ,name)
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
327 ; Set up maps and tables.
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
328 (unless (keymap-parent ,map)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
329 (set-keymap-parent ,map (current-local-map)))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
330 (let ((parent (char-table-parent ,syntax)))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
331 (unless (and parent (not (eq parent (standard-syntax-table))))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
332 (set-char-table-parent ,syntax (syntax-table))))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
333 (when local-abbrev-table
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
334 (mapatoms
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
335 (lambda (symbol)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
336 (or (intern-soft (symbol-name symbol) ,abbrev)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
337 (define-abbrev ,abbrev (symbol-name symbol)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
338 (symbol-value symbol) (symbol-function symbol))))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
339 local-abbrev-table))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
340
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
341 (use-local-map ,map)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
342 (set-syntax-table ,syntax)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
343 (setq local-abbrev-table ,abbrev)
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
344 ; Splice in the body (if any).
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
345 ,@body)
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
346 ; Run the hooks, if any.
28086
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
347 (run-hooks ',hook)))))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
348
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
349
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
350 ;;;
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
351 ;;; easy-mmode-define-navigation
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
352 ;;;
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
353
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
354 (defmacro easy-mmode-define-navigation (base re &optional name endfun)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
355 "Define BASE-next and BASE-prev to navigate in the buffer.
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
356 RE determines the places the commands should move point to.
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
357 NAME should describe the entities matched by RE and is used to build
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
358 the docstrings of the two functions.
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
359 BASE-next also tries to make sure that the whole entry is visible by
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
360 searching for its end (by calling ENDFUN if provided or by looking for
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
361 the next entry) and recentering if necessary.
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
362 ENDFUN should return the end position (with or without moving point)."
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
363 (let* ((base-name (symbol-name base))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
364 (prev-sym (intern (concat base-name "-prev")))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
365 (next-sym (intern (concat base-name "-next"))))
28239
21cd65af5197 (easy-mmode-define-navigation): Only use `ding' for interactive use
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28235
diff changeset
366 (unless name (setq name (symbol-name base-name)))
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
367 `(progn
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
368 (defun ,next-sym (&optional count)
28239
21cd65af5197 (easy-mmode-define-navigation): Only use `ding' for interactive use
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28235
diff changeset
369 ,(format "Go to the next COUNT'th %s." name)
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
370 (interactive)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
371 (unless count (setq count 1))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
372 (if (< count 0) (,prev-sym (- count))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
373 (if (looking-at ,re) (incf count))
28239
21cd65af5197 (easy-mmode-define-navigation): Only use `ding' for interactive use
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28235
diff changeset
374 (unless (re-search-forward ,re nil t count)
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
375 (error ,(format "No next %s" name)))
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
376 (goto-char (match-beginning 0))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
377 (when (eq (current-buffer) (window-buffer (selected-window)))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
378 (let ((endpt (or (save-excursion
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
379 ,(if endfun `(,endfun)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
380 `(re-search-forward ,re nil t 2)))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
381 (point-max))))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
382 (unless (<= endpt (window-end)) (recenter))))))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
383 (defun ,prev-sym (&optional count)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
384 ,(format "Go to the previous COUNT'th %s" (or name base-name))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
385 (interactive)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
386 (unless count (setq count 1))
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
387 (if (< count 0) (,next-sym (- count))
28239
21cd65af5197 (easy-mmode-define-navigation): Only use `ding' for interactive use
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28235
diff changeset
388 (unless (re-search-backward ,re nil t count)
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
389 (error ,(format "No previous %s" name))))))))
28086
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
390
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 (provide 'easy-mmode)
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 ;;; easy-mmode.el ends here