Mercurial > emacs
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 |
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 | 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 | 4 |
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 | 7 |
8 ;; This file is part of GNU Emacs. | |
9 | |
10 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
11 ;; it under the terms of the GNU General Public License as published by | |
12 ;; the Free Software Foundation; either version 2, or (at your option) | |
13 ;; any later version. | |
14 | |
15 ;; GNU Emacs is distributed in the hope that it will be useful, | |
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 ;; GNU General Public License for more details. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
23 ;; Boston, MA 02111-1307, USA. | |
24 | |
25 ;;; Commentary: | |
26 | |
27 ;; Minor modes are useful and common. This package makes defining a | |
28 ;; minor mode easy, by focusing on the writing of the minor mode | |
29 ;; functionalities themselves. Moreover, this package enforces a | |
30 ;; conventional naming of user interface primitives, making things | |
31 ;; natural for the minor-mode end-users. | |
32 | |
33 ;; For each mode, easy-mmode defines the following: | |
34 ;; <mode> : The minor mode predicate. A buffer-local variable. | |
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 | 38 ;; |
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 | 41 ;; to check the result before using it. |
42 | |
43 ;; The order in which minor modes are installed is important. Keymap | |
44 ;; lookup proceeds down minor-mode-map-alist, and the order there | |
45 ;; tends to be the reverse of the order in which the modes were | |
46 ;; installed. Perhaps there should be a feature to let you specify | |
47 ;; orderings. | |
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 | 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 | 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 | 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 | 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 | 76 |
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 | 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 | 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 | 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 | 430 (provide 'easy-mmode) |
431 | |
432 ;;; easy-mmode.el ends here |