annotate lisp/emacs-lisp/easy-mmode.el @ 51010:f79532778159

Rewrote the local minor mode so that it can be sticky as well and made sticky the default. Reimplemented the global minor mode. Updated the commentary section to document these changes. (hl-line-sticky-flag): New user option. (hl-line-overlay): Made it buffer-local and gave it a docstring. (global-hl-line-overlay): New variable. (hl-line-mode): Rewritten to use `hl-line-sticky-flag'. (hl-line-highlight): Rewritten to use `hl-line-sticky-flag'. (hl-line-unhighlight): Updated docstring. (global-hl-line-mode): Implemented directly so that is does not depend on `hl-line-mode' any more. (global-hl-line-highlight, global-hl-line-unhighlight): New functions.
author Lute Kamstra <lute@gnu.org>
date Thu, 15 May 2003 13:21:23 +0000
parents e0775ee7f599
children 418f1ce2a14e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 38324
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
38761
7047bd7df7fb (define-minor-mode): Use
Gerd Moellmann <gerd@gnu.org>
parents: 38455
diff changeset
3 ;; Copyright (C) 1997, 2000, 2001 Free Software Foundation, Inc.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
38455
802c948ddb3a *** empty log message ***
Pavel Janík <Pavel@Janik.cz>
parents: 38436
diff changeset
5 ;; Author: Georges Brun-Cottan <Georges.Brun-Cottan@inria.fr>
802c948ddb3a *** empty log message ***
Pavel Janík <Pavel@Janik.cz>
parents: 38436
diff changeset
6 ;; Maintainer: Stefan Monnier <monnier@gnu.org>
802c948ddb3a *** empty log message ***
Pavel Janík <Pavel@Janik.cz>
parents: 38436
diff changeset
7
802c948ddb3a *** empty log message ***
Pavel Janík <Pavel@Janik.cz>
parents: 38436
diff changeset
8 ;; Keywords: extensions lisp
18388
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 ;; This file is part of GNU Emacs.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; 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
14 ;; the Free Software Foundation; either version 2, or (at your option)
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 ;; any later version.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 ;; 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
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 ;; Boston, MA 02111-1307, USA.
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 ;;; Commentary:
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 ;; Minor modes are useful and common. This package makes defining a
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 ;; minor mode easy, by focusing on the writing of the minor mode
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 ;; functionalities themselves. Moreover, this package enforces a
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 ;; conventional naming of user interface primitives, making things
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 ;; natural for the minor-mode end-users.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 ;; For each mode, easy-mmode defines the following:
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 ;; <mode> : The minor mode predicate. A buffer-local variable.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 ;; <mode>-map : The keymap possibly associated to <mode>.
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
38 ;; <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
39 ;; see `define-minor-mode' documentation
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 ;;
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 ;; eval
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
42 ;; (pp (macroexpand '(define-minor-mode <your-mode> <doc>)))
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 ;; to check the result before using it.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 ;; The order in which minor modes are installed is important. Keymap
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 ;; lookup proceeds down minor-mode-map-alist, and the order there
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 ;; 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
48 ;; installed. Perhaps there should be a feature to let you specify
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 ;; orderings.
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
51 ;; 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
52 ;; 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
53
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
54 ;;; Code:
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
56 (eval-when-compile (require 'cl))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
57
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
58 (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
59 "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
60 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
61 (let* ((case-fold-search t)
32048
39617f078b9d (easy-mmode-pretty-mode-name): Prettier.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31981
diff changeset
62 (name (concat (replace-regexp-in-string
39617f078b9d (easy-mmode-pretty-mode-name): Prettier.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31981
diff changeset
63 "-Minor" " minor"
39617f078b9d (easy-mmode-pretty-mode-name): Prettier.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31981
diff changeset
64 (capitalize (replace-regexp-in-string
39617f078b9d (easy-mmode-pretty-mode-name): Prettier.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31981
diff changeset
65 "-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
66 " mode")))
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
67 (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
68 (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
69 (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
70
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 ;;;###autoload
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
72 (defalias 'easy-mmode-define-minor-mode 'define-minor-mode)
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
73 ;;;###autoload
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
74 (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
75 "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
76 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
77 toggle command MODE, and hook MODE-hook.
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79 DOC is the documentation for the mode toggle command.
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
80 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
81 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
82 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
83 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
84 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
85 a separate MODE-map variable than to use this argument.
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
86 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
87 used (see below).
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
88
26551
271f77895660 Changed maintainer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 25408
diff changeset
89 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
90 It will be executed after any toggling but before running the hooks.
47788
1174e4c84d58 (define-minor-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 47657
diff changeset
91 Before the actual body code, you can write
1174e4c84d58 (define-minor-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 47657
diff changeset
92 keyword arguments (alternating keywords and values).
50300
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
93 These following keyword arguments are supported (other keywords
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
94 will be passed to `defcustom' if the minor mode is global):
47788
1174e4c84d58 (define-minor-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 47657
diff changeset
95 :group GROUP Custom group name to use in all generated `defcustom' forms.
47463
2b213bd55695 (define-minor-mode): Add a :require arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47043
diff changeset
96 :global GLOBAL If non-nil specifies that the minor mode is not meant to be
47788
1174e4c84d58 (define-minor-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 47657
diff changeset
97 buffer-local, so don't make the variable MODE buffer-local.
1174e4c84d58 (define-minor-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 47657
diff changeset
98 By default, the mode is buffer-local.
47463
2b213bd55695 (define-minor-mode): Add a :require arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47043
diff changeset
99 :init-value VAL Same as the INIT-VALUE argument.
2b213bd55695 (define-minor-mode): Add a :require arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47043
diff changeset
100 :lighter SPEC Same as the LIGHTER argument.
47788
1174e4c84d58 (define-minor-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 47657
diff changeset
101 :require SYM Same as in `defcustom'.
1174e4c84d58 (define-minor-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 47657
diff changeset
102
1174e4c84d58 (define-minor-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 47657
diff changeset
103 For example, you could write
1174e4c84d58 (define-minor-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 47657
diff changeset
104 (define-minor-mode foo-mode \"If enabled, foo on you!\"
50300
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
105 :lighter \" Foo\" :require 'foo :global t :group 'hassle :version \"27.5\"
47788
1174e4c84d58 (define-minor-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 47657
diff changeset
106 ...BODY CODE...)"
1174e4c84d58 (define-minor-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 47657
diff changeset
107
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
108 ;; Allow skipping the first three args.
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
109 (cond
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
110 ((keywordp init-value)
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
111 (setq body (list* init-value lighter keymap body)
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
112 init-value nil lighter nil keymap nil))
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
113 ((keywordp lighter)
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
114 (setq body (list* lighter keymap body) lighter nil keymap nil))
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
115 ((keywordp keymap) (push keymap body) (setq keymap nil)))
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
116
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 (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
118 (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
119 (globalp nil)
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
120 (group nil)
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
121 (extra-args nil)
50300
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
122 (extra-keywords nil)
47463
2b213bd55695 (define-minor-mode): Add a :require arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47043
diff changeset
123 (require t)
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
124 (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
125 (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
126 (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
127 (hook-on (intern (concat mode-name "-on-hook")))
50300
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
128 (hook-off (intern (concat mode-name "-off-hook")))
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
129 keyw)
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
130
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
131 ;; Check keys.
50300
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
132 (while (keywordp (setq keyw (car body)))
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
133 (setq body (cdr body))
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
134 (case keyw
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
135 (:init-value (setq init-value (pop body)))
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
136 (:lighter (setq lighter (pop body)))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
137 (:global (setq globalp (pop body)))
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
138 (:extra-args (setq extra-args (pop body)))
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
139 (:group (setq group (nconc group (list :group (pop body)))))
47463
2b213bd55695 (define-minor-mode): Add a :require arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47043
diff changeset
140 (:require (setq require (pop body)))
50300
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
141 (t (push keyw extra-keywords) (push (pop body) extra-keywords))))
32999
6bc392d6aef3 (define-minor-mode): Generate `turn-on-MODE' and `turn-off-MODE'
Miles Bader <miles@gnu.org>
parents: 32491
diff changeset
142
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
143 (unless group
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
144 ;; 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
145 (setq group
48838
e0689be193e2 (define-minor-mode): Use `custom-current-group'.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47788
diff changeset
146 `(:group ',(or (custom-current-group)
e0689be193e2 (define-minor-mode): Use `custom-current-group'.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47788
diff changeset
147 (intern (replace-regexp-in-string
e0689be193e2 (define-minor-mode): Use `custom-current-group'.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47788
diff changeset
148 "-mode\\'" "" mode-name))))))
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
149
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 `(progn
25408
68c51b1a537f (easy-mmode-define-minor-mode):
Karl Heuer <kwzh@gnu.org>
parents: 24935
diff changeset
151 ;; 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
152 ,(if (not globalp)
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
153 `(progn
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
154 (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
155 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
156 (make-variable-buffer-local ',mode))
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
157
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
158 (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
159 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
160 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
161 `(defcustom ,mode ,init-value
35562
6b8b7796f28b (define-minor-mode): Docstring fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34149
diff changeset
162 ,(format "Non-nil if %s is enabled.
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
163 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
164 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
165 use either \\[customize] or the function `%s'."
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
166 pretty-name mode mode)
50300
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
167 :set 'custom-set-minor-mode
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
168 :initialize 'custom-initialize-default
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
169 ,@group
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
170 :type 'boolean
47463
2b213bd55695 (define-minor-mode): Add a :require arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47043
diff changeset
171 ,@(cond
2b213bd55695 (define-minor-mode): Add a :require arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47043
diff changeset
172 ((not (and curfile require)) nil)
2b213bd55695 (define-minor-mode): Add a :require arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47043
diff changeset
173 ((not (eq require t)) `(:require ,require))
2b213bd55695 (define-minor-mode): Add a :require arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47043
diff changeset
174 (t `(:require
2b213bd55695 (define-minor-mode): Add a :require arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47043
diff changeset
175 ',(intern (file-name-nondirectory
50300
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
176 (file-name-sans-extension curfile))))))
7e4e15b857f3 (define-minor-mode): Use custom-set-minor-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
177 ,@(nreverse extra-keywords))))
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
178
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
179 ;; The actual function.
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
180 (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
181 ,(or doc
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
182 (format (concat "Toggle %s on or off.
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
183 Interactively, with no prefix argument, toggle the mode.
46900
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
184 With universal prefix ARG 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
185 With zero or negative ARG turn mode off.
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
186 \\{%s}") pretty-name keymap-sym))
46900
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
187 ;; Use `toggle' rather than (if ,mode 0 1) so that using
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
188 ;; repeat-command still does the toggling correctly.
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
189 (interactive (list (or current-prefix-arg 'toggle)))
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
190 (setq ,mode
46900
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
191 (cond
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
192 ((eq arg 'toggle) (not ,mode))
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
193 (arg (> (prefix-numeric-value arg) 0))
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
194 (t
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
195 (if (null ,mode) t
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
196 (message
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
197 "Toggling %s off; better pass an explicit argument."
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
198 ',mode)
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
199 nil))))
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
200 ,@body
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
201 ;; 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
202 (run-hooks ',hook (if ,mode ',hook-on ',hook-off))
47043
360c6fcdde04 (define-minor-mode): Use customize-mark-as-set for global minor modes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46900
diff changeset
203 (if (interactive-p)
360c6fcdde04 (define-minor-mode): Use customize-mark-as-set for global minor modes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46900
diff changeset
204 (progn
360c6fcdde04 (define-minor-mode): Use customize-mark-as-set for global minor modes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46900
diff changeset
205 ,(if globalp `(customize-mark-as-set ',mode))
50635
e0775ee7f599 (define-minor-mode): Only echo a message if the body didn't do so already.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50300
diff changeset
206 (unless (current-message)
47043
360c6fcdde04 (define-minor-mode): Use customize-mark-as-set for global minor modes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46900
diff changeset
207 (message ,(format "%s %%sabled" pretty-name)
50635
e0775ee7f599 (define-minor-mode): Only echo a message if the body didn't do so already.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50300
diff changeset
208 (if ,mode "en" "dis")))))
47043
360c6fcdde04 (define-minor-mode): Use customize-mark-as-set for global minor modes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46900
diff changeset
209 (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
210 ;; 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
211 ,mode)
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
212 ;; 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
213 ;; 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
214 :autoload-end
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
215
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
216 ;; The toggle's hook.
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
217 (defcustom ,hook nil
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
218 ,(format "Hook run at the end of function `%s'." mode-name)
48838
e0689be193e2 (define-minor-mode): Use `custom-current-group'.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47788
diff changeset
219 ,@group
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
220 :type 'hook)
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
221
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
222 ;; 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
223 ,(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
224 `(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
225 (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
226 (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
227 ((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
228 (t (error "Invalid keymap %S" ,keymap))))
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
229 ,(format "Keymap for `%s'." mode-name)))
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
230
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
231 (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
232 ,(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
233 `(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
234 (symbol-value ',keymap-sym))))
49598
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48838
diff changeset
235
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
236 ;; If the mode is global, call the function according to the default.
47657
e8df9e898436 (define-minor-mode): Don't add properties
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47463
diff changeset
237 ,(if globalp
e8df9e898436 (define-minor-mode): Don't add properties
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47463
diff changeset
238 `(if (and load-file-name (not (equal ,init-value ,mode)))
e8df9e898436 (define-minor-mode): Don't add properties
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47463
diff changeset
239 (eval-after-load load-file-name '(,mode (if ,mode 1 -1))))))))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
240
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
241 ;;;
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
242 ;;; make global minor mode
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
243 ;;;
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
244
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
245 ;;;###autoload
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
246 (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
247 &rest keys)
33131
8d1ed5c84809 (define-minor-mode):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33001
diff changeset
248 "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
249 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
250 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
251 KEYS is a list of CL-style keyword arguments:
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
252 :group to specify the custom group."
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
253 (let* ((global-mode-name (symbol-name global-mode))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
254 (pretty-name (easy-mmode-pretty-mode-name mode))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
255 (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
256 (group nil)
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
257 (extra-args nil)
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
258 (buffers (intern (concat global-mode-name "-buffers")))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
259 (cmmh (intern (concat global-mode-name "-cmmh"))))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
260
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
261 ;; Check keys.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
262 (while (keywordp (car keys))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
263 (case (pop keys)
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
264 (:extra-args (setq extra-args (pop keys)))
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
265 (: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
266 (t (setq keys (cdr keys)))))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
267
33162
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
268 (unless group
ccf6cd7d4512 (define-minor-mode): Remove :toggle arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33131
diff changeset
269 ;; 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
270 (setq group
48838
e0689be193e2 (define-minor-mode): Use `custom-current-group'.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47788
diff changeset
271 `(:group ',(or (custom-current-group)
e0689be193e2 (define-minor-mode): Use `custom-current-group'.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47788
diff changeset
272 (intern (replace-regexp-in-string
e0689be193e2 (define-minor-mode): Use `custom-current-group'.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47788
diff changeset
273 "-mode\\'" "" (symbol-name mode)))))))
e0689be193e2 (define-minor-mode): Use `custom-current-group'.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47788
diff changeset
274
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
275 `(progn
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
276 ;; The actual global minor-mode
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
277 (define-minor-mode ,global-mode
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
278 ,(format "Toggle %s in every buffer.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
279 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
280 %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
281 in which `%s' turns it on."
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
282 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
283 :global t :extra-args ,extra-args ,@group
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
284
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
285 ;; 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
286 (if ,global-mode
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
287 (progn
46900
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
288 (add-hook 'find-file-hook ',buffers)
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
289 (add-hook 'change-major-mode-hook ',cmmh))
46900
3c3d686b25fa (easy-mmode-define-global-mode): Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46873
diff changeset
290 (remove-hook 'find-file-hook ',buffers)
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
291 (remove-hook 'change-major-mode-hook ',cmmh))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
292
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
293 ;; Go through existing buffers.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
294 (dolist (buf (buffer-list))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
295 (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
296 (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
297
29548
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
298 ;; 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
299 ;; 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
300 :autoload-end
71b284c55162 (define-minor-mode): If KEYMAP is a symbol, just use it.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29414
diff changeset
301
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
302 ;; List of buffers left to process.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
303 (defvar ,buffers nil)
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
304
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
305 ;; The function that calls TURN-ON in each buffer.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
306 (defun ,buffers ()
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
307 (remove-hook 'post-command-hook ',buffers)
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
308 (while ,buffers
29414
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
309 (let ((buf (pop ,buffers)))
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
310 (when (buffer-live-p buf)
b18a17d5d9c6 (easy-mmode-define-global-mode): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29411
diff changeset
311 (with-current-buffer buf (,turn-on))))))
46873
7be80f782e2c (easy-mmode-define-global-mode): Put `definition-name' properties on
Richard M. Stallman <rms@gnu.org>
parents: 43709
diff changeset
312 (put ',buffers 'definition-name ',global-mode)
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
313
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
314 ;; The function that catches kill-all-local-variables.
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
315 (defun ,cmmh ()
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
316 (add-to-list ',buffers (current-buffer))
46873
7be80f782e2c (easy-mmode-define-global-mode): Put `definition-name' properties on
Richard M. Stallman <rms@gnu.org>
parents: 43709
diff changeset
317 (add-hook 'post-command-hook ',buffers))
7be80f782e2c (easy-mmode-define-global-mode): Put `definition-name' properties on
Richard M. Stallman <rms@gnu.org>
parents: 43709
diff changeset
318 (put ',cmmh 'definition-name ',global-mode))))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
319
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
320 ;;;
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
321 ;;; easy-mmode-defmap
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
322 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
323
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
324 (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
325 (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
326 (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
327 (set-keymap-parent
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
328 m
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
329 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
330 ((not (consp parents)) parents)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
331 ((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
332 (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
333 (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
334 m))))))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
335
31981
533a4e5f06e2 (easy-mmode-define-keymap): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30876
diff changeset
336 ;;;###autoload
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
337 (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
338 "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
339 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
340 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
341 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
342 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
343 ARGS is a list of additional keyword arguments."
50635
e0775ee7f599 (define-minor-mode): Only echo a message if the body didn't do so already.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50300
diff changeset
344 (let (inherit dense)
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
345 (while args
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
346 (let ((key (pop args))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
347 (val (pop args)))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
348 (case key
33433
e8794ae4f856 (easy-mmode-define-keymap):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33358
diff changeset
349 (:name (setq name val))
29411
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
350 (:dense (setq dense val))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
351 (:inherit (setq inherit val))
232f7e558a38 Require CL during compilation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29406
diff changeset
352 (:group)
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
353 (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
354 (unless (keymapp m)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
355 (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
356 (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
357 (dolist (b bs)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
358 (let ((keys (car b))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
359 (binding (cdr b)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
360 (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
361 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
362 ((symbolp key)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
363 (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
364 ((null binding)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
365 (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
366 ((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
367 (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
368 (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
369 (cond
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
370 ((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
371 ((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
372 m))
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-defmap (m bs doc &rest args)
31981
533a4e5f06e2 (easy-mmode-define-keymap): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30876
diff changeset
376 `(defconst ,m
533a4e5f06e2 (easy-mmode-define-keymap): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30876
diff changeset
377 (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
378 ,doc))
28081
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
379
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
380
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 ;;; easy-mmode-defsyntax
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
383 ;;;
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
384
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
385 (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
386 (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
387 (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
388 (dolist (cs css)
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
389 (let ((char (car cs))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
390 (syntax (cdr cs)))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
391 (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
392 (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
393 (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
394 (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
395 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
396 st))
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
397
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
398 ;;;###autoload
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
399 (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
400 "Define variable ST as a syntax-table.
37406
3886350a8826 (easy-mmode-defsyntax): Unquote `doc'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35562
diff changeset
401 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
402 `(progn
9ff6e6a6c6b5 (easy-mmode-defmap, easy-mmode-defsyntax): Autoload the functions used.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28081
diff changeset
403 (autoload 'easy-mmode-define-syntax "easy-mmode")
37406
3886350a8826 (easy-mmode-defsyntax): Unquote `doc'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35562
diff changeset
404 (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
405
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
406
6360842e5962 (easy-mmode-define-keymap): Extend to allow more flexibility.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26551
diff changeset
407
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
408 ;;;
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
409 ;;; easy-mmode-define-navigation
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
410 ;;;
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
411
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
412 (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
413 "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
414 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
415 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
416 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
417 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
418 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
419 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
420 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
421 (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
422 (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
423 (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
424 (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
425 `(progn
29406
f4b12c3efee8 (easy-mmode-define-toggle): Remove (inline into define-minor-mode).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29399
diff changeset
426 (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
427 ,(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
428 (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
429 ,(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
430 (interactive)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
431 (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
432 (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
433 (if (looking-at ,re) (incf count))
33358
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
434 (if (not (re-search-forward ,re nil t count))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
435 (if (looking-at ,re)
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
436 (goto-char (or ,(if endfun `(,endfun)) (point-max)))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
437 (error ,(format "No next %s" name)))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
438 (goto-char (match-beginning 0))
38324
ce45998cedf2 (define-minor-mode): Use eval-after-load
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37406
diff changeset
439 (when (and (eq (current-buffer) (window-buffer (selected-window)))
ce45998cedf2 (define-minor-mode): Use eval-after-load
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37406
diff changeset
440 (interactive-p))
33358
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
441 (let ((endpt (or (save-excursion
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
442 ,(if endfun `(,endfun)
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
443 `(re-search-forward ,re nil t 2)))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
444 (point-max))))
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
445 (unless (pos-visible-in-window-p endpt nil t)
a86c95343fa5 (easy-mmode-define-navigation):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33165
diff changeset
446 (recenter '(0))))))))
28235
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
447 (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
448 ,(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
449 (interactive)
963f1d516e92 * derived.el (define-derived-mode): Don't autoload anymore.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28086
diff changeset
450 (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
451 (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
452 (unless (re-search-backward ,re nil t count)
29039
d8bafae6beb2 Update copyright and commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28239
diff changeset
453 (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
454
18388
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 (provide 'easy-mmode)
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456
7e14277c51f3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 ;;; easy-mmode.el ends here