annotate lisp/emacs-lisp/easy-mmode.el @ 38136:278f2295cde6

New node Program Misc; text about word and paragraph and selective display features moved there. Major rewrite of Programming Modes node. Mention font lock and compilation commands in initial list of capabilities. Rewrite explanation of C-M- convention. In Basic Indent, add intro text.
author Richard M. Stallman <rms@gnu.org>
date Wed, 20 Jun 2001 10:57:04 +0000
parents 3886350a8826
children ce45998cedf2
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
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
54 (eval-when-compile (require 'cl))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
55
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
56 (defun easy-mmode-pretty-mode-name (mode &optional lighter)
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
57 "Turn the symbol MODE into a string intended for the user.
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
58 If provided LIGHTER will be used to help choose capitalization."
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
59 (let* ((case-fold-search t)
32048
39617f078b9d (easy-mmode-pretty-mode-name): Prettier.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31981
diff changeset
60 (name (concat (replace-regexp-in-string
39617f078b9d (easy-mmode-pretty-mode-name): Prettier.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31981
diff changeset
61 "-Minor" " minor"
39617f078b9d (easy-mmode-pretty-mode-name): Prettier.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31981
diff changeset
62 (capitalize (replace-regexp-in-string
39617f078b9d (easy-mmode-pretty-mode-name): Prettier.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31981
diff changeset
63 "-mode\\'" "" (symbol-name mode))))
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
64 " mode")))
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
65 (if (not (stringp lighter)) name
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
66 (setq lighter (replace-regexp-in-string "\\`\\s-+\\|\\-s+\\'" "" lighter))
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
67 (replace-regexp-in-string lighter lighter name t t))))
29399
addeae19bf96 (easy-mmode-derive-name): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29039
diff changeset
68
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 ;;;###autoload
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
70 (defalias 'easy-mmode-define-minor-mode 'define-minor-mode)
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
71 ;;;###autoload
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
72 (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
73 "Define a new minor mode MODE.
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
74 This function defines the associated control variable MODE, keymap MODE-map,
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
75 toggle command MODE, and hook MODE-hook.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 DOC is the documentation for the mode toggle command.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
78 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
79 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
80 Optional KEYMAP is the default (defvar) keymap bound to the mode keymap.
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
81 If it is a list, it is passed to `easy-mmode-define-keymap'
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
82 in order to build a valid keymap. It's generally better to use
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
83 a separate MODE-map variable than to use this argument.
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
84 The above three arguments can be skipped if keyword arguments are
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
85 used (see below).
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
86
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
87 BODY contains code that will be executed each time the mode is (dis)activated.
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
88 It will be executed after any toggling but before running the hooks.
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
89 BODY can start with a list of CL-style keys specifying additional arguments.
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
90 The following keyword arguments are supported:
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
91 :group Followed by the group name to use for any generated `defcustom'.
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
92 :global If non-nil specifies that the minor mode is not meant to be
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
93 buffer-local. By default, the variable is made buffer-local.
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
94 :init-value Same as the INIT-VALUE argument.
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
95 :lighter Same as the LIGHTER argument."
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
96 ;; Allow skipping the first three args.
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
97 (cond
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
98 ((keywordp init-value)
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
99 (setq body (list* init-value lighter keymap body)
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
100 init-value nil lighter nil keymap nil))
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
101 ((keywordp lighter)
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
102 (setq body (list* lighter keymap body) lighter nil keymap nil))
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
103 ((keywordp keymap) (push keymap body) (setq keymap nil)))
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
104
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 (let* ((mode-name (symbol-name mode))
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
106 (pretty-name (easy-mmode-pretty-mode-name mode lighter))
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
107 (globalp nil)
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
108 (togglep t) ;why would you ever want to toggle?
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
109 (group nil)
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
110 (extra-args nil)
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
111 (keymap-sym (if (and keymap (symbolp keymap)) keymap
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
112 (intern (concat mode-name "-map"))))
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
113 (hook (intern (concat mode-name "-hook")))
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
114 (hook-on (intern (concat mode-name "-on-hook")))
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
115 (hook-off (intern (concat mode-name "-off-hook"))))
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
116
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
117 ;; Check keys.
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
118 (while (keywordp (car body))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
119 (case (pop body)
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
120 (:init-value (setq init-value (pop body)))
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
121 (:lighter (setq lighter (pop body)))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
122 (:global (setq globalp (pop body)))
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
123 (:extra-args (setq extra-args (pop body)))
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
124 (:group (setq group (nconc group (list :group (pop body)))))
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
125 (t (pop body))))
32999
6bc392d6aef3 (define-minor-mode): Generate `turn-on-MODE' and `turn-off-MODE'
Miles Bader <miles@gnu.org>
parents: 32491
diff changeset
126
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
127 (unless group
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
128 ;; We might as well provide a best-guess default group.
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
129 (setq group
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
130 `(:group ',(intern (replace-regexp-in-string "-mode\\'" ""
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
131 mode-name)))))
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
132 ;; Add default properties to LIGHTER.
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
133 (unless (or (not (stringp lighter)) (get-text-property 0 'local-map lighter)
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
134 (get-text-property 0 'keymap lighter))
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
135 (setq lighter
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
136 (apply 'propertize lighter
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
137 'local-map (make-mode-line-mouse2-map mode)
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
138 (unless (get-text-property 0 'help-echo lighter)
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
139 (list 'help-echo
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
140 (format "mouse-2: turn off %s" pretty-name))))))
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
141
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 `(progn
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
143 ;; Define the variable to enable or disable the mode.
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
144 ,(if (not globalp)
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
145 `(progn
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
146 (defvar ,mode ,init-value ,(format "Non-nil if %s is enabled.
35562
6b8b7796f28b (define-minor-mode): Docstring fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34149
diff changeset
147 Use the command `%s' to change this variable." pretty-name mode))
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
148 (make-variable-buffer-local ',mode))
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
149
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
150 (let ((curfile (or (and (boundp 'byte-compile-current-file)
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
151 byte-compile-current-file)
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
152 load-file-name)))
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
153 `(defcustom ,mode ,init-value
35562
6b8b7796f28b (define-minor-mode): Docstring fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34149
diff changeset
154 ,(format "Non-nil if %s is enabled.
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
155 See the command `%s' for a description of this minor-mode.
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
156 Setting this variable directly does not take effect;
29399
addeae19bf96 (easy-mmode-derive-name): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29039
diff changeset
157 use either \\[customize] or the function `%s'."
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
158 pretty-name mode mode)
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
159 :set (lambda (symbol value) (funcall symbol (or value 0)))
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
160 :initialize 'custom-initialize-default
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
161 ,@group
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
162 :type 'boolean
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
163 ,@(when curfile
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
164 (list
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
165 :require
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
166 (list 'quote
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
167 (intern (file-name-nondirectory
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
168 (file-name-sans-extension curfile)))))))))
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
169
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
170 ;; The actual function.
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
171 (defun ,mode (&optional arg ,@extra-args)
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
172 ,(or doc
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
173 (format (concat "Toggle %s on or off.
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
174 Interactively, with no prefix argument, toggle the mode.
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
175 With universal prefix ARG " (unless togglep "(or if ARG is nil) ") "turn mode on.
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
176 With zero or negative ARG turn mode off.
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
177 \\{%s}") pretty-name keymap-sym))
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
178 (interactive (list (or current-prefix-arg (if ,mode 0 1))))
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
179 (setq ,mode
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
180 (if arg
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
181 (> (prefix-numeric-value arg) 0)
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
182 ,(if togglep `(not ,mode) t)))
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
183 ,@body
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
184 ;; The on/off hooks are here for backward compatibility only.
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
185 (run-hooks ',hook (if ,mode ',hook-on ',hook-off))
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
186 ;; Return the new setting.
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
187 (if (interactive-p)
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
188 (message ,(format "%s %%sabled" pretty-name)
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
189 (if ,mode "en" "dis")))
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
190 (force-mode-line-update)
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
191 ,mode)
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
192
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
193 ;; Autoloading an easy-mmode-define-minor-mode autoloads
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
194 ;; everything up-to-here.
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
195 :autoload-end
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
196
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
197 ;; The toggle's hook.
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
198 (defcustom ,hook nil
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
199 ,(format "Hook run at the end of function `%s'." mode-name)
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
200 :group ,(cadr group)
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
201 :type 'hook)
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
202
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
203 ;; Define the minor-mode keymap.
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
204 ,(unless (symbolp keymap) ;nil is also a symbol.
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
205 `(defvar ,keymap-sym
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
206 (let ((m ,keymap))
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
207 (cond ((keymapp m) m)
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
208 ((listp m) (easy-mmode-define-keymap m))
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
209 (t (error "Invalid keymap %S" ,keymap))))
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
210 ,(format "Keymap for `%s'." mode-name)))
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
211
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
212 (add-minor-mode ',mode ',lighter
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
213 ,(if keymap keymap-sym
30876
76bba9fc3c22 (define-minor-mode): Use `symbol-value' to keep the byte-compiler quiet.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29548
diff changeset
214 `(if (boundp ',keymap-sym)
76bba9fc3c22 (define-minor-mode): Use `symbol-value' to keep the byte-compiler quiet.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29548
diff changeset
215 (symbol-value ',keymap-sym))))
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
216
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
217 ;; 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
218 ,(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
219
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
220 ;;;
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
221 ;;; make global minor mode
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
222 ;;;
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
223
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
224 ;;;###autoload
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
225 (defmacro easy-mmode-define-global-mode (global-mode mode turn-on
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
226 &rest keys)
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
227 "Make GLOBAL-MODE out of the buffer-local minor MODE.
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
228 TURN-ON is a function that will be called with no args in every buffer
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
229 and that should try to turn MODE on if applicable for that buffer.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
230 KEYS is a list of CL-style keyword arguments:
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
231 :group to specify the custom group."
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
232 (let* ((global-mode-name (symbol-name global-mode))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
233 (pretty-name (easy-mmode-pretty-mode-name mode))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
234 (pretty-global-name (easy-mmode-pretty-mode-name global-mode))
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
235 (group nil)
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
236 (extra-args nil)
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
237 (buffers (intern (concat global-mode-name "-buffers")))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
238 (cmmh (intern (concat global-mode-name "-cmmh"))))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
239
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
240 ;; Check keys.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
241 (while (keywordp (car keys))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
242 (case (pop keys)
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
243 (:extra-args (setq extra-args (pop keys)))
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
244 (:group (setq group (nconc group (list :group (pop keys)))))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
245 (t (setq keys (cdr keys)))))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
246
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
247 (unless group
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
248 ;; We might as well provide a best-guess default group.
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
249 (setq group
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
250 `(:group ',(intern (replace-regexp-in-string "-mode\\'" ""
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
251 (symbol-name mode))))))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
252 `(progn
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
253 ;; The actual global minor-mode
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
254 (define-minor-mode ,global-mode
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
255 ,(format "Toggle %s in every buffer.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
256 With prefix ARG, turn %s on if and only if ARG is positive.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
257 %s is actually not turned on in every buffer but only in those
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
258 in which `%s' turns it on."
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
259 pretty-name pretty-global-name pretty-name turn-on)
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
260 :global t :extra-args ,extra-args ,@group
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
261
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
262 ;; Setup hook to handle future mode changes and new buffers.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
263 (if ,global-mode
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
264 (progn
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
265 (add-hook 'find-file-hooks ',buffers)
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
266 (add-hook 'change-major-mode-hook ',cmmh))
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
267 (remove-hook 'find-file-hooks ',buffers)
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
268 (remove-hook 'change-major-mode-hook ',cmmh))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
269
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
270 ;; Go through existing buffers.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
271 (dolist (buf (buffer-list))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
272 (with-current-buffer buf
33165
8b3f1e99c11a (easy-mmode-define-global-mode): Only turn mode off if it's on.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33162
diff changeset
273 (if ,global-mode (,turn-on) (when ,mode (,mode -1))))))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
274
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
275 ;; Autoloading easy-mmode-define-global-mode
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
276 ;; autoloads everything up-to-here.
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
277 :autoload-end
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
278
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
279 ;; List of buffers left to process.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
280 (defvar ,buffers nil)
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
281
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
282 ;; The function that calls TURN-ON in each buffer.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
283 (defun ,buffers ()
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
284 (remove-hook 'post-command-hook ',buffers)
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
285 (while ,buffers
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
286 (let ((buf (pop ,buffers)))
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
287 (when (buffer-live-p buf)
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
288 (with-current-buffer buf (,turn-on))))))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
289
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
290 ;; The function that catches kill-all-local-variables.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
291 (defun ,cmmh ()
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
292 (add-to-list ',buffers (current-buffer))
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
293 (add-hook 'post-command-hook ',buffers)))))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
294
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
295 ;;;
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
296 ;;; easy-mmode-defmap
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
297 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
298
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
299 (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
300 (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
301 (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
302 (set-keymap-parent
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
303 m
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
304 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
305 ((not (consp parents)) parents)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
306 ((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
307 (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
308 (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
309 m))))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
310
31981
533a4e5f06e2 (easy-mmode-define-keymap): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30876
diff changeset
311 ;;;###autoload
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
312 (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
313 "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
314 BS must be a list of (KEY . BINDING) where
29399
addeae19bf96 (easy-mmode-derive-name): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29039
diff changeset
315 KEY and BINDINGS are suitable for `define-key'.
addeae19bf96 (easy-mmode-derive-name): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29039
diff changeset
316 Optional NAME is passed to `make-sparse-keymap'.
addeae19bf96 (easy-mmode-derive-name): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29039
diff changeset
317 Optional map M can be used to modify an existing map.
33433
e8794ae4f856 (easy-mmode-define-keymap):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33358
diff changeset
318 ARGS is a list of additional keyword arguments."
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
319 (let (inherit dense suppress)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
320 (while args
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
321 (let ((key (pop args))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
322 (val (pop args)))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
323 (case key
33433
e8794ae4f856 (easy-mmode-define-keymap):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33358
diff changeset
324 (:name (setq name val))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
325 (:dense (setq dense val))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
326 (:inherit (setq inherit val))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
327 (:group)
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
328 ;;((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
329 (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
330 (unless (keymapp m)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
331 (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
332 (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
333 (dolist (b bs)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
334 (let ((keys (car b))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
335 (binding (cdr b)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
336 (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
337 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
338 ((symbolp key)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
339 (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
340 ((null binding)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
341 (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
342 ((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
343 (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
344 (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
345 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
346 ((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
347 ((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
348 m))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
349
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
350 ;;;###autoload
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
351 (defmacro easy-mmode-defmap (m bs doc &rest args)
31981
533a4e5f06e2 (easy-mmode-define-keymap): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30876
diff changeset
352 `(defconst ,m
533a4e5f06e2 (easy-mmode-define-keymap): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30876
diff changeset
353 (easy-mmode-define-keymap ,bs nil (if (boundp ',m) ,m) ,(cons 'list args))
533a4e5f06e2 (easy-mmode-define-keymap): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30876
diff changeset
354 ,doc))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
355
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
356
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
357 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
358 ;;; easy-mmode-defsyntax
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
359 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
360
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
361 (defun easy-mmode-define-syntax (css args)
32491
2fc546f941df (easy-mmode-define-syntax): Use plist-get and allow :inherit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32199
diff changeset
362 (let ((st (make-syntax-table (plist-get args :copy)))
2fc546f941df (easy-mmode-define-syntax): Use plist-get and allow :inherit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32199
diff changeset
363 (parent (plist-get args :inherit)))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
364 (dolist (cs css)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
365 (let ((char (car cs))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
366 (syntax (cdr cs)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
367 (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
368 (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
369 (modify-syntax-entry char syntax st))))
32491
2fc546f941df (easy-mmode-define-syntax): Use plist-get and allow :inherit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32199
diff changeset
370 (if parent (set-char-table-parent
2fc546f941df (easy-mmode-define-syntax): Use plist-get and allow :inherit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32199
diff changeset
371 st (if (symbolp parent) (symbol-value parent) parent)))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
372 st))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
373
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
374 ;;;###autoload
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
375 (defmacro easy-mmode-defsyntax (st css doc &rest args)
32491
2fc546f941df (easy-mmode-define-syntax): Use plist-get and allow :inherit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32199
diff changeset
376 "Define variable ST as a syntax-table.
37406
3886350a8826 (easy-mmode-defsyntax): Unquote `doc'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35562
diff changeset
377 CSS contains a list of syntax specifications of the form (CHAR . SYNTAX)."
28086
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
378 `(progn
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
379 (autoload 'easy-mmode-define-syntax "easy-mmode")
37406
3886350a8826 (easy-mmode-defsyntax): Unquote `doc'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35562
diff changeset
380 (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
381
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
382
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
383
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
384 ;;;
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
385 ;;; easy-mmode-define-navigation
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
386 ;;;
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
387
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
388 (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
389 "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
390 RE determines the places the commands should move point to.
33358
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
391 NAME should describe the entities matched by RE. It is used to build
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
392 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
393 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
394 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
395 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
396 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
397 (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
398 (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
399 (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
400 (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
401 `(progn
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
402 (add-to-list 'debug-ignored-errors
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
403 ,(concat "^No \\(previous\\|next\\) " (regexp-quote name)))
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
404 (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
405 ,(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
406 (interactive)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
407 (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
408 (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
409 (if (looking-at ,re) (incf count))
33358
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
410 (if (not (re-search-forward ,re nil t count))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
411 (if (looking-at ,re)
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
412 (goto-char (or ,(if endfun `(,endfun)) (point-max)))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
413 (error ,(format "No next %s" name)))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
414 (goto-char (match-beginning 0))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
415 (when (eq (current-buffer) (window-buffer (selected-window)))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
416 (let ((endpt (or (save-excursion
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
417 ,(if endfun `(,endfun)
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
418 `(re-search-forward ,re nil t 2)))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
419 (point-max))))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
420 (unless (pos-visible-in-window-p endpt nil t)
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
421 (recenter '(0))))))))
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
422 (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
423 ,(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
424 (interactive)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
425 (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
426 (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
427 (unless (re-search-backward ,re nil t count)
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
428 (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
429
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 (provide 'easy-mmode)
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 ;;; easy-mmode.el ends here