annotate lisp/emacs-lisp/easy-mmode.el @ 28081:6360842e5962

(easy-mmode-define-keymap): Extend to allow more flexibility. (easy-mmode-set-keymap-parents, easy-mmode-define-syntax): New functions. (easy-mmode-defmap, easy-mmode-defsyntax, easy-mmode-define-derived-mode): New macros.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Fri, 10 Mar 2000 01:16:34 +0000
parents 271f77895660
children 9ff6e6a6c6b5
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
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3 ;; Copyright (C) 1997 Free Software Foundation, Inc.
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>.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 ;; <mode>-hook,<mode>-on-hook,<mode>-off-hook and <mode>-mode:
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 ;; see `easy-mmode-define-minor-mode' documentation
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
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 ;; (pp (macroexpand '(easy-mmode-define-minor-mode <your-mode> <doc>)))
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.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
58 BODY is executed after the toggling and before running the hooks.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 Hooks are checked for run, each time MODE-mode is called.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 They run under the followings conditions:
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 MODE-hook: if the mode is toggled.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 MODE-on-hook: if the mode is on.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 MODE-off-hook: if the mode is off.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 When the mode is effectively toggled, two hooks may run.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
67 If so MODE-hook is guaranteed to be the first."
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
68 (let* ((mode-name (symbol-name mode))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 (hook (intern (concat mode-name "-hook")))
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 (hook-on (intern (concat mode-name "-on-hook")))
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 (hook-off (intern (concat mode-name "-off-hook")))
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 (toggle-doc (or doc
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
73 (format "With no argument, toggle %s.
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
74 With universal prefix ARG turn mode on.
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
75 With zero or negative ARG turn mode off.
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
76 \\{%s}" mode-name (concat mode-name "-map")))))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 `(progn
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
78 (defcustom ,hook nil
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
79 ,(format "Hook called when `%s' is toggled" mode-name)
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
80 :type 'hook)
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
82 (defcustom ,hook-on nil
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
83 ,(format "Hook called when `%s' is turned on" mode-name)
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
84 :type 'hook)
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
86 (defcustom ,hook-off nil
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
87 ,(format "Hook called when `%s' is turned off" mode-name)
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
88 :type 'hook)
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
90 (defun ,mode (&optional arg)
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91 ,toggle-doc
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 (interactive "P")
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 (let ((old-mode ,mode))
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94 (setq ,mode
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 (if arg
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
96 (> (prefix-numeric-value arg) 0)
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 (not ,mode)))
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
98 ,@body
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
99 (unless (equal old-mode ,mode) (run-hooks ',hook))
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
100 (run-hooks (if ,mode ',hook-on ',hook-off)))))))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 ;;;###autoload
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
103 (defalias 'easy-mmode-define-minor-mode 'define-minor-mode)
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
104 ;;;###autoload
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
105 (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
106 "Define a new minor mode MODE.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 This function defines the associated control variable, keymap,
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108 toggle command, and hooks (see `easy-mmode-define-toggle').
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 DOC is the documentation for the mode toggle command.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
111 Optional INIT-VALUE is the initial value of the mode's variable.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 Optional LIGHTER is displayed in the mode-bar when the mode is on.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 Optional KEYMAP is the default (defvar) keymap bound to the mode keymap.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 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
115 in order to build a valid keymap.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
116 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
117 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
118 (let* ((mode-name (symbol-name mode))
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
119 (mode-doc (format "Non-nil if mode is enabled.
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
120 Use the function `%s' to change this variable." mode-name))
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
121 (keymap-sym (intern (concat mode-name "-map")))
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
122 (keymap-doc (format "Keymap for `%s'." mode-name)))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 `(progn
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
124 ;; Define the variable to enable or disable the mode.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 (defvar ,mode ,init-value ,mode-doc)
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 (make-variable-buffer-local ',mode)
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
128 ;; Define the minor-mode keymap.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
129 ,(when keymap
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
130 `(defvar ,keymap-sym
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
131 (cond ((and ,keymap (keymapp ,keymap))
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
132 ,keymap)
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
133 ((listp ,keymap)
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
134 (easy-mmode-define-keymap ,keymap))
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
135 (t (error "Invalid keymap %S" ,keymap)))
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
136 ,keymap-doc))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
138 ;; Define the toggle and the hooks.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
139 (easy-mmode-define-toggle ,mode ,doc ,@body)
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
141 ;; Update the mode line.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 (or (assq ',mode minor-mode-alist)
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 (setq minor-mode-alist
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
144 (cons (list ',mode nil) minor-mode-alist)))
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
145 (setcar (cdr (assq ',mode minor-mode-alist)) ,lighter)
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
147 ;; Update the minor mode map.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 (or (assq ',mode minor-mode-map-alist)
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
149 (setq minor-mode-map-alist
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
150 (cons (cons ',mode nil) minor-mode-map-alist)))
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
151 (setcdr (assq ',mode minor-mode-map-alist)
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
152 ,keymap-sym)) ))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
154
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
155 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
156 ;;; easy-mmode-defmap
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
157 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
158
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
159 (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
160 (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
161 (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
162 (set-keymap-parent
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
163 m
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
164 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
165 ((not (consp parents)) parents)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
166 ((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
167 (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
168 (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
169 m))))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
170
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
171 (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
172 "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
173 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
174 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
175 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
176 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
177 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
178 (let (inherit dense suppress)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
179 (while args
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
180 (let ((key (pop args))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
181 (val (pop args)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
182 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
183 ((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
184 ((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
185 ((eq key :group) )
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
186 ;;((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
187 (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
188 (unless (keymapp m)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
189 (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
190 (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
191 (dolist (b bs)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
192 (let ((keys (car b))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
193 (binding (cdr b)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
194 (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
195 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
196 ((symbolp key)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
197 (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
198 ((null binding)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
199 (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
200 ((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
201 (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
202 (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
203 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
204 ((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
205 ((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
206 m))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
207
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
208 ;;;###autoload
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
209 (defmacro easy-mmode-defmap (m bs doc &rest args)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
210 `(defconst ,m
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
211 (easy-mmode-define-keymap ,bs nil (if (boundp ',m) ,m) ,(cons 'list args))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
212 ,doc))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
213
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 ;;; easy-mmode-defsyntax
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
217 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
218
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
219 (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
220 (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
221 (dolist (cs css)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
222 (let ((char (car cs))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
223 (syntax (cdr cs)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
224 (if (sequencep char)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
225 (mapcar* (lambda (c) (modify-syntax-entry c syntax st)) char)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
226 (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
227 st))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
228
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
229 ;;;###autoload
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
230 (defmacro easy-mmode-defsyntax (st css doc &rest args)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
231 `(defconst ,st (custom-create-syntax ,css ,(cons 'list args)) doc))
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
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
234
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.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
236
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
237 (defmacro easy-mmode-define-derived-mode (child parent name &optional docstring &rest body)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
238 "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
239
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
240 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
241
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
242 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
243 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
244 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
245 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
246 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
247 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
248 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
249
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
250 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
251
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
252 (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
253
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
254 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
255 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
256 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
257
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
258 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
259 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
260
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
261 (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
262 \"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
263 (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
264
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
265 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
266 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
267
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
268 ; Some trickiness, since what
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
269 ; appears to be the docstring
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
270 ; may really be the first
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
271 ; element of the body.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
272 (if (and docstring (not (stringp docstring)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
273 (progn (setq body (cons docstring body))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
274 (setq docstring nil)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
275 (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
276 (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
277 (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
278 (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
279 (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
280
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
281 `(progn
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
282 (defvar ,map (make-sparse-keymap))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
283 (defvar ,syntax (make-char-table 'syntax-table nil))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
284 (defvar ,abbrev (progn (define-abbrev-table ',abbrev nil) ,abbrev))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
285
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
286 (defun ,child ()
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
287 ,(or docstring
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
288 (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
289 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
290 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
291
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
292 `%s', `%s' and `%s'
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
293
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
294 which more-or-less shadow %s's corresponding tables.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
295 It also runs its own `%s' after its parent's.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
296
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
297 \\{%s}" parent map syntax abbrev parent hook map))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
298 (interactive)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
299 ; Run the parent.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
300 (,parent)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
301 ; Identify special modes.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
302 (put ',child 'special (get ',parent 'special))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
303 ; Identify the child mode.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
304 (setq major-mode ',child)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
305 (setq mode-name ,name)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
306 ; Set up maps and tables.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
307 (unless (keymap-parent ,map)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
308 (set-keymap-parent ,map (current-local-map)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
309 (let ((parent (char-table-parent ,syntax)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
310 (unless (and parent (not (eq parent (standard-syntax-table))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
311 (set-char-table-parent ,syntax (syntax-table))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
312 (when local-abbrev-table
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
313 (mapatoms
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
314 (lambda (symbol)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
315 (or (intern-soft (symbol-name symbol) ,abbrev)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
316 (define-abbrev ,abbrev (symbol-name symbol)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
317 (symbol-value symbol) (symbol-function symbol))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
318 local-abbrev-table))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
319
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
320 (use-local-map ,map)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
321 (set-syntax-table ,syntax)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
322 (setq local-abbrev-table ,abbrev)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
323 ; Splice in the body (if any).
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
324 ,@body
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
325 ; Run the hooks, if any.
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
326 (run-hooks ',hook)))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
327
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
328
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 (provide 'easy-mmode)
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 ;;; easy-mmode.el ends here