annotate lisp/subr.el @ 88331:87edb010d368

*** empty log message ***
author Henrik Enberg <henrik.enberg@telia.com>
date Thu, 09 Mar 2006 02:16:39 +0000
parents d7ddb3e565de
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 648
diff changeset
1 ;;; subr.el --- basic lisp subroutines for Emacs
787
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 779
diff changeset
2
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3 ;; Copyright (C) 1985, 1986, 1992, 1994, 1995, 1999, 2000, 2001, 2002, 2003,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
4 ;; 2004, 2005 Free Software Foundation, Inc.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
5
45078
829beb9a6a4b Follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 44980
diff changeset
6 ;; Maintainer: FSF
829beb9a6a4b Follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 44980
diff changeset
7 ;; Keywords: internal
829beb9a6a4b Follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 44980
diff changeset
8
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
10
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
707
e4253da532fb *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 675
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
14 ;; any later version.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
15
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
20
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13936
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
24 ;; Boston, MA 02110-1301, USA.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
25
38414
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37070
diff changeset
26 ;;; Commentary:
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37070
diff changeset
27
787
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 779
diff changeset
28 ;;; Code:
18880
1ed40ed8e0c1 (custom-declare-variable-early): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18828
diff changeset
29 (defvar custom-declare-variable-list nil
1ed40ed8e0c1 (custom-declare-variable-early): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18828
diff changeset
30 "Record `defcustom' calls made before `custom.el' is loaded to handle them.
1ed40ed8e0c1 (custom-declare-variable-early): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18828
diff changeset
31 Each element of this list holds the arguments to one call to `defcustom'.")
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
32
19662
791a40c16c0b Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 19584
diff changeset
33 ;; Use this, rather than defcustom, in subr.el and other files loaded
18880
1ed40ed8e0c1 (custom-declare-variable-early): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18828
diff changeset
34 ;; before custom.el.
1ed40ed8e0c1 (custom-declare-variable-early): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18828
diff changeset
35 (defun custom-declare-variable-early (&rest arguments)
1ed40ed8e0c1 (custom-declare-variable-early): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18828
diff changeset
36 (setq custom-declare-variable-list
1ed40ed8e0c1 (custom-declare-variable-early): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18828
diff changeset
37 (cons arguments custom-declare-variable-list)))
44129
444bd245e176 (macro-declaration-function): New function. Set the
Gerd Moellmann <gerd@gnu.org>
parents: 43833
diff changeset
38
444bd245e176 (macro-declaration-function): New function. Set the
Gerd Moellmann <gerd@gnu.org>
parents: 43833
diff changeset
39
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
40 ;;;; Basic Lisp macros.
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
41
40822
b10e7d6fb95b (with-local-quit): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 40282
diff changeset
42 (defalias 'not 'null)
b10e7d6fb95b (with-local-quit): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 40282
diff changeset
43
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
44 (defmacro noreturn (form)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
45 "Evaluate FORM, expecting it not to return.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
46 If FORM does return, signal an error."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
47 `(prog1 ,form
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
48 (error "Form marked with `noreturn' did return")))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
49
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
50 (defmacro 1value (form)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
51 "Evaluate FORM, expecting a constant return value.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
52 This is the global do-nothing version. There is also `testcover-1value'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
53 that complains if FORM ever does return differing values."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
54 form)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
55
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
56 (defmacro lambda (&rest cdr)
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
57 "Return a lambda expression.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
58 A call of the form (lambda ARGS DOCSTRING INTERACTIVE BODY) is
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
59 self-quoting; the result of evaluating the lambda expression is the
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
60 expression itself. The lambda expression may then be treated as a
10178
be0081d9ba76 (lambda): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 10025
diff changeset
61 function, i.e., stored as the function value of a symbol, passed to
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
62 `funcall' or `mapcar', etc.
10178
be0081d9ba76 (lambda): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 10025
diff changeset
63
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
64 ARGS should take the same form as an argument list for a `defun'.
12395
71727759437e (lambda): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12296
diff changeset
65 DOCSTRING is an optional documentation string.
71727759437e (lambda): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12296
diff changeset
66 If present, it should describe how to call the function.
71727759437e (lambda): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12296
diff changeset
67 But documentation strings are usually not useful in nameless functions.
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
68 INTERACTIVE should be a call to the function `interactive', which see.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
69 It may also be omitted.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
70 BODY should be a list of Lisp expressions.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
71
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
72 \(fn ARGS [DOCSTRING] [INTERACTIVE] BODY)"
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
73 ;; Note that this definition should not use backquotes; subr.el should not
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
74 ;; depend on backquote.el.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
75 (list 'function (cons 'lambda cdr)))
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
76
25437
95301c74bdd9 Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 25436
diff changeset
77 (defmacro push (newelt listname)
25580
b76f1a72649a (push): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 25469
diff changeset
78 "Add NEWELT to the list stored in the symbol LISTNAME.
25437
95301c74bdd9 Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 25436
diff changeset
79 This is equivalent to (setq LISTNAME (cons NEWELT LISTNAME)).
25436
d24cf1a4dd34 (push, pop): New macros.
Richard M. Stallman <rms@gnu.org>
parents: 25295
diff changeset
80 LISTNAME must be a symbol."
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
81 (declare (debug (form sexp)))
25469
6762c8a75fd7 (push): Fix typo.
Dave Love <fx@gnu.org>
parents: 25437
diff changeset
82 (list 'setq listname
6762c8a75fd7 (push): Fix typo.
Dave Love <fx@gnu.org>
parents: 25437
diff changeset
83 (list 'cons newelt listname)))
25436
d24cf1a4dd34 (push, pop): New macros.
Richard M. Stallman <rms@gnu.org>
parents: 25295
diff changeset
84
d24cf1a4dd34 (push, pop): New macros.
Richard M. Stallman <rms@gnu.org>
parents: 25295
diff changeset
85 (defmacro pop (listname)
d24cf1a4dd34 (push, pop): New macros.
Richard M. Stallman <rms@gnu.org>
parents: 25295
diff changeset
86 "Return the first element of LISTNAME's value, and remove it from the list.
d24cf1a4dd34 (push, pop): New macros.
Richard M. Stallman <rms@gnu.org>
parents: 25295
diff changeset
87 LISTNAME must be a symbol whose value is a list.
d24cf1a4dd34 (push, pop): New macros.
Richard M. Stallman <rms@gnu.org>
parents: 25295
diff changeset
88 If the value is nil, `pop' returns nil but does not actually
d24cf1a4dd34 (push, pop): New macros.
Richard M. Stallman <rms@gnu.org>
parents: 25295
diff changeset
89 change the list."
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
90 (declare (debug (sexp)))
45823
7ec7fff5e571 (pop): Move the call to `car' outside the prog1, as the compiler
Miles Bader <miles@gnu.org>
parents: 45821
diff changeset
91 (list 'car
7ec7fff5e571 (pop): Move the call to `car' outside the prog1, as the compiler
Miles Bader <miles@gnu.org>
parents: 45821
diff changeset
92 (list 'prog1 listname
7ec7fff5e571 (pop): Move the call to `car' outside the prog1, as the compiler
Miles Bader <miles@gnu.org>
parents: 45821
diff changeset
93 (list 'setq listname (list 'cdr listname)))))
25436
d24cf1a4dd34 (push, pop): New macros.
Richard M. Stallman <rms@gnu.org>
parents: 25295
diff changeset
94
16845
adc714dc8e3c (when, unless): Definitions moved from cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 16556
diff changeset
95 (defmacro when (cond &rest body)
27810
1d7650c95e0a (when, unless, split-string): Doc fix.
Dave Love <fx@gnu.org>
parents: 27482
diff changeset
96 "If COND yields non-nil, do BODY, else return nil."
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
97 (declare (indent 1) (debug t))
16845
adc714dc8e3c (when, unless): Definitions moved from cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 16556
diff changeset
98 (list 'if cond (cons 'progn body)))
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
99
16845
adc714dc8e3c (when, unless): Definitions moved from cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 16556
diff changeset
100 (defmacro unless (cond &rest body)
27810
1d7650c95e0a (when, unless, split-string): Doc fix.
Dave Love <fx@gnu.org>
parents: 27482
diff changeset
101 "If COND yields nil, do BODY, else return nil."
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
102 (declare (indent 1) (debug t))
16845
adc714dc8e3c (when, unless): Definitions moved from cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 16556
diff changeset
103 (cons 'if (cons cond (cons nil body))))
19491
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
104
27376
674b7f75841e (dolist, dotimes): Moved from cl-macs.el.
Richard M. Stallman <rms@gnu.org>
parents: 27297
diff changeset
105 (defmacro dolist (spec &rest body)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
106 "Loop over a list.
27376
674b7f75841e (dolist, dotimes): Moved from cl-macs.el.
Richard M. Stallman <rms@gnu.org>
parents: 27297
diff changeset
107 Evaluate BODY with VAR bound to each car from LIST, in turn.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
108 Then evaluate RESULT to get return value, default nil.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
109
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
110 \(fn (VAR LIST [RESULT]) BODY...)"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
111 (declare (indent 1) (debug ((symbolp form &optional form) body)))
27383
b1b3e778f7ac Make the definitions of dolist and dotimes work
Richard M. Stallman <rms@gnu.org>
parents: 27376
diff changeset
112 (let ((temp (make-symbol "--dolist-temp--")))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
113 `(let ((,temp ,(nth 1 spec))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
114 ,(car spec))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
115 (while ,temp
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
116 (setq ,(car spec) (car ,temp))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
117 (setq ,temp (cdr ,temp))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
118 ,@body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
119 ,@(if (cdr (cdr spec))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
120 `((setq ,(car spec) nil) ,@(cdr (cdr spec)))))))
27376
674b7f75841e (dolist, dotimes): Moved from cl-macs.el.
Richard M. Stallman <rms@gnu.org>
parents: 27297
diff changeset
121
674b7f75841e (dolist, dotimes): Moved from cl-macs.el.
Richard M. Stallman <rms@gnu.org>
parents: 27297
diff changeset
122 (defmacro dotimes (spec &rest body)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
123 "Loop a certain number of times.
27376
674b7f75841e (dolist, dotimes): Moved from cl-macs.el.
Richard M. Stallman <rms@gnu.org>
parents: 27297
diff changeset
124 Evaluate BODY with VAR bound to successive integers running from 0,
674b7f75841e (dolist, dotimes): Moved from cl-macs.el.
Richard M. Stallman <rms@gnu.org>
parents: 27297
diff changeset
125 inclusive, to COUNT, exclusive. Then evaluate RESULT to get
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
126 the return value (nil if RESULT is omitted).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
127
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
128 \(fn (VAR COUNT [RESULT]) BODY...)"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
129 (declare (indent 1) (debug dolist))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
130 (let ((temp (make-symbol "--dotimes-temp--"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
131 (start 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
132 (end (nth 1 spec)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
133 `(let ((,temp ,end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
134 (,(car spec) ,start))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
135 (while (< ,(car spec) ,temp)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
136 ,@body
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
137 (setq ,(car spec) (1+ ,(car spec))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
138 ,@(cdr (cdr spec)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
139
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
140 (defmacro declare (&rest specs)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
141 "Do not evaluate any arguments and return nil.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
142 Treated as a declaration when used at the right place in a
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
143 `defmacro' form. \(See Info anchor `(elisp)Definition of declare'.)"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
144 nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
145
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
146 ;;;; Basic Lisp functions.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
147
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
148 (defun ignore (&rest ignore)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
149 "Do nothing and return nil.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
150 This function accepts any number of arguments, but ignores them."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
151 (interactive)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
152 nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
153
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
154 (defun error (&rest args)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
155 "Signal an error, making error message by passing all args to `format'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
156 In Emacs, the convention is that error messages start with a capital
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
157 letter but *do not* end with a period. Please follow this convention
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
158 for the sake of consistency."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
159 (while t
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
160 (signal 'error (list (apply 'format args)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
161
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
162 ;; We put this here instead of in frame.el so that it's defined even on
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
163 ;; systems where frame.el isn't loaded.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
164 (defun frame-configuration-p (object)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
165 "Return non-nil if OBJECT seems to be a frame configuration.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
166 Any list whose car is `frame-configuration' is assumed to be a frame
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
167 configuration."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
168 (and (consp object)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
169 (eq (car object) 'frame-configuration)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
170
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
171 (defun functionp (object)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
172 "Non-nil if OBJECT is any kind of function or a special form.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
173 Also non-nil if OBJECT is a symbol and its function definition is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
174 \(recursively) a function or special form. This does not include
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
175 macros."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
176 (or (and (symbolp object) (fboundp object)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
177 (condition-case nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
178 (setq object (indirect-function object))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
179 (error nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
180 (eq (car-safe object) 'autoload)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
181 (not (car-safe (cdr-safe (cdr-safe (cdr-safe (cdr-safe object)))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
182 (subrp object) (byte-code-function-p object)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
183 (eq (car-safe object) 'lambda)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
184
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
185 ;;;; List functions.
27376
674b7f75841e (dolist, dotimes): Moved from cl-macs.el.
Richard M. Stallman <rms@gnu.org>
parents: 27297
diff changeset
186
19491
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
187 (defsubst caar (x)
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
188 "Return the car of the car of X."
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
189 (car (car x)))
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
190
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
191 (defsubst cadr (x)
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
192 "Return the car of the cdr of X."
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
193 (car (cdr x)))
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
194
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
195 (defsubst cdar (x)
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
196 "Return the cdr of the car of X."
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
197 (cdr (car x)))
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
198
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
199 (defsubst cddr (x)
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
200 "Return the cdr of the cdr of X."
f5fd22f3462c (caar, cadr, cdar, cddr): Definitions moved here and changed into defsubsts.
Richard M. Stallman <rms@gnu.org>
parents: 19176
diff changeset
201 (cdr (cdr x)))
19492
892a09772457 (last): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19491
diff changeset
202
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
203 (defun last (list &optional n)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
204 "Return the last link of LIST. Its car is the last element.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
205 If LIST is nil, return nil.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
206 If N is non-nil, return the Nth-to-last link of LIST.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
207 If N is bigger than the length of LIST, return LIST."
19584
17db1ee36bbb (last): Accept optional second argument.
Richard M. Stallman <rms@gnu.org>
parents: 19492
diff changeset
208 (if n
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
209 (let ((m 0) (p list))
19584
17db1ee36bbb (last): Accept optional second argument.
Richard M. Stallman <rms@gnu.org>
parents: 19492
diff changeset
210 (while (consp p)
17db1ee36bbb (last): Accept optional second argument.
Richard M. Stallman <rms@gnu.org>
parents: 19492
diff changeset
211 (setq m (1+ m) p (cdr p)))
17db1ee36bbb (last): Accept optional second argument.
Richard M. Stallman <rms@gnu.org>
parents: 19492
diff changeset
212 (if (<= n 0) p
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
213 (if (< n m) (nthcdr (- m n) list) list)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
214 (while (consp (cdr list))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
215 (setq list (cdr list)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
216 list))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
217
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
218 (defun butlast (list &optional n)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
219 "Return a copy of LIST with the last N elements removed."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
220 (if (and n (<= n 0)) list
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
221 (nbutlast (copy-sequence list) n)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
222
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
223 (defun nbutlast (list &optional n)
34898
1486728b21f0 (butlast, nbutlast): Moved from cl.el to here.
Kenichi Handa <handa@m17n.org>
parents: 34853
diff changeset
224 "Modifies LIST to remove the last N elements."
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
225 (let ((m (length list)))
34898
1486728b21f0 (butlast, nbutlast): Moved from cl.el to here.
Kenichi Handa <handa@m17n.org>
parents: 34853
diff changeset
226 (or n (setq n 1))
1486728b21f0 (butlast, nbutlast): Moved from cl.el to here.
Kenichi Handa <handa@m17n.org>
parents: 34853
diff changeset
227 (and (< n m)
1486728b21f0 (butlast, nbutlast): Moved from cl.el to here.
Kenichi Handa <handa@m17n.org>
parents: 34853
diff changeset
228 (progn
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
229 (if (> n 0) (setcdr (nthcdr (- (1- m) n) list) nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
230 list))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
231
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
232 (defun delete-dups (list)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
233 "Destructively remove `equal' duplicates from LIST.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
234 Store the result in LIST and return it. LIST must be a proper list.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
235 Of several `equal' occurrences of an element in LIST, the first
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
236 one is kept."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
237 (let ((tail list))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
238 (while tail
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
239 (setcdr tail (delete (car tail) (cdr tail)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
240 (setq tail (cdr tail))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
241 list)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
242
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
243 (defun number-sequence (from &optional to inc)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
244 "Return a sequence of numbers from FROM to TO (both inclusive) as a list.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
245 INC is the increment used between numbers in the sequence and defaults to 1.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
246 So, the Nth element of the list is \(+ FROM \(* N INC)) where N counts from
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
247 zero. TO is only included if there is an N for which TO = FROM + N * INC.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
248 If TO is nil or numerically equal to FROM, return \(FROM).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
249 If INC is positive and TO is less than FROM, or INC is negative
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
250 and TO is larger than FROM, return nil.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
251 If INC is zero and TO is neither nil nor numerically equal to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
252 FROM, signal an error.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
253
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
254 This function is primarily designed for integer arguments.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
255 Nevertheless, FROM, TO and INC can be integer or float. However,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
256 floating point arithmetic is inexact. For instance, depending on
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
257 the machine, it may quite well happen that
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
258 \(number-sequence 0.4 0.6 0.2) returns the one element list \(0.4),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
259 whereas \(number-sequence 0.4 0.8 0.2) returns a list with three
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
260 elements. Thus, if some of the arguments are floats and one wants
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
261 to make sure that TO is included, one may have to explicitly write
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
262 TO as \(+ FROM \(* N INC)) or use a variable whose value was
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
263 computed with this exact expression. Alternatively, you can,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
264 of course, also replace TO with a slightly larger value
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
265 \(or a slightly more negative value if INC is negative)."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
266 (if (or (not to) (= from to))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
267 (list from)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
268 (or inc (setq inc 1))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
269 (when (zerop inc) (error "The increment can not be zero"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
270 (let (seq (n 0) (next from))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
271 (if (> inc 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
272 (while (<= next to)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
273 (setq seq (cons next seq)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
274 n (1+ n)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
275 next (+ from (* n inc))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
276 (while (>= next to)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
277 (setq seq (cons next seq)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
278 n (1+ n)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
279 next (+ from (* n inc)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
280 (nreverse seq))))
30515
6165183bc490 (remove, remq): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 29354
diff changeset
281
45690
9d351e5869c8 (copy-list): Moved here from cl.el.
Colin Walters <walters@gnu.org>
parents: 45587
diff changeset
282 (defun copy-tree (tree &optional vecp)
9d351e5869c8 (copy-list): Moved here from cl.el.
Colin Walters <walters@gnu.org>
parents: 45587
diff changeset
283 "Make a copy of TREE.
9d351e5869c8 (copy-list): Moved here from cl.el.
Colin Walters <walters@gnu.org>
parents: 45587
diff changeset
284 If TREE is a cons cell, this recursively copies both its car and its cdr.
45740
4e576724db9f (copy-list): Moved to cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 45690
diff changeset
285 Contrast to `copy-sequence', which copies only along the cdrs. With second
45690
9d351e5869c8 (copy-list): Moved here from cl.el.
Colin Walters <walters@gnu.org>
parents: 45587
diff changeset
286 argument VECP, this copies vectors as well as conses."
9d351e5869c8 (copy-list): Moved here from cl.el.
Colin Walters <walters@gnu.org>
parents: 45587
diff changeset
287 (if (consp tree)
45740
4e576724db9f (copy-list): Moved to cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 45690
diff changeset
288 (let (result)
4e576724db9f (copy-list): Moved to cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 45690
diff changeset
289 (while (consp tree)
4e576724db9f (copy-list): Moved to cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 45690
diff changeset
290 (let ((newcar (car tree)))
4e576724db9f (copy-list): Moved to cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 45690
diff changeset
291 (if (or (consp (car tree)) (and vecp (vectorp (car tree))))
4e576724db9f (copy-list): Moved to cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 45690
diff changeset
292 (setq newcar (copy-tree (car tree) vecp)))
4e576724db9f (copy-list): Moved to cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 45690
diff changeset
293 (push newcar result))
4e576724db9f (copy-list): Moved to cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 45690
diff changeset
294 (setq tree (cdr tree)))
45821
41129d3d126b (copy-tree): Use `nconc' and `nreverse' instead of `nreconc'.
Miles Bader <miles@gnu.org>
parents: 45740
diff changeset
295 (nconc (nreverse result) tree))
45690
9d351e5869c8 (copy-list): Moved here from cl.el.
Colin Walters <walters@gnu.org>
parents: 45587
diff changeset
296 (if (and vecp (vectorp tree))
9d351e5869c8 (copy-list): Moved here from cl.el.
Colin Walters <walters@gnu.org>
parents: 45587
diff changeset
297 (let ((i (length (setq tree (copy-sequence tree)))))
9d351e5869c8 (copy-list): Moved here from cl.el.
Colin Walters <walters@gnu.org>
parents: 45587
diff changeset
298 (while (>= (setq i (1- i)) 0)
45740
4e576724db9f (copy-list): Moved to cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 45690
diff changeset
299 (aset tree i (copy-tree (aref tree i) vecp)))
4e576724db9f (copy-list): Moved to cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 45690
diff changeset
300 tree)
4e576724db9f (copy-list): Moved to cl.el.
Richard M. Stallman <rms@gnu.org>
parents: 45690
diff changeset
301 tree)))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
302
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
303 ;;;; Various list-search functions.
45690
9d351e5869c8 (copy-list): Moved here from cl.el.
Colin Walters <walters@gnu.org>
parents: 45587
diff changeset
304
22959
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
305 (defun assoc-default (key alist &optional test default)
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
306 "Find object KEY in a pseudo-alist ALIST.
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
307 ALIST is a list of conses or objects. Each element (or the element's car,
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
308 if it is a cons) is compared with KEY by evaluating (TEST (car elt) KEY).
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
309 If that is non-nil, the element matches;
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
310 then `assoc-default' returns the element's cdr, if it is a cons,
22860
349fa4ee1f27 (assoc-default): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22755
diff changeset
311 or DEFAULT if the element is not a cons.
22959
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
312
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
313 If no element matches, the value is nil.
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
314 If TEST is omitted or nil, `equal' is used."
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
315 (let (found (tail alist) value)
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
316 (while (and tail (not found))
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
317 (let ((elt (car tail)))
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
318 (when (funcall (or test 'equal) (if (consp elt) (car elt) elt) key)
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
319 (setq found t value (if (consp elt) (cdr elt) default))))
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
320 (setq tail (cdr tail)))
73a21b5f9bd8 (assoc-default): Rewrite not to use dolist.
Richard M. Stallman <rms@gnu.org>
parents: 22860
diff changeset
321 value))
25295
737e82c21934 (assoc-ignore-case, assoc-ignore-representation): Moved here from simple.el.
Karl Heuer <kwzh@gnu.org>
parents: 25293
diff changeset
322
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
323 (make-obsolete 'assoc-ignore-case 'assoc-string)
25295
737e82c21934 (assoc-ignore-case, assoc-ignore-representation): Moved here from simple.el.
Karl Heuer <kwzh@gnu.org>
parents: 25293
diff changeset
324 (defun assoc-ignore-case (key alist)
737e82c21934 (assoc-ignore-case, assoc-ignore-representation): Moved here from simple.el.
Karl Heuer <kwzh@gnu.org>
parents: 25293
diff changeset
325 "Like `assoc', but ignores differences in case and text representation.
737e82c21934 (assoc-ignore-case, assoc-ignore-representation): Moved here from simple.el.
Karl Heuer <kwzh@gnu.org>
parents: 25293
diff changeset
326 KEY must be a string. Upper-case and lower-case letters are treated as equal.
737e82c21934 (assoc-ignore-case, assoc-ignore-representation): Moved here from simple.el.
Karl Heuer <kwzh@gnu.org>
parents: 25293
diff changeset
327 Unibyte strings are converted to multibyte for comparison."
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
328 (assoc-string key alist t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
329
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
330 (make-obsolete 'assoc-ignore-representation 'assoc-string)
25295
737e82c21934 (assoc-ignore-case, assoc-ignore-representation): Moved here from simple.el.
Karl Heuer <kwzh@gnu.org>
parents: 25293
diff changeset
331 (defun assoc-ignore-representation (key alist)
737e82c21934 (assoc-ignore-case, assoc-ignore-representation): Moved here from simple.el.
Karl Heuer <kwzh@gnu.org>
parents: 25293
diff changeset
332 "Like `assoc', but ignores differences in text representation.
47916
0bb8dc016c43 (remq): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47747
diff changeset
333 KEY must be a string.
25295
737e82c21934 (assoc-ignore-case, assoc-ignore-representation): Moved here from simple.el.
Karl Heuer <kwzh@gnu.org>
parents: 25293
diff changeset
334 Unibyte strings are converted to multibyte for comparison."
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
335 (assoc-string key alist nil))
28490
9958b6d95bd6 (member-ignore-case): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28234
diff changeset
336
9958b6d95bd6 (member-ignore-case): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28234
diff changeset
337 (defun member-ignore-case (elt list)
9958b6d95bd6 (member-ignore-case): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28234
diff changeset
338 "Like `member', but ignores differences in case and text representation.
9958b6d95bd6 (member-ignore-case): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28234
diff changeset
339 ELT must be a string. Upper-case and lower-case letters are treated as equal.
44900
e4975d9c93ff (insert-for-yank): Replace `category' property
Richard M. Stallman <rms@gnu.org>
parents: 44723
diff changeset
340 Unibyte strings are converted to multibyte for comparison.
e4975d9c93ff (insert-for-yank): Replace `category' property
Richard M. Stallman <rms@gnu.org>
parents: 44723
diff changeset
341 Non-strings in LIST are ignored."
e4975d9c93ff (insert-for-yank): Replace `category' property
Richard M. Stallman <rms@gnu.org>
parents: 44723
diff changeset
342 (while (and list
e4975d9c93ff (insert-for-yank): Replace `category' property
Richard M. Stallman <rms@gnu.org>
parents: 44723
diff changeset
343 (not (and (stringp (car list))
e4975d9c93ff (insert-for-yank): Replace `category' property
Richard M. Stallman <rms@gnu.org>
parents: 44723
diff changeset
344 (eq t (compare-strings elt 0 nil (car list) 0 nil t)))))
33978
9aa3fd6779f7 (member-ignore-case): Return the tail of the list who's car matches,
Miles Bader <miles@gnu.org>
parents: 33835
diff changeset
345 (setq list (cdr list)))
9aa3fd6779f7 (member-ignore-case): Return the tail of the list who's car matches,
Miles Bader <miles@gnu.org>
parents: 33835
diff changeset
346 list)
28490
9958b6d95bd6 (member-ignore-case): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28234
diff changeset
347
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
348 (defun assq-delete-all (key alist)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
349 "Delete from ALIST all elements whose car is `eq' to KEY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
350 Return the modified alist.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
351 Elements of ALIST that are not conses are ignored."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
352 (while (and (consp (car alist))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
353 (eq (car (car alist)) key))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
354 (setq alist (cdr alist)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
355 (let ((tail alist) tail-cdr)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
356 (while (setq tail-cdr (cdr tail))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
357 (if (and (consp (car tail-cdr))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
358 (eq (car (car tail-cdr)) key))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
359 (setcdr tail (cdr tail-cdr))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
360 (setq tail tail-cdr))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
361 alist)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
362
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
363 (defun rassq-delete-all (value alist)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
364 "Delete from ALIST all elements whose cdr is `eq' to VALUE.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
365 Return the modified alist.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
366 Elements of ALIST that are not conses are ignored."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
367 (while (and (consp (car alist))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
368 (eq (cdr (car alist)) value))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
369 (setq alist (cdr alist)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
370 (let ((tail alist) tail-cdr)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
371 (while (setq tail-cdr (cdr tail))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
372 (if (and (consp (car tail-cdr))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
373 (eq (cdr (car tail-cdr)) value))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
374 (setcdr tail (cdr tail-cdr))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
375 (setq tail tail-cdr))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
376 alist)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
377
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
378 (defun remove (elt seq)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
379 "Return a copy of SEQ with all occurrences of ELT removed.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
380 SEQ must be a list, vector, or string. The comparison is done with `equal'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
381 (if (nlistp seq)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
382 ;; If SEQ isn't a list, there's no need to copy SEQ because
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
383 ;; `delete' will return a new object.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
384 (delete elt seq)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
385 (delete elt (copy-sequence seq))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
386
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
387 (defun remq (elt list)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
388 "Return LIST with all occurrences of ELT removed.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
389 The comparison is done with `eq'. Contrary to `delq', this does not use
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
390 side-effects, and the argument LIST is not modified."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
391 (if (memq elt list)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
392 (delq elt (copy-sequence list))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
393 list))
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
394
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
395 ;;;; Keymap support.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
396
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
397 (defmacro kbd (keys)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
398 "Convert KEYS to the internal Emacs key representation.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
399 KEYS should be a string constant in the format used for
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
400 saving keyboard macros (see `edmacro-mode')."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
401 (read-kbd-macro keys))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
402
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
403 (defun undefined ()
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
404 (interactive)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
405 (ding))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
406
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
407 ;; Prevent the \{...} documentation construct
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
408 ;; from mentioning keys that run this command.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
409 (put 'undefined 'suppress-keymap t)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
410
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
411 (defun suppress-keymap (map &optional nodigits)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
412 "Make MAP override all normally self-inserting keys to be undefined.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
413 Normally, as an exception, digits and minus-sign are set to make prefix args,
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
414 but optional second arg NODIGITS non-nil treats them like other chars."
47042
74f8b41068e0 (suppress-keymap): Use command remapping instead of
Kim F. Storm <storm@cua.dk>
parents: 47025
diff changeset
415 (define-key map [remap self-insert-command] 'undefined)
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
416 (or nodigits
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
417 (let (loop)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
418 (define-key map "-" 'negative-argument)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
419 ;; Make plain numbers do numeric args.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
420 (setq loop ?0)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
421 (while (<= loop ?9)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
422 (define-key map (char-to-string loop) 'digit-argument)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
423 (setq loop (1+ loop))))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
424
27821
5ef5616e8304 (define-key-after): Default AFTER to t. Doc fix.
Dave Love <fx@gnu.org>
parents: 27810
diff changeset
425 (defun define-key-after (keymap key definition &optional after)
3901
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
426 "Add binding in KEYMAP for KEY => DEFINITION, right after AFTER's binding.
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
427 This is like `define-key' except that the binding for KEY is placed
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
428 just after the binding for the event AFTER, instead of at the beginning
16556
3a1df67c6677 (define-key-after): If AFTER is t, always put new binding at the end.
Richard M. Stallman <rms@gnu.org>
parents: 16549
diff changeset
429 of the map. Note that AFTER must be an event type (like KEY), NOT a command
3a1df67c6677 (define-key-after): If AFTER is t, always put new binding at the end.
Richard M. Stallman <rms@gnu.org>
parents: 16549
diff changeset
430 \(like DEFINITION).
3a1df67c6677 (define-key-after): If AFTER is t, always put new binding at the end.
Richard M. Stallman <rms@gnu.org>
parents: 16549
diff changeset
431
27821
5ef5616e8304 (define-key-after): Default AFTER to t. Doc fix.
Dave Love <fx@gnu.org>
parents: 27810
diff changeset
432 If AFTER is t or omitted, the new binding goes at the end of the keymap.
39557
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
433 AFTER should be a single event type--a symbol or a character, not a sequence.
27821
5ef5616e8304 (define-key-after): Default AFTER to t. Doc fix.
Dave Love <fx@gnu.org>
parents: 27810
diff changeset
434
5ef5616e8304 (define-key-after): Default AFTER to t. Doc fix.
Dave Love <fx@gnu.org>
parents: 27810
diff changeset
435 Bindings are always added before any inherited map.
16556
3a1df67c6677 (define-key-after): If AFTER is t, always put new binding at the end.
Richard M. Stallman <rms@gnu.org>
parents: 16549
diff changeset
436
3a1df67c6677 (define-key-after): If AFTER is t, always put new binding at the end.
Richard M. Stallman <rms@gnu.org>
parents: 16549
diff changeset
437 The order of bindings in a keymap matters when it is used as a menu."
27821
5ef5616e8304 (define-key-after): Default AFTER to t. Doc fix.
Dave Love <fx@gnu.org>
parents: 27810
diff changeset
438 (unless after (setq after t))
3901
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
439 (or (keymapp keymap)
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
440 (signal 'wrong-type-argument (list 'keymapp keymap)))
39557
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
441 (setq key
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
442 (if (<= (length key) 1) (aref key 0)
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
443 (setq keymap (lookup-key keymap
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
444 (apply 'vector
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
445 (butlast (mapcar 'identity key)))))
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
446 (aref key (1- (length key)))))
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
447 (let ((tail keymap) done inserted)
3901
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
448 (while (and (not done) tail)
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
449 ;; Delete any earlier bindings for the same key.
39557
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
450 (if (eq (car-safe (car (cdr tail))) key)
3901
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
451 (setcdr tail (cdr (cdr tail))))
39557
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
452 ;; If we hit an included map, go down that one.
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
453 (if (keymapp (car tail)) (setq tail (car tail)))
3901
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
454 ;; When we reach AFTER's binding, insert the new binding after.
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
455 ;; If we reach an inherited keymap, insert just before that.
3927
1f1fefc400ed (define-key-after): Delete duplicate bindings that come
Richard M. Stallman <rms@gnu.org>
parents: 3902
diff changeset
456 ;; If we reach the end of this keymap, insert at the end.
16556
3a1df67c6677 (define-key-after): If AFTER is t, always put new binding at the end.
Richard M. Stallman <rms@gnu.org>
parents: 16549
diff changeset
457 (if (or (and (eq (car-safe (car tail)) after)
3a1df67c6677 (define-key-after): If AFTER is t, always put new binding at the end.
Richard M. Stallman <rms@gnu.org>
parents: 16549
diff changeset
458 (not (eq after t)))
3927
1f1fefc400ed (define-key-after): Delete duplicate bindings that come
Richard M. Stallman <rms@gnu.org>
parents: 3902
diff changeset
459 (eq (car (cdr tail)) 'keymap)
1f1fefc400ed (define-key-after): Delete duplicate bindings that come
Richard M. Stallman <rms@gnu.org>
parents: 3902
diff changeset
460 (null (cdr tail)))
3901
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
461 (progn
3927
1f1fefc400ed (define-key-after): Delete duplicate bindings that come
Richard M. Stallman <rms@gnu.org>
parents: 3902
diff changeset
462 ;; Stop the scan only if we find a parent keymap.
1f1fefc400ed (define-key-after): Delete duplicate bindings that come
Richard M. Stallman <rms@gnu.org>
parents: 3902
diff changeset
463 ;; Keep going past the inserted element
1f1fefc400ed (define-key-after): Delete duplicate bindings that come
Richard M. Stallman <rms@gnu.org>
parents: 3902
diff changeset
464 ;; so we can delete any duplications that come later.
1f1fefc400ed (define-key-after): Delete duplicate bindings that come
Richard M. Stallman <rms@gnu.org>
parents: 3902
diff changeset
465 (if (eq (car (cdr tail)) 'keymap)
1f1fefc400ed (define-key-after): Delete duplicate bindings that come
Richard M. Stallman <rms@gnu.org>
parents: 3902
diff changeset
466 (setq done t))
1f1fefc400ed (define-key-after): Delete duplicate bindings that come
Richard M. Stallman <rms@gnu.org>
parents: 3902
diff changeset
467 ;; Don't insert more than once.
1f1fefc400ed (define-key-after): Delete duplicate bindings that come
Richard M. Stallman <rms@gnu.org>
parents: 3902
diff changeset
468 (or inserted
39557
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
469 (setcdr tail (cons (cons key definition) (cdr tail))))
3927
1f1fefc400ed (define-key-after): Delete duplicate bindings that come
Richard M. Stallman <rms@gnu.org>
parents: 3902
diff changeset
470 (setq inserted t)))
3901
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
471 (setq tail (cdr tail)))))
c78753b7eea8 (define-key-in-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 3860
diff changeset
472
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
473 (defun map-keymap-internal (function keymap &optional sort-first)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
474 "Implement `map-keymap' with sorting.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
475 Don't call this function; it is for internal use only."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
476 (if sort-first
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
477 (let (list)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
478 (map-keymap (lambda (a b) (push (cons a b) list))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
479 keymap)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
480 (setq list (sort list
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
481 (lambda (a b)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
482 (setq a (car a) b (car b))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
483 (if (integerp a)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
484 (if (integerp b) (< a b)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
485 t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
486 (if (integerp b) t
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
487 (string< a b))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
488 (dolist (p list)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
489 (funcall function (car p) (cdr p))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
490 (map-keymap function keymap)))
17437
d7f9b21fdfd2 (kbd): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 17418
diff changeset
491
15894
efd2835a7c96 (keyboard-translate): Use a char-table.
Richard M. Stallman <rms@gnu.org>
parents: 15599
diff changeset
492 (put 'keyboard-translate-table 'char-table-extra-slots 0)
efd2835a7c96 (keyboard-translate): Use a char-table.
Richard M. Stallman <rms@gnu.org>
parents: 15599
diff changeset
493
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
494 (defun keyboard-translate (from to)
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
495 "Translate character FROM to TO at a low level.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
496 This function creates a `keyboard-translate-table' if necessary
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
497 and then modifies one entry in it."
15894
efd2835a7c96 (keyboard-translate): Use a char-table.
Richard M. Stallman <rms@gnu.org>
parents: 15599
diff changeset
498 (or (char-table-p keyboard-translate-table)
efd2835a7c96 (keyboard-translate): Use a char-table.
Richard M. Stallman <rms@gnu.org>
parents: 15599
diff changeset
499 (setq keyboard-translate-table
efd2835a7c96 (keyboard-translate): Use a char-table.
Richard M. Stallman <rms@gnu.org>
parents: 15599
diff changeset
500 (make-char-table 'keyboard-translate-table nil)))
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
501 (aset keyboard-translate-table from to))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
502
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
503 ;;;; Key binding commands.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
504
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
505 (defun global-set-key (key command)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
506 "Give KEY a global binding as COMMAND.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
507 COMMAND is the command definition to use; usually it is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
508 a symbol naming an interactively-callable function.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
509 KEY is a key sequence; noninteractively, it is a string or vector
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
510 of characters or event types, and non-ASCII characters with codes
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
511 above 127 (such as ISO Latin-1) can be included if you use a vector.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
512
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
513 Note that if KEY has a local binding in the current buffer,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
514 that local binding will continue to shadow any global binding
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
515 that you make with this function."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
516 (interactive "KSet key globally: \nCSet key %s to command: ")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
517 (or (vectorp key) (stringp key)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
518 (signal 'wrong-type-argument (list 'arrayp key)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
519 (define-key (current-global-map) key command))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
520
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
521 (defun local-set-key (key command)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
522 "Give KEY a local binding as COMMAND.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
523 COMMAND is the command definition to use; usually it is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
524 a symbol naming an interactively-callable function.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
525 KEY is a key sequence; noninteractively, it is a string or vector
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
526 of characters or event types, and non-ASCII characters with codes
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
527 above 127 (such as ISO Latin-1) can be included if you use a vector.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
528
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
529 The binding goes in the current buffer's local map,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
530 which in most cases is shared with all other buffers in the same major mode."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
531 (interactive "KSet key locally: \nCSet key %s locally to command: ")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
532 (let ((map (current-local-map)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
533 (or map
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
534 (use-local-map (setq map (make-sparse-keymap))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
535 (or (vectorp key) (stringp key)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
536 (signal 'wrong-type-argument (list 'arrayp key)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
537 (define-key map key command)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
538
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
539 (defun global-unset-key (key)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
540 "Remove global binding of KEY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
541 KEY is a string or vector representing a sequence of keystrokes."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
542 (interactive "kUnset key globally: ")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
543 (global-set-key key nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
544
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
545 (defun local-unset-key (key)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
546 "Remove local binding of KEY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
547 KEY is a string or vector representing a sequence of keystrokes."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
548 (interactive "kUnset key locally: ")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
549 (if (current-local-map)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
550 (local-set-key key nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
551 nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
552
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
553 ;;;; substitute-key-definition and its subroutines.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
554
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
555 (defvar key-substitution-in-progress nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
556 "Used internally by `substitute-key-definition'.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
557
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
558 (defun substitute-key-definition (olddef newdef keymap &optional oldmap prefix)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
559 "Replace OLDDEF with NEWDEF for any keys in KEYMAP now defined as OLDDEF.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
560 In other words, OLDDEF is replaced with NEWDEF where ever it appears.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
561 Alternatively, if optional fourth argument OLDMAP is specified, we redefine
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
562 in KEYMAP as NEWDEF those keys which are defined as OLDDEF in OLDMAP.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
563
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
564 For most uses, it is simpler and safer to use command remappping like this:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
565 \(define-key KEYMAP [remap OLDDEF] NEWDEF)"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
566 ;; Don't document PREFIX in the doc string because we don't want to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
567 ;; advertise it. It's meant for recursive calls only. Here's its
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
568 ;; meaning
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
569
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
570 ;; If optional argument PREFIX is specified, it should be a key
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
571 ;; prefix, a string. Redefined bindings will then be bound to the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
572 ;; original key, with PREFIX added at the front.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
573 (or prefix (setq prefix ""))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
574 (let* ((scan (or oldmap keymap))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
575 (prefix1 (vconcat prefix [nil]))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
576 (key-substitution-in-progress
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
577 (cons scan key-substitution-in-progress)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
578 ;; Scan OLDMAP, finding each char or event-symbol that
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
579 ;; has any definition, and act on it with hack-key.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
580 (map-keymap
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
581 (lambda (char defn)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
582 (aset prefix1 (length prefix) char)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
583 (substitute-key-definition-key defn olddef newdef prefix1 keymap))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
584 scan)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
585
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
586 (defun substitute-key-definition-key (defn olddef newdef prefix keymap)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
587 (let (inner-def skipped menu-item)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
588 ;; Find the actual command name within the binding.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
589 (if (eq (car-safe defn) 'menu-item)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
590 (setq menu-item defn defn (nth 2 defn))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
591 ;; Skip past menu-prompt.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
592 (while (stringp (car-safe defn))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
593 (push (pop defn) skipped))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
594 ;; Skip past cached key-equivalence data for menu items.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
595 (if (consp (car-safe defn))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
596 (setq defn (cdr defn))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
597 (if (or (eq defn olddef)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
598 ;; Compare with equal if definition is a key sequence.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
599 ;; That is useful for operating on function-key-map.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
600 (and (or (stringp defn) (vectorp defn))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
601 (equal defn olddef)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
602 (define-key keymap prefix
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
603 (if menu-item
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
604 (let ((copy (copy-sequence menu-item)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
605 (setcar (nthcdr 2 copy) newdef)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
606 copy)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
607 (nconc (nreverse skipped) newdef)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
608 ;; Look past a symbol that names a keymap.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
609 (setq inner-def
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
610 (and defn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
611 (condition-case nil (indirect-function defn) (error defn))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
612 ;; For nested keymaps, we use `inner-def' rather than `defn' so as to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
613 ;; avoid autoloading a keymap. This is mostly done to preserve the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
614 ;; original non-autoloading behavior of pre-map-keymap times.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
615 (if (and (keymapp inner-def)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
616 ;; Avoid recursively scanning
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
617 ;; where KEYMAP does not have a submap.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
618 (let ((elt (lookup-key keymap prefix)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
619 (or (null elt) (natnump elt) (keymapp elt)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
620 ;; Avoid recursively rescanning keymap being scanned.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
621 (not (memq inner-def key-substitution-in-progress)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
622 ;; If this one isn't being scanned already, scan it now.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
623 (substitute-key-definition olddef newdef keymap inner-def prefix)))))
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
624
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
625
47916
0bb8dc016c43 (remq): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47747
diff changeset
626 ;;;; The global keymap tree.
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
627
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
628 ;;; global-map, esc-map, and ctl-x-map have their values set up in
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
629 ;;; keymap.c; we just give them docstrings here.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
630
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
631 (defvar global-map nil
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
632 "Default global keymap mapping Emacs keyboard input into commands.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
633 The value is a keymap which is usually (but not necessarily) Emacs's
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
634 global map.")
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
635
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
636 (defvar esc-map nil
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
637 "Default keymap for ESC (meta) commands.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
638 The normal global definition of the character ESC indirects to this keymap.")
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
639
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
640 (defvar ctl-x-map nil
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
641 "Default keymap for C-x commands.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
642 The normal global definition of the character C-x indirects to this keymap.")
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
643
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
644 (defvar ctl-x-4-map (make-sparse-keymap)
41955
241e553840f9 (ctl-x-4-map): Doc fix.
Pavel Janík <Pavel@Janik.cz>
parents: 41618
diff changeset
645 "Keymap for subcommands of C-x 4.")
2569
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
646 (defalias 'ctl-x-4-prefix ctl-x-4-map)
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
647 (define-key ctl-x-map "4" 'ctl-x-4-prefix)
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
648
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
649 (defvar ctl-x-5-map (make-sparse-keymap)
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
650 "Keymap for frame commands.")
2569
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
651 (defalias 'ctl-x-5-prefix ctl-x-5-map)
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
652 (define-key ctl-x-map "5" 'ctl-x-5-prefix)
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
653
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
654
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
655 ;;;; Event manipulation functions.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
656
10693
0875851842f0 (listify-key-sequence-1, event-modifiers): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 10681
diff changeset
657 ;; The call to `read' is to ensure that the value is computed at load time
0875851842f0 (listify-key-sequence-1, event-modifiers): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 10681
diff changeset
658 ;; and not compiled into the .elc file. The value is negative on most
0875851842f0 (listify-key-sequence-1, event-modifiers): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 10681
diff changeset
659 ;; machines, but not on all!
0875851842f0 (listify-key-sequence-1, event-modifiers): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 10681
diff changeset
660 (defconst listify-key-sequence-1 (logior 128 (read "?\\M-\\^@")))
3153
4c94c9faf1af (listify-key-sequence): Avoid the constant ?\M-\200.
Richard M. Stallman <rms@gnu.org>
parents: 2963
diff changeset
661
2021
8b9286bffef8 (listify-key-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 1959
diff changeset
662 (defun listify-key-sequence (key)
8b9286bffef8 (listify-key-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 1959
diff changeset
663 "Convert a key sequence to a list of events."
8b9286bffef8 (listify-key-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 1959
diff changeset
664 (if (vectorp key)
8b9286bffef8 (listify-key-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 1959
diff changeset
665 (append key nil)
8b9286bffef8 (listify-key-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 1959
diff changeset
666 (mapcar (function (lambda (c)
8b9286bffef8 (listify-key-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 1959
diff changeset
667 (if (> c 127)
3153
4c94c9faf1af (listify-key-sequence): Avoid the constant ?\M-\200.
Richard M. Stallman <rms@gnu.org>
parents: 2963
diff changeset
668 (logxor c listify-key-sequence-1)
2021
8b9286bffef8 (listify-key-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 1959
diff changeset
669 c)))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
670 key)))
2021
8b9286bffef8 (listify-key-sequence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 1959
diff changeset
671
2040
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
672 (defsubst eventp (obj)
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
673 "True if the argument is an event object."
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
674 (or (and (integerp obj)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
675 ;; Filter out integers too large to be events.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
676 ;; M is the biggest modifier.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
677 (zerop (logand obj (lognot (1- (lsh ?\M-\^@ 1)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
678 (char-valid-p (event-basic-type obj)))
2040
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
679 (and (symbolp obj)
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
680 (get obj 'event-symbol-elements))
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
681 (and (consp obj)
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
682 (symbolp (car obj))
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
683 (get (car obj) 'event-symbol-elements))))
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
684
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
685 (defun event-modifiers (event)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
686 "Return a list of symbols representing the modifier keys in event EVENT.
2040
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
687 The elements of the list may include `meta', `control',
4414
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
688 `shift', `hyper', `super', `alt', `click', `double', `triple', `drag',
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
689 and `down'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
690 EVENT may be an event or an event type. If EVENT is a symbol
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
691 that has never been used in an event that has been read as input
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
692 in the current Emacs session, then this function can return nil,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
693 even when EVENT actually has modifiers."
2040
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
694 (let ((type event))
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
695 (if (listp type)
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
696 (setq type (car type)))
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
697 (if (symbolp type)
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
698 (cdr (get type 'event-symbol-elements))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
699 (let ((list nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
700 (char (logand type (lognot (logior ?\M-\^@ ?\C-\^@ ?\S-\^@
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
701 ?\H-\^@ ?\s-\^@ ?\A-\^@)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
702 (if (not (zerop (logand type ?\M-\^@)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
703 (push 'meta list))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
704 (if (or (not (zerop (logand type ?\C-\^@)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
705 (< char 32))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
706 (push 'control list))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
707 (if (or (not (zerop (logand type ?\S-\^@)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
708 (/= char (downcase char)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
709 (push 'shift list))
10693
0875851842f0 (listify-key-sequence-1, event-modifiers): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 10681
diff changeset
710 (or (zerop (logand type ?\H-\^@))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
711 (push 'hyper list))
10693
0875851842f0 (listify-key-sequence-1, event-modifiers): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 10681
diff changeset
712 (or (zerop (logand type ?\s-\^@))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
713 (push 'super list))
10693
0875851842f0 (listify-key-sequence-1, event-modifiers): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 10681
diff changeset
714 (or (zerop (logand type ?\A-\^@))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
715 (push 'alt list))
2040
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
716 list))))
aa926beb4caa (event-modifiers): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2033
diff changeset
717
2063
2f0555b428c4 (event-basic-type): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2040
diff changeset
718 (defun event-basic-type (event)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
719 "Return the basic type of the given event (all modifiers removed).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
720 The value is a printing character (not upper case) or a symbol.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
721 EVENT may be an event or an event type. If EVENT is a symbol
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
722 that has never been used in an event that has been read as input
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
723 in the current Emacs session, then this function may return nil."
3784
d2df5ca46b39 * subr.el (event-basic-type): Deal with listy events properly.
Jim Blandy <jimb@redhat.com>
parents: 3591
diff changeset
724 (if (consp event)
d2df5ca46b39 * subr.el (event-basic-type): Deal with listy events properly.
Jim Blandy <jimb@redhat.com>
parents: 3591
diff changeset
725 (setq event (car event)))
2063
2f0555b428c4 (event-basic-type): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2040
diff changeset
726 (if (symbolp event)
2f0555b428c4 (event-basic-type): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2040
diff changeset
727 (car (get event 'event-symbol-elements))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
728 (let* ((base (logand event (1- ?\A-\^@)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
729 (uncontrolled (if (< base 32) (logior base 64) base)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
730 ;; There are some numbers that are invalid characters and
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
731 ;; cause `downcase' to get an error.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
732 (condition-case ()
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
733 (downcase uncontrolled)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
734 (error uncontrolled)))))
2063
2f0555b428c4 (event-basic-type): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2040
diff changeset
735
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
736 (defsubst mouse-movement-p (object)
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
737 "Return non-nil if OBJECT is a mouse movement event."
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
738 (eq (car-safe object) 'mouse-movement))
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
739
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
740 (defsubst event-start (event)
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
741 "Return the starting position of EVENT.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
742 If EVENT is a mouse or key press or a mouse click, this returns the location
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
743 of the event.
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
744 If EVENT is a drag, this returns the drag's starting position.
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
745 The return value is of the form
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
746 (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
747 IMAGE (DX . DY) (WIDTH . HEIGHT))
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
748 The `posn-' functions access elements of such lists."
45978
a8fbafaa31ad (event-start, event-end, event-click-count):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45823
diff changeset
749 (if (consp event) (nth 1 event)
a8fbafaa31ad (event-start, event-end, event-click-count):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45823
diff changeset
750 (list (selected-window) (point) '(0 . 0) 0)))
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
751
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
752 (defsubst event-end (event)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
753 "Return the ending location of EVENT.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
754 EVENT should be a click, drag, or key press event.
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
755 If EVENT is a click event, this function is the same as `event-start'.
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
756 The return value is of the form
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
757 (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
758 IMAGE (DX . DY) (WIDTH . HEIGHT))
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
759 The `posn-' functions access elements of such lists."
45978
a8fbafaa31ad (event-start, event-end, event-click-count):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45823
diff changeset
760 (if (consp event) (nth (if (consp (nth 2 event)) 2 1) event)
a8fbafaa31ad (event-start, event-end, event-click-count):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45823
diff changeset
761 (list (selected-window) (point) '(0 . 0) 0)))
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
762
4414
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
763 (defsubst event-click-count (event)
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
764 "Return the multi-click count of EVENT, a click or drag event.
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
765 The return value is a positive integer."
45978
a8fbafaa31ad (event-start, event-end, event-click-count):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45823
diff changeset
766 (if (and (consp event) (integerp (nth 2 event))) (nth 2 event) 1))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
767
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
768 ;;;; Extracting fields of the positions in an event.
4414
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
769
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
770 (defsubst posn-window (position)
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
771 "Return the window in POSITION.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
772 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
773 and `event-end' functions."
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
774 (nth 0 position))
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
775
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
776 (defsubst posn-area (position)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
777 "Return the window area recorded in POSITION, or nil for the text area.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
778 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
779 and `event-end' functions."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
780 (let ((area (if (consp (nth 1 position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
781 (car (nth 1 position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
782 (nth 1 position))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
783 (and (symbolp area) area)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
784
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
785 (defsubst posn-point (position)
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
786 "Return the buffer location in POSITION.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
787 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
788 and `event-end' functions."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
789 (or (nth 5 position)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
790 (if (consp (nth 1 position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
791 (car (nth 1 position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
792 (nth 1 position))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
793
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
794 (defun posn-set-point (position)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
795 "Move point to POSITION.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
796 Select the corresponding window as well."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
797 (if (not (windowp (posn-window position)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
798 (error "Position not in text area of window"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
799 (select-window (posn-window position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
800 (if (numberp (posn-point position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
801 (goto-char (posn-point position))))
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
802
6039
4eb7f4633370 (posn-x-y): New function.
Richard M. Stallman <rms@gnu.org>
parents: 6005
diff changeset
803 (defsubst posn-x-y (position)
4eb7f4633370 (posn-x-y): New function.
Richard M. Stallman <rms@gnu.org>
parents: 6005
diff changeset
804 "Return the x and y coordinates in POSITION.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
805 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
806 and `event-end' functions."
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
807 (nth 2 position))
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
808
7636
83dba60657ef (posn-col-row): Do something useful for scroll bar event.
Richard M. Stallman <rms@gnu.org>
parents: 7615
diff changeset
809 (defun posn-col-row (position)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
810 "Return the nominal column and row in POSITION, measured in characters.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
811 The column and row values are approximations calculated from the x
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
812 and y coordinates in POSITION and the frame's default character width
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
813 and height.
7636
83dba60657ef (posn-col-row): Do something useful for scroll bar event.
Richard M. Stallman <rms@gnu.org>
parents: 7615
diff changeset
814 For a scroll-bar event, the result column is 0, and the row
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
815 corresponds to the vertical position of the click in the scroll bar.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
816 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
817 and `event-end' functions."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
818 (let* ((pair (posn-x-y position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
819 (window (posn-window position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
820 (area (posn-area position)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
821 (cond
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
822 ((null window)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
823 '(0 . 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
824 ((eq area 'vertical-scroll-bar)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
825 (cons 0 (scroll-bar-scale pair (1- (window-height window)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
826 ((eq area 'horizontal-scroll-bar)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
827 (cons (scroll-bar-scale pair (window-width window)) 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
828 (t
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
829 (let* ((frame (if (framep window) window (window-frame window)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
830 (x (/ (car pair) (frame-char-width frame)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
831 (y (/ (cdr pair) (+ (frame-char-height frame)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
832 (or (frame-parameter frame 'line-spacing)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
833 default-line-spacing
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
834 0)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
835 (cons x y))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
836
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
837 (defun posn-actual-col-row (position)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
838 "Return the actual column and row in POSITION, measured in characters.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
839 These are the actual row number in the window and character number in that row.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
840 Return nil if POSITION does not contain the actual position; in that case
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
841 `posn-col-row' can be used to get approximate values.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
842 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
843 and `event-end' functions."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
844 (nth 6 position))
6039
4eb7f4633370 (posn-x-y): New function.
Richard M. Stallman <rms@gnu.org>
parents: 6005
diff changeset
845
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
846 (defsubst posn-timestamp (position)
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
847 "Return the timestamp of POSITION.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
848 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
849 and `event-end' functions."
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
850 (nth 3 position))
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
851
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
852 (defsubst posn-string (position)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
853 "Return the string object of POSITION, or nil if a buffer position.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
854 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
855 and `event-end' functions."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
856 (nth 4 position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
857
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
858 (defsubst posn-image (position)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
859 "Return the image object of POSITION, or nil if a not an image.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
860 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
861 and `event-end' functions."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
862 (nth 7 position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
863
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
864 (defsubst posn-object (position)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
865 "Return the object (image or string) of POSITION.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
866 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
867 and `event-end' functions."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
868 (or (posn-image position) (posn-string position)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
869
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
870 (defsubst posn-object-x-y (position)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
871 "Return the x and y coordinates relative to the object of POSITION.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
872 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
873 and `event-end' functions."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
874 (nth 8 position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
875
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
876 (defsubst posn-object-width-height (position)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
877 "Return the pixel width and height of the object of POSITION.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
878 POSITION should be a list of the form returned by the `event-start'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
879 and `event-end' functions."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
880 (nth 9 position))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
881
2071
8f410f56d98f (posn-timestamp, posn-col-row, posn-point, posn-window):
Richard M. Stallman <rms@gnu.org>
parents: 2063
diff changeset
882
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
883 ;;;; Obsolescent names for functions.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
884
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
885 (define-obsolete-function-alias 'window-dot 'window-point "22.1")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
886 (define-obsolete-function-alias 'set-window-dot 'set-window-point "22.1")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
887 (define-obsolete-function-alias 'read-input 'read-string "22.1")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
888 (define-obsolete-function-alias 'show-buffer 'set-window-buffer "22.1")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
889 (define-obsolete-function-alias 'eval-current-buffer 'eval-buffer "22.1")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
890 (define-obsolete-function-alias 'string-to-int 'string-to-number "22.1")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
891
47652
a5316596929f (read-key-auxiliary-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47406
diff changeset
892 (make-obsolete 'char-bytes "now always returns 1." "20.4")
20605
95e051979faf (sref): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 20491
diff changeset
893
42266
75bbe9d566d9 (insert-string): Moved from mocklisp.c, reimplemented in Lisp. Obsoleted.
Pavel Janík <Pavel@Janik.cz>
parents: 42083
diff changeset
894 (defun insert-string (&rest args)
75bbe9d566d9 (insert-string): Moved from mocklisp.c, reimplemented in Lisp. Obsoleted.
Pavel Janík <Pavel@Janik.cz>
parents: 42083
diff changeset
895 "Mocklisp-compatibility insert function.
75bbe9d566d9 (insert-string): Moved from mocklisp.c, reimplemented in Lisp. Obsoleted.
Pavel Janík <Pavel@Janik.cz>
parents: 42083
diff changeset
896 Like the function `insert' except that any argument that is a number
75bbe9d566d9 (insert-string): Moved from mocklisp.c, reimplemented in Lisp. Obsoleted.
Pavel Janík <Pavel@Janik.cz>
parents: 42083
diff changeset
897 is converted into a string by expressing it in decimal."
75bbe9d566d9 (insert-string): Moved from mocklisp.c, reimplemented in Lisp. Obsoleted.
Pavel Janík <Pavel@Janik.cz>
parents: 42083
diff changeset
898 (dolist (el args)
75bbe9d566d9 (insert-string): Moved from mocklisp.c, reimplemented in Lisp. Obsoleted.
Pavel Janík <Pavel@Janik.cz>
parents: 42083
diff changeset
899 (insert (if (integerp el) (number-to-string el) el))))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
900 (make-obsolete 'insert-string 'insert "22.1")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
901
46219
56b79cbf05d2 (insert-string): Update the obsolete info.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46148
diff changeset
902 (defun makehash (&optional test) (make-hash-table :test (or test 'eql)))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
903 (make-obsolete 'makehash 'make-hash-table "22.1")
42266
75bbe9d566d9 (insert-string): Moved from mocklisp.c, reimplemented in Lisp. Obsoleted.
Pavel Janík <Pavel@Janik.cz>
parents: 42083
diff changeset
904
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
905 ;; Some programs still use this as a function.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
906 (defun baud-rate ()
46052
4d27fe417297 (char-bytes): Fix obsolescence declaration.
Juanma Barranquero <lekktu@gmail.com>
parents: 45978
diff changeset
907 "Return the value of the `baud-rate' variable."
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
908 baud-rate)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
909 (make-obsolete 'baud-rate "use the `baud-rate' variable instead." "before 19.15")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
910
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
911 ;; These are used by VM and some old programs
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
912 (defalias 'focus-frame 'ignore "")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
913 (make-obsolete 'focus-frame "it does nothing." "22.1")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
914 (defalias 'unfocus-frame 'ignore "")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
915 (make-obsolete 'unfocus-frame "it does nothing." "22.1")
46537
46f175ecf5d4 (unread-command-char, executing-macro, post-command-idle-hook,
Juanma Barranquero <lekktu@gmail.com>
parents: 46532
diff changeset
916
46f175ecf5d4 (unread-command-char, executing-macro, post-command-idle-hook,
Juanma Barranquero <lekktu@gmail.com>
parents: 46532
diff changeset
917
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
918 ;;;; Obsolescence declarations for variables, and aliases.
46537
46f175ecf5d4 (unread-command-char, executing-macro, post-command-idle-hook,
Juanma Barranquero <lekktu@gmail.com>
parents: 46532
diff changeset
919
46f175ecf5d4 (unread-command-char, executing-macro, post-command-idle-hook,
Juanma Barranquero <lekktu@gmail.com>
parents: 46532
diff changeset
920 (make-obsolete-variable 'directory-sep-char "do not use it." "21.1")
46f175ecf5d4 (unread-command-char, executing-macro, post-command-idle-hook,
Juanma Barranquero <lekktu@gmail.com>
parents: 46532
diff changeset
921 (make-obsolete-variable 'mode-line-inverse-video "use the appropriate faces instead." "21.1")
46f175ecf5d4 (unread-command-char, executing-macro, post-command-idle-hook,
Juanma Barranquero <lekktu@gmail.com>
parents: 46532
diff changeset
922 (make-obsolete-variable 'unread-command-char
46f175ecf5d4 (unread-command-char, executing-macro, post-command-idle-hook,
Juanma Barranquero <lekktu@gmail.com>
parents: 46532
diff changeset
923 "use `unread-command-events' instead. That variable is a list of events to reread, so it now uses nil to mean `no event', instead of -1."
46f175ecf5d4 (unread-command-char, executing-macro, post-command-idle-hook,
Juanma Barranquero <lekktu@gmail.com>
parents: 46532
diff changeset
924 "before 19.15")
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
925
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
926 ;; Lisp manual only updated in 22.1.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
927 (define-obsolete-variable-alias 'executing-macro 'executing-kbd-macro
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
928 "before 19.34")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
929
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
930 (defvaralias 'x-lost-selection-hooks 'x-lost-selection-functions)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
931 (make-obsolete-variable 'x-lost-selection-hooks 'x-lost-selection-functions "22.1")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
932 (defvaralias 'x-sent-selection-hooks 'x-sent-selection-functions)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
933 (make-obsolete-variable 'x-sent-selection-hooks 'x-sent-selection-functions "22.1")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
934
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
935 (defvaralias 'messages-buffer-max-lines 'message-log-max)
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
936
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
937 ;;;; Alternate names for functions - these are not being phased out.
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
938
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
939 (defalias 'send-string 'process-send-string)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
940 (defalias 'send-region 'process-send-region)
2569
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
941 (defalias 'string= 'string-equal)
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
942 (defalias 'string< 'string-lessp)
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
943 (defalias 'move-marker 'set-marker)
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
944 (defalias 'rplaca 'setcar)
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
945 (defalias 'rplacd 'setcdr)
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3411
diff changeset
946 (defalias 'beep 'ding) ;preserve lingual purity
2569
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
947 (defalias 'indent-to-column 'indent-to)
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
948 (defalias 'backward-delete-char 'delete-backward-char)
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
949 (defalias 'search-forward-regexp (symbol-function 're-search-forward))
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
950 (defalias 'search-backward-regexp (symbol-function 're-search-backward))
39ad4eda7fea All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2504
diff changeset
951 (defalias 'int-to-string 'number-to-string)
21173
e917eb0d4e01 (save-match-data): store-match-data => set-match-data.
Richard M. Stallman <rms@gnu.org>
parents: 21092
diff changeset
952 (defalias 'store-match-data 'set-match-data)
47078
6e9df2174ee2 (make-variable-frame-localizable): New alias for `make-variable-frame-local'.
Juanma Barranquero <lekktu@gmail.com>
parents: 47042
diff changeset
953 (defalias 'make-variable-frame-localizable 'make-variable-frame-local)
31563
96b9757bfd45 (add-minor-mode): Use toggle-fun arg.
Dave Love <fx@gnu.org>
parents: 30515
diff changeset
954 ;; These are the XEmacs names:
25293
fd43e1a99384 (point-at-eol, point-at-bol): New aliases.
Karl Heuer <kwzh@gnu.org>
parents: 25140
diff changeset
955 (defalias 'point-at-eol 'line-end-position)
fd43e1a99384 (point-at-eol, point-at-bol): New aliases.
Karl Heuer <kwzh@gnu.org>
parents: 25140
diff changeset
956 (defalias 'point-at-bol 'line-beginning-position)
1903
87f63305319f * subr.el (string-to-int): Make this an alias for
Jim Blandy <jimb@redhat.com>
parents: 1867
diff changeset
957
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
958 (defalias 'user-original-login-name 'user-login-name)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
959
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
960
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
961 ;;;; Hook manipulation functions.
388
498bcec1cf3a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 384
diff changeset
962
9195
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
963 (defun make-local-hook (hook)
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
964 "Make the hook HOOK local to the current buffer.
23786
673204d56938 (make-local-hook): Return the hook variable.
Richard M. Stallman <rms@gnu.org>
parents: 23736
diff changeset
965 The return value is HOOK.
673204d56938 (make-local-hook): Return the hook variable.
Richard M. Stallman <rms@gnu.org>
parents: 23736
diff changeset
966
33707
2b9847c18f31 (make-local-hook): Docstring fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32355
diff changeset
967 You never need to call this function now that `add-hook' does it for you
2b9847c18f31 (make-local-hook): Docstring fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32355
diff changeset
968 if its LOCAL argument is non-nil.
2b9847c18f31 (make-local-hook): Docstring fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32355
diff changeset
969
9195
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
970 When a hook is local, its local and global values
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
971 work in concert: running the hook actually runs all the hook
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
972 functions listed in *either* the local value *or* the global value
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
973 of the hook variable.
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
974
39557
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
975 This function works by making t a member of the buffer-local value,
12258
95ebca0a74d8 (make-local-hook): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12108
diff changeset
976 which acts as a flag to run the hook functions in the default value as
95ebca0a74d8 (make-local-hook): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12108
diff changeset
977 well. This works for all normal hooks, but does not work for most
95ebca0a74d8 (make-local-hook): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12108
diff changeset
978 non-normal hooks yet. We will be changing the callers of non-normal
95ebca0a74d8 (make-local-hook): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12108
diff changeset
979 hooks so that they can handle localness; this has to be done one by
95ebca0a74d8 (make-local-hook): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12108
diff changeset
980 one.
95ebca0a74d8 (make-local-hook): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12108
diff changeset
981
95ebca0a74d8 (make-local-hook): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12108
diff changeset
982 This function does nothing if HOOK is already local in the current
95ebca0a74d8 (make-local-hook): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12108
diff changeset
983 buffer.
9195
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
984
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
985 Do not use `make-local-variable' to make a hook variable buffer-local."
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
986 (if (local-variable-p hook)
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
987 nil
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
988 (or (boundp hook) (set hook nil))
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
989 (make-local-variable hook)
23786
673204d56938 (make-local-hook): Return the hook variable.
Richard M. Stallman <rms@gnu.org>
parents: 23736
diff changeset
990 (set hook (list t)))
673204d56938 (make-local-hook): Return the hook variable.
Richard M. Stallman <rms@gnu.org>
parents: 23736
diff changeset
991 hook)
46052
4d27fe417297 (char-bytes): Fix obsolescence declaration.
Juanma Barranquero <lekktu@gmail.com>
parents: 45978
diff changeset
992 (make-obsolete 'make-local-hook "not necessary any more." "21.1")
9195
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
993
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
994 (defun add-hook (hook function &optional append local)
4414
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
995 "Add to the value of HOOK the function FUNCTION.
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
996 FUNCTION is not added if already present.
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
997 FUNCTION is added (if necessary) at the beginning of the hook list
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
998 unless the optional argument APPEND is non-nil, in which case
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
999 FUNCTION is added at the end.
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
1000
9195
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
1001 The optional fourth argument, LOCAL, if non-nil, says to modify
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
1002 the hook's buffer-local value rather than its default value.
43435
c7aaafe7f385 (add-hook): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 43158
diff changeset
1003 This makes the hook buffer-local if needed, and it makes t a member
c7aaafe7f385 (add-hook): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 43158
diff changeset
1004 of the buffer-local value. That acts as a flag to run the hook
c7aaafe7f385 (add-hook): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 43158
diff changeset
1005 functions in the default value as well as in the local value.
9195
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
1006
4414
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
1007 HOOK should be a symbol, and FUNCTION may be any valid function. If
3356419b94c1 (add-hook): Change a single function into a list.
Richard M. Stallman <rms@gnu.org>
parents: 4235
diff changeset
1008 HOOK is void, it is first set to nil. If HOOK's value is a single
8959
d33302427a47 (remove-hook, add-hook): Copy existing list before modifying.
Richard M. Stallman <rms@gnu.org>
parents: 8928
diff changeset
1009 function, it is changed to a list of functions."
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
1010 (or (boundp hook) (set hook nil))
9195
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
1011 (or (default-boundp hook) (set-default hook nil))
39557
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
1012 (if local (unless (local-variable-if-set-p hook)
fb85410efef7 (define-key-after): Allow `key' to be longer than 1.
Gerd Moellmann <gerd@gnu.org>
parents: 38760
diff changeset
1013 (set (make-local-variable hook) (list t)))
28863
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1014 ;; Detect the case where make-local-variable was used on a hook
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1015 ;; and do what we used to do.
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1016 (unless (and (consp (symbol-value hook)) (memq t (symbol-value hook)))
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1017 (setq local t)))
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1018 (let ((hook-value (if local (symbol-value hook) (default-value hook))))
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1019 ;; If the hook value is a single function, turn it into a list.
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1020 (when (or (not (listp hook-value)) (eq (car hook-value) 'lambda))
28940
2a91228f7aa3 (add-hook): setq hook-value, not set
Sam Steingold <sds@gnu.org>
parents: 28868
diff changeset
1021 (setq hook-value (list hook-value)))
28863
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1022 ;; Do the actual addition if necessary
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1023 (unless (member function hook-value)
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1024 (setq hook-value
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1025 (if append
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1026 (append hook-value (list function))
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1027 (cons function hook-value))))
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1028 ;; Set the actual variable
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1029 (if local (set hook hook-value) (set-default hook hook-value))))
2504
181eef669324 * subr.el (overlay-start, overlay-end, overlay-buffer): New
Jim Blandy <jimb@redhat.com>
parents: 2428
diff changeset
1030
9195
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
1031 (defun remove-hook (hook function &optional local)
4964
78c13f3054e5 (remove-hook): New function, analogous to add-hook. This
Richard M. Stallman <rms@gnu.org>
parents: 4767
diff changeset
1032 "Remove from the value of HOOK the function FUNCTION.
78c13f3054e5 (remove-hook): New function, analogous to add-hook. This
Richard M. Stallman <rms@gnu.org>
parents: 4767
diff changeset
1033 HOOK should be a symbol, and FUNCTION may be any valid function. If
78c13f3054e5 (remove-hook): New function, analogous to add-hook. This
Richard M. Stallman <rms@gnu.org>
parents: 4767
diff changeset
1034 FUNCTION isn't the value of HOOK, or, if FUNCTION doesn't appear in the
9195
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
1035 list of hooks to run in HOOK, then nothing is done. See `add-hook'.
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
1036
70b00615cb75 (add-hook): Initialize default value and local value.
Richard M. Stallman <rms@gnu.org>
parents: 8959
diff changeset
1037 The optional third argument, LOCAL, if non-nil, says to modify
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1038 the hook's buffer-local value rather than its default value."
28863
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1039 (or (boundp hook) (set hook nil))
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1040 (or (default-boundp hook) (set-default hook nil))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1041 ;; Do nothing if LOCAL is t but this hook has no local binding.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1042 (unless (and local (not (local-variable-p hook)))
28863
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1043 ;; Detect the case where make-local-variable was used on a hook
6430ce03c28a (add-hook, remove-hook): Make hook buffer-local if needed..
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28811
diff changeset
1044 ;; and do what we used to do.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1045 (when (and (local-variable-p hook)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1046 (not (and (consp (symbol-value hook))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1047 (memq t (symbol-value hook)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1048 (setq local t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1049 (let ((hook-value (if local (symbol-value hook) (default-value hook))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1050 ;; Remove the function, for both the list and the non-list cases.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1051 (if (or (not (listp hook-value)) (eq (car hook-value) 'lambda))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1052 (if (equal hook-value function) (setq hook-value nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1053 (setq hook-value (delete function (copy-sequence hook-value))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1054 ;; If the function is on the global hook, we need to shadow it locally
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1055 ;;(when (and local (member function (default-value hook))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1056 ;; (not (member (cons 'not function) hook-value)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1057 ;; (push (cons 'not function) hook-value))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1058 ;; Set the actual variable
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1059 (if (not local)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1060 (set-default hook hook-value)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1061 (if (equal hook-value '(t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1062 (kill-local-variable hook)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1063 (set hook hook-value))))))
9510
f03544494d1c (add-to-list): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9202
diff changeset
1064
32355
6bf2ae19e286 (add-to-list): Add optional argument APPEND.
Miles Bader <miles@gnu.org>
parents: 32131
diff changeset
1065 (defun add-to-list (list-var element &optional append)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1066 "Add ELEMENT to the value of LIST-VAR if it isn't there yet.
13812
fdbace398b5e (add-to-list): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 13186
diff changeset
1067 The test for presence of ELEMENT is done with `equal'.
32355
6bf2ae19e286 (add-to-list): Add optional argument APPEND.
Miles Bader <miles@gnu.org>
parents: 32131
diff changeset
1068 If ELEMENT is added, it is added at the beginning of the list,
6bf2ae19e286 (add-to-list): Add optional argument APPEND.
Miles Bader <miles@gnu.org>
parents: 32131
diff changeset
1069 unless the optional argument APPEND is non-nil, in which case
6bf2ae19e286 (add-to-list): Add optional argument APPEND.
Miles Bader <miles@gnu.org>
parents: 32131
diff changeset
1070 ELEMENT is added at the end.
24757
f4127409d184 (add-to-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 24699
diff changeset
1071
43833
37bc1e73d4b3 (add-to-list): Doc fix.
Pavel Janík <Pavel@Janik.cz>
parents: 43527
diff changeset
1072 The return value is the new value of LIST-VAR.
37bc1e73d4b3 (add-to-list): Doc fix.
Pavel Janík <Pavel@Janik.cz>
parents: 43527
diff changeset
1073
9535
a2908d5da32a (add-to-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 9510
diff changeset
1074 If you want to use `add-to-list' on a variable that is not defined
a2908d5da32a (add-to-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 9510
diff changeset
1075 until a certain package is loaded, you should put the call to `add-to-list'
a2908d5da32a (add-to-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 9510
diff changeset
1076 into a hook function that will be run only after loading the package.
a2908d5da32a (add-to-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 9510
diff changeset
1077 `eval-after-load' provides one way to do this. In some cases
a2908d5da32a (add-to-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 9510
diff changeset
1078 other hooks, such as major mode hooks, can do the job."
21409
3e8b7782f4f5 (add-to-list): Always return updated value of LIST-VAR.
Karl Heuer <kwzh@gnu.org>
parents: 21173
diff changeset
1079 (if (member element (symbol-value list-var))
3e8b7782f4f5 (add-to-list): Always return updated value of LIST-VAR.
Karl Heuer <kwzh@gnu.org>
parents: 21173
diff changeset
1080 (symbol-value list-var)
32355
6bf2ae19e286 (add-to-list): Add optional argument APPEND.
Miles Bader <miles@gnu.org>
parents: 32131
diff changeset
1081 (set list-var
6bf2ae19e286 (add-to-list): Add optional argument APPEND.
Miles Bader <miles@gnu.org>
parents: 32131
diff changeset
1082 (if append
6bf2ae19e286 (add-to-list): Add optional argument APPEND.
Miles Bader <miles@gnu.org>
parents: 32131
diff changeset
1083 (append (symbol-value list-var) (list element))
6bf2ae19e286 (add-to-list): Add optional argument APPEND.
Miles Bader <miles@gnu.org>
parents: 32131
diff changeset
1084 (cons element (symbol-value list-var))))))
39725
c64d3e3adf5d (symbol-file-load-history-loaded)
Miles Bader <miles@gnu.org>
parents: 39598
diff changeset
1085
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1086
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1087 (defun add-to-ordered-list (list-var element &optional order)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1088 "Add ELEMENT to the value of LIST-VAR if it isn't there yet.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1089 The test for presence of ELEMENT is done with `eq'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1090
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1091 The resulting list is reordered so that the elements are in the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1092 order given by each element's numeric list order. Elements
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1093 without a numeric list order are placed at the end of the list.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1094
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1095 If the third optional argument ORDER is a number (integer or
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1096 float), set the element's list order to the given value. If
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1097 ORDER is nil or omitted, do not change the numeric order of
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1098 ELEMENT. If ORDER has any other value, remove the numeric order
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1099 of ELEMENT if it has one.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1100
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1101 The list order for each element is stored in LIST-VAR's
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1102 `list-order' property.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1103
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1104 The return value is the new value of LIST-VAR."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1105 (let ((ordering (get list-var 'list-order)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1106 (unless ordering
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1107 (put list-var 'list-order
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1108 (setq ordering (make-hash-table :weakness 'key :test 'eq))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1109 (when order
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1110 (puthash element (and (numberp order) order) ordering))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1111 (unless (memq element (symbol-value list-var))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1112 (set list-var (cons element (symbol-value list-var))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1113 (set list-var (sort (symbol-value list-var)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1114 (lambda (a b)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1115 (let ((oa (gethash a ordering))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1116 (ob (gethash b ordering)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1117 (if (and oa ob)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1118 (< oa ob)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1119 oa)))))))
43126
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1120
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1121 ;;;; Mode hooks.
28234
763c6639628b (combine-run-hooks): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28148
diff changeset
1122
40282
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1123 (defvar delay-mode-hooks nil
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1124 "If non-nil, `run-mode-hooks' should delay running the hooks.")
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1125 (defvar delayed-mode-hooks nil
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1126 "List of delayed mode hooks waiting to be run.")
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1127 (make-variable-buffer-local 'delayed-mode-hooks)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1128 (put 'delay-mode-hooks 'permanent-local t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1129
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1130 (defvar after-change-major-mode-hook nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1131 "Normal hook run at the very end of major mode functions.")
40282
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1132
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1133 (defun run-mode-hooks (&rest hooks)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1134 "Run mode hooks `delayed-mode-hooks' and HOOKS, or delay HOOKS.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1135 Execution is delayed if `delay-mode-hooks' is non-nil.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1136 If `delay-mode-hooks' is nil, run `after-change-major-mode-hook'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1137 after running the mode hooks.
40282
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1138 Major mode functions should use this."
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1139 (if delay-mode-hooks
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1140 ;; Delaying case.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1141 (dolist (hook hooks)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1142 (push hook delayed-mode-hooks))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1143 ;; Normal case, just run the hook as before plus any delayed hooks.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1144 (setq hooks (nconc (nreverse delayed-mode-hooks) hooks))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1145 (setq delayed-mode-hooks nil)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1146 (apply 'run-hooks hooks)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1147 (run-hooks 'after-change-major-mode-hook)))
40282
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1148
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1149 (defmacro delay-mode-hooks (&rest body)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1150 "Execute BODY, but delay any `run-mode-hooks'.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1151 These hooks will be executed by the first following call to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1152 `run-mode-hooks' that occurs outside any `delayed-mode-hooks' form.
40282
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1153 Only affects hooks run in the current buffer."
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1154 (declare (debug t) (indent 0))
40282
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1155 `(progn
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1156 (make-local-variable 'delay-mode-hooks)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1157 (let ((delay-mode-hooks t))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1158 ,@body)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
1159
41975
2b1145fdbe6e (derived-mode-p): Moved here from derived.el.
Richard M. Stallman <rms@gnu.org>
parents: 41955
diff changeset
1160 ;; PUBLIC: find if the current mode derives from another.
2b1145fdbe6e (derived-mode-p): Moved here from derived.el.
Richard M. Stallman <rms@gnu.org>
parents: 41955
diff changeset
1161
2b1145fdbe6e (derived-mode-p): Moved here from derived.el.
Richard M. Stallman <rms@gnu.org>
parents: 41955
diff changeset
1162 (defun derived-mode-p (&rest modes)
2b1145fdbe6e (derived-mode-p): Moved here from derived.el.
Richard M. Stallman <rms@gnu.org>
parents: 41955
diff changeset
1163 "Non-nil if the current major mode is derived from one of MODES.
2b1145fdbe6e (derived-mode-p): Moved here from derived.el.
Richard M. Stallman <rms@gnu.org>
parents: 41955
diff changeset
1164 Uses the `derived-mode-parent' property of the symbol to trace backwards."
2b1145fdbe6e (derived-mode-p): Moved here from derived.el.
Richard M. Stallman <rms@gnu.org>
parents: 41955
diff changeset
1165 (let ((parent major-mode))
2b1145fdbe6e (derived-mode-p): Moved here from derived.el.
Richard M. Stallman <rms@gnu.org>
parents: 41955
diff changeset
1166 (while (and (not (memq parent modes))
2b1145fdbe6e (derived-mode-p): Moved here from derived.el.
Richard M. Stallman <rms@gnu.org>
parents: 41955
diff changeset
1167 (setq parent (get parent 'derived-mode-parent))))
2b1145fdbe6e (derived-mode-p): Moved here from derived.el.
Richard M. Stallman <rms@gnu.org>
parents: 41955
diff changeset
1168 parent))
16379
dcc3625f52e2 (with-current-buffer): Minor cleanup.
Erik Naggum <erik@naggum.no>
parents: 16359
diff changeset
1169
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1170 ;;;; Minor modes.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1171
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1172 ;; If a minor mode is not defined with define-minor-mode,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1173 ;; add it here explicitly.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1174 ;; isearch-mode is deliberately excluded, since you should
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1175 ;; not call it yourself.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1176 (defvar minor-mode-list '(auto-save-mode auto-fill-mode abbrev-mode
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1177 overwrite-mode view-mode
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1178 hs-minor-mode)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1179 "List of all minor mode functions.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1180
28751
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1181 (defun add-minor-mode (toggle name &optional keymap after toggle-fun)
28720
f8379b011476 (add-minor-mode): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28628
diff changeset
1182 "Register a new minor mode.
28751
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1183
31979
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1184 This is an XEmacs-compatibility function. Use `define-minor-mode' instead.
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1185
28751
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1186 TOGGLE is a symbol which is the name of a buffer-local variable that
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1187 is toggled on or off to say whether the minor mode is active or not.
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1188
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1189 NAME specifies what will appear in the mode line when the minor mode
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1190 is active. NAME should be either a string starting with a space, or a
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1191 symbol whose value is such a string.
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1192
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1193 Optional KEYMAP is the keymap for the minor mode that will be added
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1194 to `minor-mode-map-alist'.
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1195
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1196 Optional AFTER specifies that TOGGLE should be added after AFTER
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1197 in `minor-mode-alist'.
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1198
31979
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1199 Optional TOGGLE-FUN is an interactive function to toggle the mode.
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1200 It defaults to (and should by convention be) TOGGLE.
31563
96b9757bfd45 (add-minor-mode): Use toggle-fun arg.
Dave Love <fx@gnu.org>
parents: 30515
diff changeset
1201
31979
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1202 If TOGGLE has a non-nil `:included' property, an entry for the mode is
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1203 included in the mode-line minor mode menu.
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1204 If TOGGLE has a `:menu-tag', that is used for the menu item's label."
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1205 (unless (memq toggle minor-mode-list)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1206 (push toggle minor-mode-list))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1207
31979
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1208 (unless toggle-fun (setq toggle-fun toggle))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1209 (unless (eq toggle-fun toggle)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1210 (put toggle :minor-mode-function toggle-fun))
31979
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1211 ;; Add the name to the minor-mode-alist.
28751
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1212 (when name
31979
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1213 (let ((existing (assq toggle minor-mode-alist)))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1214 (if existing
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1215 (setcdr existing (list name))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1216 (let ((tail minor-mode-alist) found)
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1217 (while (and tail (not found))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1218 (if (eq after (caar tail))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1219 (setq found tail)
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1220 (setq tail (cdr tail))))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1221 (if found
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1222 (let ((rest (cdr found)))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1223 (setcdr found nil)
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1224 (nconc found (list (list toggle name)) rest))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1225 (setq minor-mode-alist (cons (list toggle name)
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1226 minor-mode-alist)))))))
43126
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1227 ;; Add the toggle to the minor-modes menu if requested.
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1228 (when (get toggle :included)
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1229 (define-key mode-line-mode-menu
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1230 (vector toggle)
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1231 (list 'menu-item
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1232 (concat
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1233 (or (get toggle :menu-tag)
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1234 (if (stringp name) name (symbol-name toggle)))
47652
a5316596929f (read-key-auxiliary-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47406
diff changeset
1235 (let ((mode-name (if (symbolp name) (symbol-value name))))
a5316596929f (read-key-auxiliary-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47406
diff changeset
1236 (if (and (stringp mode-name) (string-match "[^ ]+" mode-name))
a5316596929f (read-key-auxiliary-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47406
diff changeset
1237 (concat " (" (match-string 0 mode-name) ")"))))
43126
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1238 toggle-fun
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1239 :button (cons :toggle toggle))))
6f39ff1c6d8f (atomic-change-group, prepare-change-group, activate-change-group)
Richard M. Stallman <rms@gnu.org>
parents: 42941
diff changeset
1240
47652
a5316596929f (read-key-auxiliary-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47406
diff changeset
1241 ;; Add the map to the minor-mode-map-alist.
28751
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1242 (when keymap
6a79bbe8bf72 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 28730
diff changeset
1243 (let ((existing (assq toggle minor-mode-map-alist)))
31979
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1244 (if existing
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1245 (setcdr existing keymap)
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1246 (let ((tail minor-mode-map-alist) found)
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1247 (while (and tail (not found))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1248 (if (eq after (caar tail))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1249 (setq found tail)
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1250 (setq tail (cdr tail))))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1251 (if found
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1252 (let ((rest (cdr found)))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1253 (setcdr found nil)
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1254 (nconc found (list (cons toggle keymap)) rest))
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1255 (setq minor-mode-map-alist (cons (cons toggle keymap)
6085a3297ebc (add-minor-mode): Don't eval NAME.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31563
diff changeset
1256 minor-mode-map-alist))))))))
44668
52222efc9d4d (insert-for-yank): New function.
Richard M. Stallman <rms@gnu.org>
parents: 44473
diff changeset
1257
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1258 ;;; Load history
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1259
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1260 ;;; (defvar symbol-file-load-history-loaded nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1261 ;;; "Non-nil means we have loaded the file `fns-VERSION.el' in `exec-directory'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1262 ;;; That file records the part of `load-history' for preloaded files,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1263 ;;; which is cleared out before dumping to make Emacs smaller.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1264
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1265 ;;; (defun load-symbol-file-load-history ()
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1266 ;;; "Load the file `fns-VERSION.el' in `exec-directory' if not already done.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1267 ;;; That file records the part of `load-history' for preloaded files,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1268 ;;; which is cleared out before dumping to make Emacs smaller."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1269 ;;; (unless symbol-file-load-history-loaded
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1270 ;;; (load (expand-file-name
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1271 ;;; ;; fns-XX.YY.ZZ.el does not work on DOS filesystem.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1272 ;;; (if (eq system-type 'ms-dos)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1273 ;;; "fns.el"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1274 ;;; (format "fns-%s.el" emacs-version))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1275 ;;; exec-directory)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1276 ;;; ;; The file name fns-%s.el already has a .el extension.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1277 ;;; nil nil t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1278 ;;; (setq symbol-file-load-history-loaded t)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1279
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1280 (defun symbol-file (symbol &optional type)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1281 "Return the input source in which SYMBOL was defined.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1282 The value is an absolute file name.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1283 It can also be nil, if the definition is not associated with any file.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1284
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1285 If TYPE is nil, then any kind of definition is acceptable.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1286 If TYPE is `defun' or `defvar', that specifies function
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1287 definition only or variable definition only.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1288 `defface' specifies a face definition only."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1289 (if (and (or (null type) (eq type 'defun))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1290 (symbolp symbol) (fboundp symbol)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1291 (eq 'autoload (car-safe (symbol-function symbol))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1292 (nth 1 (symbol-function symbol))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1293 (let ((files load-history)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1294 file)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1295 (while files
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1296 (if (if type
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1297 (if (eq type 'defvar)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1298 ;; Variables are present just as their names.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1299 (member symbol (cdr (car files)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1300 ;; Other types are represented as (TYPE . NAME).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1301 (member (cons type symbol) (cdr (car files))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1302 ;; We accept all types, so look for variable def
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1303 ;; and then for any other kind.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1304 (or (member symbol (cdr (car files)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1305 (rassq symbol (cdr (car files)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1306 (setq file (car (car files)) files nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1307 (setq files (cdr files)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1308 file)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1309
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1310 ;;;###autoload
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1311 (defun locate-library (library &optional nosuffix path interactive-call)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1312 "Show the precise file name of Emacs library LIBRARY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1313 This command searches the directories in `load-path' like `\\[load-library]'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1314 to find the file that `\\[load-library] RET LIBRARY RET' would load.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1315 Optional second arg NOSUFFIX non-nil means don't add suffixes `load-suffixes'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1316 to the specified name LIBRARY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1317
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1318 If the optional third arg PATH is specified, that list of directories
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1319 is used instead of `load-path'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1320
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1321 When called from a program, the file name is normaly returned as a
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1322 string. When run interactively, the argument INTERACTIVE-CALL is t,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1323 and the file name is displayed in the echo area."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1324 (interactive (list (completing-read "Locate library: "
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1325 'locate-file-completion
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1326 (cons load-path load-suffixes))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1327 nil nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1328 t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1329 (let ((file (locate-file library
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1330 (or path load-path)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1331 (append (unless nosuffix load-suffixes) '("")))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1332 (if interactive-call
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1333 (if file
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1334 (message "Library is file %s" (abbreviate-file-name file))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1335 (message "No library %s in search path" library)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1336 file))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1337
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1338
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1339 ;;;; Specifying things to do later.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1340
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1341 (defmacro eval-at-startup (&rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1342 "Make arrangements to evaluate BODY when Emacs starts up.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1343 If this is run after Emacs startup, evaluate BODY immediately.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1344 Always returns nil.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1345
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1346 This works by adding a function to `before-init-hook'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1347 That function's doc string says which file created it."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1348 `(progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1349 (if command-line-processed
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1350 (progn . ,body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1351 (add-hook 'before-init-hook
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1352 '(lambda () ,(concat "From " (or load-file-name "no file"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1353 . ,body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1354 t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1355 nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1356
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1357 (defun eval-after-load (file form)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1358 "Arrange that, if FILE is ever loaded, FORM will be run at that time.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1359 This makes or adds to an entry on `after-load-alist'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1360 If FILE is already loaded, evaluate FORM right now.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1361 It does nothing if FORM is already on the list for FILE.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1362 FILE must match exactly. Normally FILE is the name of a library,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1363 with no directory or extension specified, since that is how `load'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1364 is normally called.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1365 FILE can also be a feature (i.e. a symbol), in which case FORM is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1366 evaluated whenever that feature is `provide'd."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1367 (let ((elt (assoc file after-load-alist)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1368 ;; Make sure there is an element for FILE.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1369 (unless elt (setq elt (list file)) (push elt after-load-alist))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1370 ;; Add FORM to the element if it isn't there.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1371 (unless (member form (cdr elt))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1372 (nconc elt (list form))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1373 ;; If the file has been loaded already, run FORM right away.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1374 (if (if (symbolp file)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1375 (featurep file)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1376 ;; Make sure `load-history' contains the files dumped with
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1377 ;; Emacs for the case that FILE is one of them.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1378 ;; (load-symbol-file-load-history)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1379 (when (locate-library file)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1380 (assoc (locate-library file) load-history)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1381 (eval form))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1382 form)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1383
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1384 (defun eval-next-after-load (file)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1385 "Read the following input sexp, and run it whenever FILE is loaded.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1386 This makes or adds to an entry on `after-load-alist'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1387 FILE should be the name of a library, with no directory name."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1388 (eval-after-load file (read)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1389
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1390 ;;;; Process stuff.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1391
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1392 ;; open-network-stream is a wrapper around make-network-process.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1393
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1394 (when (featurep 'make-network-process)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1395 (defun open-network-stream (name buffer host service)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1396 "Open a TCP connection for a service to a host.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1397 Returns a subprocess-object to represent the connection.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1398 Input and output work as for subprocesses; `delete-process' closes it.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1399
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1400 Args are NAME BUFFER HOST SERVICE.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1401 NAME is name for process. It is modified if necessary to make it unique.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1402 BUFFER is the buffer (or buffer name) to associate with the process.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1403 Process output goes at end of that buffer, unless you specify
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1404 an output stream or filter function to handle the output.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1405 BUFFER may be also nil, meaning that this process is not associated
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1406 with any buffer.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1407 HOST is name of the host to connect to, or its IP address.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1408 SERVICE is name of the service desired, or an integer specifying
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1409 a port number to connect to."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1410 (make-network-process :name name :buffer buffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1411 :host host :service service)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1412
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1413 ;; compatibility
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1414
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1415 (make-obsolete 'process-kill-without-query
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1416 "use `process-query-on-exit-flag' or `set-process-query-on-exit-flag'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1417 "22.1")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1418 (defun process-kill-without-query (process &optional flag)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1419 "Say no query needed if PROCESS is running when Emacs is exited.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1420 Optional second argument if non-nil says to require a query.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1421 Value is t if a query was formerly required."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1422 (let ((old (process-query-on-exit-flag process)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1423 (set-process-query-on-exit-flag process nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1424 old))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1425
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1426 ;; process plist management
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1427
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1428 (defun process-get (process propname)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1429 "Return the value of PROCESS' PROPNAME property.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1430 This is the last value stored with `(process-put PROCESS PROPNAME VALUE)'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1431 (plist-get (process-plist process) propname))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1432
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1433 (defun process-put (process propname value)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1434 "Change PROCESS' PROPNAME property to VALUE.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1435 It can be retrieved with `(process-get PROCESS PROPNAME)'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1436 (set-process-plist process
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1437 (plist-put (process-plist process) propname value)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1438
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1439
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1440 ;;;; Input and display facilities.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1441
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1442 (defvar read-quoted-char-radix 8
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1443 "*Radix for \\[quoted-insert] and other uses of `read-quoted-char'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1444 Legitimate radix values are 8, 10 and 16.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1445
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1446 (custom-declare-variable-early
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1447 'read-quoted-char-radix 8
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1448 "*Radix for \\[quoted-insert] and other uses of `read-quoted-char'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1449 Legitimate radix values are 8, 10 and 16."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1450 :type '(choice (const 8) (const 10) (const 16))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1451 :group 'editing-basics)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1452
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1453 (defun read-quoted-char (&optional prompt)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1454 "Like `read-char', but do not allow quitting.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1455 Also, if the first character read is an octal digit,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1456 we read any number of octal digits and return the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1457 specified character code. Any nondigit terminates the sequence.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1458 If the terminator is RET, it is discarded;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1459 any other terminator is used itself as input.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1460
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1461 The optional argument PROMPT specifies a string to use to prompt the user.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1462 The variable `read-quoted-char-radix' controls which radix to use
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1463 for numeric input."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1464 (let ((message-log-max nil) done (first t) (code 0) char translated)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1465 (while (not done)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1466 (let ((inhibit-quit first)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1467 ;; Don't let C-h get the help message--only help function keys.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1468 (help-char nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1469 (help-form
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1470 "Type the special character you want to use,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1471 or the octal character code.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1472 RET terminates the character code and is discarded;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1473 any other non-digit terminates the character code and is then used as input."))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1474 (setq char (read-event (and prompt (format "%s-" prompt)) t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1475 (if inhibit-quit (setq quit-flag nil)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1476 ;; Translate TAB key into control-I ASCII character, and so on.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1477 ;; Note: `read-char' does it using the `ascii-character' property.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1478 ;; We could try and use read-key-sequence instead, but then C-q ESC
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1479 ;; or C-q C-x might not return immediately since ESC or C-x might be
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1480 ;; bound to some prefix in function-key-map or key-translation-map.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1481 (setq translated char)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1482 (let ((translation (lookup-key function-key-map (vector char))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1483 (if (arrayp translation)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1484 (setq translated (aref translation 0))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1485 (cond ((null translated))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1486 ((not (integerp translated))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1487 (setq unread-command-events (list char)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1488 done t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1489 ((/= (logand translated ?\M-\^@) 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1490 ;; Turn a meta-character into a character with the 0200 bit set.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1491 (setq code (logior (logand translated (lognot ?\M-\^@)) 128)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1492 done t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1493 ((and (<= ?0 translated) (< translated (+ ?0 (min 10 read-quoted-char-radix))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1494 (setq code (+ (* code read-quoted-char-radix) (- translated ?0)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1495 (and prompt (setq prompt (message "%s %c" prompt translated))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1496 ((and (<= ?a (downcase translated))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1497 (< (downcase translated) (+ ?a -10 (min 36 read-quoted-char-radix))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1498 (setq code (+ (* code read-quoted-char-radix)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1499 (+ 10 (- (downcase translated) ?a))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1500 (and prompt (setq prompt (message "%s %c" prompt translated))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1501 ((and (not first) (eq translated ?\C-m))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1502 (setq done t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1503 ((not first)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1504 (setq unread-command-events (list char)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1505 done t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1506 (t (setq code translated
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1507 done t)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1508 (setq first nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1509 code))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1510
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1511 (defun read-passwd (prompt &optional confirm default)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1512 "Read a password, prompting with PROMPT, and return it.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1513 If optional CONFIRM is non-nil, read the password twice to make sure.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1514 Optional DEFAULT is a default password to use instead of empty input.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1515
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1516 This function echoes `.' for each character that the user types.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1517 The user ends with RET, LFD, or ESC. DEL or C-h rubs out. C-u kills line.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1518 C-g quits; if `inhibit-quit' was non-nil around this function,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1519 then it returns nil if the user types C-g.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1520
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1521 Once the caller uses the password, it can erase the password
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1522 by doing (clear-string STRING)."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1523 (with-local-quit
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1524 (if confirm
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1525 (let (success)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1526 (while (not success)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1527 (let ((first (read-passwd prompt nil default))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1528 (second (read-passwd "Confirm password: " nil default)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1529 (if (equal first second)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1530 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1531 (and (arrayp second) (clear-string second))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1532 (setq success first))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1533 (and (arrayp first) (clear-string first))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1534 (and (arrayp second) (clear-string second))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1535 (message "Password not repeated accurately; please start over")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1536 (sit-for 1))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1537 success)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1538 (let ((pass nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1539 (c 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1540 (echo-keystrokes 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1541 (cursor-in-echo-area t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1542 (add-text-properties 0 (length prompt)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1543 minibuffer-prompt-properties prompt)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1544 (while (progn (message "%s%s"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1545 prompt
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1546 (make-string (length pass) ?.))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1547 (setq c (read-char-exclusive nil t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1548 (and (/= c ?\r) (/= c ?\n) (/= c ?\e)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1549 (clear-this-command-keys)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1550 (if (= c ?\C-u)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1551 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1552 (and (arrayp pass) (clear-string pass))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1553 (setq pass ""))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1554 (if (and (/= c ?\b) (/= c ?\177))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1555 (let* ((new-char (char-to-string c))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1556 (new-pass (concat pass new-char)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1557 (and (arrayp pass) (clear-string pass))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1558 (clear-string new-char)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1559 (setq c ?\0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1560 (setq pass new-pass))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1561 (if (> (length pass) 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1562 (let ((new-pass (substring pass 0 -1)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1563 (and (arrayp pass) (clear-string pass))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1564 (setq pass new-pass))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1565 (message nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1566 (or pass default "")))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1567
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1568 ;; This should be used by `call-interactively' for `n' specs.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1569 (defun read-number (prompt &optional default)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1570 (let ((n nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1571 (when default
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1572 (setq prompt
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1573 (if (string-match "\\(\\):[ \t]*\\'" prompt)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1574 (replace-match (format " (default %s)" default) t t prompt 1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1575 (replace-regexp-in-string "[ \t]*\\'"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1576 (format " (default %s) " default)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1577 prompt t t))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1578 (while
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1579 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1580 (let ((str (read-from-minibuffer prompt nil nil nil nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1581 (and default
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1582 (number-to-string default)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1583 (setq n (cond
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1584 ((zerop (length str)) default)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1585 ((stringp str) (read str)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1586 (unless (numberp n)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1587 (message "Please enter a number.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1588 (sit-for 1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1589 t)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1590 n))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1591
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1592 ;;; Atomic change groups.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1593
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1594 (defmacro atomic-change-group (&rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1595 "Perform BODY as an atomic change group.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1596 This means that if BODY exits abnormally,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1597 all of its changes to the current buffer are undone.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1598 This works regardless of whether undo is enabled in the buffer.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1599
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1600 This mechanism is transparent to ordinary use of undo;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1601 if undo is enabled in the buffer and BODY succeeds, the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1602 user can undo the change normally."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1603 (declare (indent 0) (debug t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1604 (let ((handle (make-symbol "--change-group-handle--"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1605 (success (make-symbol "--change-group-success--")))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1606 `(let ((,handle (prepare-change-group))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1607 (,success nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1608 (unwind-protect
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1609 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1610 ;; This is inside the unwind-protect because
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1611 ;; it enables undo if that was disabled; we need
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1612 ;; to make sure that it gets disabled again.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1613 (activate-change-group ,handle)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1614 ,@body
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1615 (setq ,success t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1616 ;; Either of these functions will disable undo
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1617 ;; if it was disabled before.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1618 (if ,success
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1619 (accept-change-group ,handle)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1620 (cancel-change-group ,handle))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1621
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1622 (defun prepare-change-group (&optional buffer)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1623 "Return a handle for the current buffer's state, for a change group.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1624 If you specify BUFFER, make a handle for BUFFER's state instead.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1625
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1626 Pass the handle to `activate-change-group' afterward to initiate
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1627 the actual changes of the change group.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1628
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1629 To finish the change group, call either `accept-change-group' or
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1630 `cancel-change-group' passing the same handle as argument. Call
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1631 `accept-change-group' to accept the changes in the group as final;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1632 call `cancel-change-group' to undo them all. You should use
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1633 `unwind-protect' to make sure the group is always finished. The call
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1634 to `activate-change-group' should be inside the `unwind-protect'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1635 Once you finish the group, don't use the handle again--don't try to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1636 finish the same group twice. For a simple example of correct use, see
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1637 the source code of `atomic-change-group'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1638
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1639 The handle records only the specified buffer. To make a multibuffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1640 change group, call this function once for each buffer you want to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1641 cover, then use `nconc' to combine the returned values, like this:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1642
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1643 (nconc (prepare-change-group buffer-1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1644 (prepare-change-group buffer-2))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1645
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1646 You can then activate that multibuffer change group with a single
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1647 call to `activate-change-group' and finish it with a single call
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1648 to `accept-change-group' or `cancel-change-group'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1649
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1650 (if buffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1651 (list (cons buffer (with-current-buffer buffer buffer-undo-list)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1652 (list (cons (current-buffer) buffer-undo-list))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1653
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1654 (defun activate-change-group (handle)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1655 "Activate a change group made with `prepare-change-group' (which see)."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1656 (dolist (elt handle)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1657 (with-current-buffer (car elt)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1658 (if (eq buffer-undo-list t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1659 (setq buffer-undo-list nil)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1660
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1661 (defun accept-change-group (handle)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1662 "Finish a change group made with `prepare-change-group' (which see).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1663 This finishes the change group by accepting its changes as final."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1664 (dolist (elt handle)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1665 (with-current-buffer (car elt)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1666 (if (eq elt t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1667 (setq buffer-undo-list t)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1668
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1669 (defun cancel-change-group (handle)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1670 "Finish a change group made with `prepare-change-group' (which see).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1671 This finishes the change group by reverting all of its changes."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1672 (dolist (elt handle)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1673 (with-current-buffer (car elt)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1674 (setq elt (cdr elt))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1675 (let ((old-car
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1676 (if (consp elt) (car elt)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1677 (old-cdr
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1678 (if (consp elt) (cdr elt))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1679 ;; Temporarily truncate the undo log at ELT.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1680 (when (consp elt)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1681 (setcar elt nil) (setcdr elt nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1682 (unless (eq last-command 'undo) (undo-start))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1683 ;; Make sure there's no confusion.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1684 (when (and (consp elt) (not (eq elt (last pending-undo-list))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1685 (error "Undoing to some unrelated state"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1686 ;; Undo it all.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1687 (while (listp pending-undo-list) (undo-more 1))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1688 ;; Reset the modified cons cell ELT to its original content.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1689 (when (consp elt)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1690 (setcar elt old-car)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1691 (setcdr elt old-cdr))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1692 ;; Revert the undo info to what it was when we grabbed the state.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1693 (setq buffer-undo-list elt)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1694
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1695 ;;;; Display-related functions.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1696
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1697 ;; For compatibility.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1698 (defalias 'redraw-modeline 'force-mode-line-update)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1699
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1700 (defun force-mode-line-update (&optional all)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1701 "Force redisplay of the current buffer's mode line and header line.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1702 With optional non-nil ALL, force redisplay of all mode lines and
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1703 header lines. This function also forces recomputation of the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1704 menu bar menus and the frame title."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1705 (if all (save-excursion (set-buffer (other-buffer))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1706 (set-buffer-modified-p (buffer-modified-p)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1707
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1708 (defun momentary-string-display (string pos &optional exit-char message)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1709 "Momentarily display STRING in the buffer at POS.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1710 Display remains until next event is input.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1711 Optional third arg EXIT-CHAR can be a character, event or event
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1712 description list. EXIT-CHAR defaults to SPC. If the input is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1713 EXIT-CHAR it is swallowed; otherwise it is then available as
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1714 input (as a command if nothing else).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1715 Display MESSAGE (optional fourth arg) in the echo area.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1716 If MESSAGE is nil, instructions to type EXIT-CHAR are displayed there."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1717 (or exit-char (setq exit-char ?\ ))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1718 (let ((inhibit-read-only t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1719 ;; Don't modify the undo list at all.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1720 (buffer-undo-list t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1721 (modified (buffer-modified-p))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1722 (name buffer-file-name)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1723 insert-end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1724 (unwind-protect
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1725 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1726 (save-excursion
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1727 (goto-char pos)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1728 ;; defeat file locking... don't try this at home, kids!
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1729 (setq buffer-file-name nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1730 (insert-before-markers string)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1731 (setq insert-end (point))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1732 ;; If the message end is off screen, recenter now.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1733 (if (< (window-end nil t) insert-end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1734 (recenter (/ (window-height) 2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1735 ;; If that pushed message start off the screen,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1736 ;; scroll to start it at the top of the screen.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1737 (move-to-window-line 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1738 (if (> (point) pos)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1739 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1740 (goto-char pos)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1741 (recenter 0))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1742 (message (or message "Type %s to continue editing.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1743 (single-key-description exit-char))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1744 (let (char)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1745 (if (integerp exit-char)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1746 (condition-case nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1747 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1748 (setq char (read-char))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1749 (or (eq char exit-char)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1750 (setq unread-command-events (list char))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1751 (error
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1752 ;; `exit-char' is a character, hence it differs
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1753 ;; from char, which is an event.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1754 (setq unread-command-events (list char))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1755 ;; `exit-char' can be an event, or an event description
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1756 ;; list.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1757 (setq char (read-event))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1758 (or (eq char exit-char)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1759 (eq char (event-convert-list exit-char))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1760 (setq unread-command-events (list char))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1761 (if insert-end
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1762 (save-excursion
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1763 (delete-region pos insert-end)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1764 (setq buffer-file-name name)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1765 (set-buffer-modified-p modified))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1766
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1767
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1768 ;;;; Overlay operations
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1769
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1770 (defun copy-overlay (o)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1771 "Return a copy of overlay O."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1772 (let ((o1 (make-overlay (overlay-start o) (overlay-end o)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1773 ;; FIXME: there's no easy way to find the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1774 ;; insertion-type of the two markers.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1775 (overlay-buffer o)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1776 (props (overlay-properties o)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1777 (while props
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1778 (overlay-put o1 (pop props) (pop props)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1779 o1))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1780
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1781 (defun remove-overlays (&optional beg end name val)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1782 "Clear BEG and END of overlays whose property NAME has value VAL.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1783 Overlays might be moved and/or split.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1784 BEG and END default respectively to the beginning and end of buffer."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1785 (unless beg (setq beg (point-min)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1786 (unless end (setq end (point-max)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1787 (if (< end beg)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1788 (setq beg (prog1 end (setq end beg))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1789 (save-excursion
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1790 (dolist (o (overlays-in beg end))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1791 (when (eq (overlay-get o name) val)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1792 ;; Either push this overlay outside beg...end
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1793 ;; or split it to exclude beg...end
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1794 ;; or delete it entirely (if it is contained in beg...end).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1795 (if (< (overlay-start o) beg)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1796 (if (> (overlay-end o) end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1797 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1798 (move-overlay (copy-overlay o)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1799 (overlay-start o) beg)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1800 (move-overlay o end (overlay-end o)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1801 (move-overlay o (overlay-start o) beg))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1802 (if (> (overlay-end o) end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1803 (move-overlay o end (overlay-end o))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1804 (delete-overlay o)))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1805
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1806 ;;;; Miscellanea.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1807
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1808 (defvar suspend-hook nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1809 "Normal hook run by `suspend-emacs', before suspending.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1810
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1811 (defvar suspend-resume-hook nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1812 "Normal hook run by `suspend-emacs', after Emacs is continued.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1813
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1814 (defvar temp-buffer-show-hook nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1815 "Normal hook run by `with-output-to-temp-buffer' after displaying the buffer.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1816 When the hook runs, the temporary buffer is current, and the window it
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1817 was displayed in is selected. This hook is normally set up with a
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1818 function to make the buffer read only, and find function names and
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1819 variable names in it, provided the major mode is still Help mode.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1820
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1821 (defvar temp-buffer-setup-hook nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1822 "Normal hook run by `with-output-to-temp-buffer' at the start.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1823 When the hook runs, the temporary buffer is current.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1824 This hook is normally set up with a function to put the buffer in Help
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1825 mode.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1826
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1827 ;; Avoid compiler warnings about this variable,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1828 ;; which has a special meaning on certain system types.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1829 (defvar buffer-file-type nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1830 "Non-nil if the visited file is a binary file.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1831 This variable is meaningful on MS-DOG and Windows NT.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1832 On those systems, it is automatically local in every buffer.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1833 On other systems, this variable is normally always nil.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1834
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1835 ;;;; Misc. useful functions.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1836
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1837 (defun find-tag-default ()
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1838 "Determine default tag to search for, based on text at point.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1839 If there is no plausible default, return nil."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1840 (save-excursion
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1841 (while (looking-at "\\sw\\|\\s_")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1842 (forward-char 1))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1843 (if (or (re-search-backward "\\sw\\|\\s_"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1844 (save-excursion (beginning-of-line) (point))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1845 t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1846 (re-search-forward "\\(\\sw\\|\\s_\\)+"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1847 (save-excursion (end-of-line) (point))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1848 t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1849 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1850 (goto-char (match-end 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1851 (condition-case nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1852 (buffer-substring-no-properties
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1853 (point)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1854 (progn (forward-sexp -1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1855 (while (looking-at "\\s'")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1856 (forward-char 1))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1857 (point)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1858 (error nil)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1859 nil)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1860
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1861 (defun play-sound (sound)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1862 "SOUND is a list of the form `(sound KEYWORD VALUE...)'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1863 The following keywords are recognized:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1864
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1865 :file FILE - read sound data from FILE. If FILE isn't an
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1866 absolute file name, it is searched in `data-directory'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1867
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1868 :data DATA - read sound data from string DATA.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1869
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1870 Exactly one of :file or :data must be present.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1871
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1872 :volume VOL - set volume to VOL. VOL must an integer in the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1873 range 0..100 or a float in the range 0..1.0. If not specified,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1874 don't change the volume setting of the sound device.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1875
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1876 :device DEVICE - play sound on DEVICE. If not specified,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1877 a system-dependent default device name is used."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1878 (if (fboundp 'play-sound-internal)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1879 (play-sound-internal sound)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1880 (error "This Emacs binary lacks sound support")))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1881
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1882 (defun shell-quote-argument (argument)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1883 "Quote an argument for passing as argument to an inferior shell."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1884 (if (eq system-type 'ms-dos)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1885 ;; Quote using double quotes, but escape any existing quotes in
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1886 ;; the argument with backslashes.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1887 (let ((result "")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1888 (start 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1889 end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1890 (if (or (null (string-match "[^\"]" argument))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1891 (< (match-end 0) (length argument)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1892 (while (string-match "[\"]" argument start)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1893 (setq end (match-beginning 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1894 result (concat result (substring argument start end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1895 "\\" (substring argument end (1+ end)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1896 start (1+ end))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1897 (concat "\"" result (substring argument start) "\""))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1898 (if (eq system-type 'windows-nt)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1899 (concat "\"" argument "\"")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1900 (if (equal argument "")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1901 "''"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1902 ;; Quote everything except POSIX filename characters.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1903 ;; This should be safe enough even for really weird shells.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1904 (let ((result "") (start 0) end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1905 (while (string-match "[^-0-9a-zA-Z_./]" argument start)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1906 (setq end (match-beginning 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1907 result (concat result (substring argument start end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1908 "\\" (substring argument end (1+ end)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1909 start (1+ end)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1910 (concat result (substring argument start)))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1911
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1912 ;;;; Support for yanking and text properties.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1913
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1914 (defvar yank-excluded-properties)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1915
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1916 (defun remove-yank-excluded-properties (start end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1917 "Remove `yank-excluded-properties' between START and END positions.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1918 Replaces `category' properties with their defined properties."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1919 (let ((inhibit-read-only t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1920 ;; Replace any `category' property with the properties it stands for.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1921 (unless (memq yank-excluded-properties '(t nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1922 (save-excursion
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1923 (goto-char start)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1924 (while (< (point) end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1925 (let ((cat (get-text-property (point) 'category))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1926 run-end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1927 (setq run-end
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1928 (next-single-property-change (point) 'category nil end))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1929 (when cat
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1930 (let (run-end2 original)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1931 (remove-list-of-text-properties (point) run-end '(category))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1932 (while (< (point) run-end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1933 (setq run-end2 (next-property-change (point) nil run-end))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1934 (setq original (text-properties-at (point)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1935 (set-text-properties (point) run-end2 (symbol-plist cat))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1936 (add-text-properties (point) run-end2 original)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1937 (goto-char run-end2))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1938 (goto-char run-end)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1939 (if (eq yank-excluded-properties t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1940 (set-text-properties start end nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1941 (remove-list-of-text-properties start end yank-excluded-properties))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1942
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1943 (defvar yank-undo-function)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1944
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1945 (defun insert-for-yank (string)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1946 "Calls `insert-for-yank-1' repetitively for each `yank-handler' segment.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1947
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1948 See `insert-for-yank-1' for more details."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1949 (let (to)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1950 (while (setq to (next-single-property-change 0 'yank-handler string))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1951 (insert-for-yank-1 (substring string 0 to))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1952 (setq string (substring string to))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1953 (insert-for-yank-1 string))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1954
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1955 (defun insert-for-yank-1 (string)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1956 "Insert STRING at point, stripping some text properties.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1957
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1958 Strip text properties from the inserted text according to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1959 `yank-excluded-properties'. Otherwise just like (insert STRING).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1960
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1961 If STRING has a non-nil `yank-handler' property on the first character,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1962 the normal insert behavior is modified in various ways. The value of
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1963 the yank-handler property must be a list with one to four elements
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1964 with the following format: (FUNCTION PARAM NOEXCLUDE UNDO).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1965 When FUNCTION is present and non-nil, it is called instead of `insert'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1966 to insert the string. FUNCTION takes one argument--the object to insert.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1967 If PARAM is present and non-nil, it replaces STRING as the object
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1968 passed to FUNCTION (or `insert'); for example, if FUNCTION is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1969 `yank-rectangle', PARAM may be a list of strings to insert as a
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1970 rectangle.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1971 If NOEXCLUDE is present and non-nil, the normal removal of the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1972 yank-excluded-properties is not performed; instead FUNCTION is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1973 responsible for removing those properties. This may be necessary
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1974 if FUNCTION adjusts point before or after inserting the object.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1975 If UNDO is present and non-nil, it is a function that will be called
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1976 by `yank-pop' to undo the insertion of the current object. It is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1977 called with two arguments, the start and end of the current region.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1978 FUNCTION may set `yank-undo-function' to override the UNDO value."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1979 (let* ((handler (and (stringp string)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1980 (get-text-property 0 'yank-handler string)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1981 (param (or (nth 1 handler) string))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1982 (opoint (point)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1983 (setq yank-undo-function t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1984 (if (nth 0 handler) ;; FUNCTION
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1985 (funcall (car handler) param)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1986 (insert param))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1987 (unless (nth 2 handler) ;; NOEXCLUDE
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1988 (remove-yank-excluded-properties opoint (point)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1989 (if (eq yank-undo-function t) ;; not set by FUNCTION
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1990 (setq yank-undo-function (nth 3 handler))) ;; UNDO
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1991 (if (nth 4 handler) ;; COMMAND
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1992 (setq this-command (nth 4 handler)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1993
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1994 (defun insert-buffer-substring-no-properties (buffer &optional start end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1995 "Insert before point a substring of BUFFER, without text properties.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1996 BUFFER may be a buffer or a buffer name.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1997 Arguments START and END are character positions specifying the substring.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1998 They default to the values of (point-min) and (point-max) in BUFFER."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
1999 (let ((opoint (point)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2000 (insert-buffer-substring buffer start end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2001 (let ((inhibit-read-only t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2002 (set-text-properties opoint (point) nil))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2003
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2004 (defun insert-buffer-substring-as-yank (buffer &optional start end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2005 "Insert before point a part of BUFFER, stripping some text properties.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2006 BUFFER may be a buffer or a buffer name.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2007 Arguments START and END are character positions specifying the substring.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2008 They default to the values of (point-min) and (point-max) in BUFFER.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2009 Strip text properties from the inserted text according to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2010 `yank-excluded-properties'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2011 ;; Since the buffer text should not normally have yank-handler properties,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2012 ;; there is no need to handle them here.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2013 (let ((opoint (point)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2014 (insert-buffer-substring buffer start end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2015 (remove-yank-excluded-properties opoint (point))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2016
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2017
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2018 ;;;; Synchronous shell commands.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2019
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2020 (defun start-process-shell-command (name buffer &rest args)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2021 "Start a program in a subprocess. Return the process object for it.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2022 NAME is name for process. It is modified if necessary to make it unique.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2023 BUFFER is the buffer (or buffer name) to associate with the process.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2024 Process output goes at end of that buffer, unless you specify
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2025 an output stream or filter function to handle the output.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2026 BUFFER may be also nil, meaning that this process is not associated
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2027 with any buffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2028 COMMAND is the name of a shell command.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2029 Remaining arguments are the arguments for the command.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2030 Wildcards and redirection are handled as usual in the shell.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2031
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2032 \(fn NAME BUFFER COMMAND &rest COMMAND-ARGS)"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2033 (cond
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2034 ((eq system-type 'vax-vms)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2035 (apply 'start-process name buffer args))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2036 ;; We used to use `exec' to replace the shell with the command,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2037 ;; but that failed to handle (...) and semicolon, etc.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2038 (t
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2039 (start-process name buffer shell-file-name shell-command-switch
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2040 (mapconcat 'identity args " ")))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2041
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2042 (defun call-process-shell-command (command &optional infile buffer display
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2043 &rest args)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2044 "Execute the shell command COMMAND synchronously in separate process.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2045 The remaining arguments are optional.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2046 The program's input comes from file INFILE (nil means `/dev/null').
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2047 Insert output in BUFFER before point; t means current buffer;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2048 nil for BUFFER means discard it; 0 means discard and don't wait.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2049 BUFFER can also have the form (REAL-BUFFER STDERR-FILE); in that case,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2050 REAL-BUFFER says what to do with standard output, as above,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2051 while STDERR-FILE says what to do with standard error in the child.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2052 STDERR-FILE may be nil (discard standard error output),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2053 t (mix it with ordinary output), or a file name string.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2054
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2055 Fourth arg DISPLAY non-nil means redisplay buffer as output is inserted.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2056 Remaining arguments are strings passed as additional arguments for COMMAND.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2057 Wildcards and redirection are handled as usual in the shell.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2058
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2059 If BUFFER is 0, `call-process-shell-command' returns immediately with value nil.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2060 Otherwise it waits for COMMAND to terminate and returns a numeric exit
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2061 status or a signal description string.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2062 If you quit, the process is killed with SIGINT, or SIGKILL if you quit again."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2063 (cond
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2064 ((eq system-type 'vax-vms)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2065 (apply 'call-process command infile buffer display args))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2066 ;; We used to use `exec' to replace the shell with the command,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2067 ;; but that failed to handle (...) and semicolon, etc.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2068 (t
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2069 (call-process shell-file-name
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2070 infile buffer display
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2071 shell-command-switch
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2072 (mapconcat 'identity (cons command args) " ")))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2073
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2074 ;;;; Lisp macros to do various things temporarily.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2075
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2076 (defmacro with-current-buffer (buffer &rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2077 "Execute the forms in BODY with BUFFER as the current buffer.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2078 The value returned is the value of the last form in BODY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2079 See also `with-temp-buffer'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2080 (declare (indent 1) (debug t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2081 `(save-current-buffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2082 (set-buffer ,buffer)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2083 ,@body))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2084
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2085 (defmacro with-selected-window (window &rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2086 "Execute the forms in BODY with WINDOW as the selected window.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2087 The value returned is the value of the last form in BODY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2088
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2089 This macro saves and restores the current buffer, since otherwise
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2090 its normal operation could potentially make a different
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2091 buffer current. It does not alter the buffer list ordering.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2092
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2093 This macro saves and restores the selected window, as well as
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2094 the selected window in each frame. If the previously selected
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2095 window of some frame is no longer live at the end of BODY, that
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2096 frame's selected window is left alone. If the selected window is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2097 no longer live, then whatever window is selected at the end of
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2098 BODY remains selected.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2099 See also `with-temp-buffer'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2100 (declare (indent 1) (debug t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2101 ;; Most of this code is a copy of save-selected-window.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2102 `(let ((save-selected-window-window (selected-window))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2103 ;; It is necessary to save all of these, because calling
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2104 ;; select-window changes frame-selected-window for whatever
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2105 ;; frame that window is in.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2106 (save-selected-window-alist
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2107 (mapcar (lambda (frame) (list frame (frame-selected-window frame)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2108 (frame-list))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2109 (save-current-buffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2110 (unwind-protect
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2111 (progn (select-window ,window 'norecord)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2112 ,@body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2113 (dolist (elt save-selected-window-alist)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2114 (and (frame-live-p (car elt))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2115 (window-live-p (cadr elt))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2116 (set-frame-selected-window (car elt) (cadr elt))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2117 (if (window-live-p save-selected-window-window)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2118 (select-window save-selected-window-window 'norecord))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2119
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2120 (defmacro with-temp-file (file &rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2121 "Create a new buffer, evaluate BODY there, and write the buffer to FILE.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2122 The value returned is the value of the last form in BODY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2123 See also `with-temp-buffer'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2124 (declare (debug t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2125 (let ((temp-file (make-symbol "temp-file"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2126 (temp-buffer (make-symbol "temp-buffer")))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2127 `(let ((,temp-file ,file)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2128 (,temp-buffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2129 (get-buffer-create (generate-new-buffer-name " *temp file*"))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2130 (unwind-protect
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2131 (prog1
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2132 (with-current-buffer ,temp-buffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2133 ,@body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2134 (with-current-buffer ,temp-buffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2135 (widen)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2136 (write-region (point-min) (point-max) ,temp-file nil 0)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2137 (and (buffer-name ,temp-buffer)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2138 (kill-buffer ,temp-buffer))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2139
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2140 (defmacro with-temp-message (message &rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2141 "Display MESSAGE temporarily if non-nil while BODY is evaluated.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2142 The original message is restored to the echo area after BODY has finished.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2143 The value returned is the value of the last form in BODY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2144 MESSAGE is written to the message log buffer if `message-log-max' is non-nil.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2145 If MESSAGE is nil, the echo area and message log buffer are unchanged.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2146 Use a MESSAGE of \"\" to temporarily clear the echo area."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2147 (declare (debug t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2148 (let ((current-message (make-symbol "current-message"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2149 (temp-message (make-symbol "with-temp-message")))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2150 `(let ((,temp-message ,message)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2151 (,current-message))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2152 (unwind-protect
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2153 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2154 (when ,temp-message
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2155 (setq ,current-message (current-message))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2156 (message "%s" ,temp-message))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2157 ,@body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2158 (and ,temp-message
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2159 (if ,current-message
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2160 (message "%s" ,current-message)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2161 (message nil)))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2162
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2163 (defmacro with-temp-buffer (&rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2164 "Create a temporary buffer, and evaluate BODY there like `progn'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2165 See also `with-temp-file' and `with-output-to-string'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2166 (declare (indent 0) (debug t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2167 (let ((temp-buffer (make-symbol "temp-buffer")))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2168 `(let ((,temp-buffer (generate-new-buffer " *temp*")))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2169 (unwind-protect
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2170 (with-current-buffer ,temp-buffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2171 ,@body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2172 (and (buffer-name ,temp-buffer)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2173 (kill-buffer ,temp-buffer))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2174
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2175 (defmacro with-output-to-string (&rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2176 "Execute BODY, return the text it sent to `standard-output', as a string."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2177 (declare (indent 0) (debug t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2178 `(let ((standard-output
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2179 (get-buffer-create (generate-new-buffer-name " *string-output*"))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2180 (let ((standard-output standard-output))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2181 ,@body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2182 (with-current-buffer standard-output
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2183 (prog1
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2184 (buffer-string)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2185 (kill-buffer nil)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2186
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2187 (defmacro with-local-quit (&rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2188 "Execute BODY, allowing quits to terminate BODY but not escape further.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2189 When a quit terminates BODY, `with-local-quit' returns nil but
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2190 requests another quit. That quit will be processed, the next time quitting
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2191 is allowed once again."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2192 (declare (debug t) (indent 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2193 `(condition-case nil
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2194 (let ((inhibit-quit nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2195 ,@body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2196 (quit (setq quit-flag t) nil)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2197
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2198 (defmacro while-no-input (&rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2199 "Execute BODY only as long as there's no pending input.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2200 If input arrives, that ends the execution of BODY,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2201 and `while-no-input' returns t. Quitting makes it return nil.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2202 If BODY finishes, `while-no-input' returns whatever value BODY produced."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2203 (declare (debug t) (indent 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2204 (let ((catch-sym (make-symbol "input")))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2205 `(with-local-quit
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2206 (catch ',catch-sym
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2207 (let ((throw-on-input ',catch-sym))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2208 (or (not (sit-for 0 0 t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2209 ,@body))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2210
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2211 (defmacro combine-after-change-calls (&rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2212 "Execute BODY, but don't call the after-change functions till the end.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2213 If BODY makes changes in the buffer, they are recorded
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2214 and the functions on `after-change-functions' are called several times
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2215 when BODY is finished.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2216 The return value is the value of the last form in BODY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2217
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2218 If `before-change-functions' is non-nil, then calls to the after-change
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2219 functions can't be deferred, so in that case this macro has no effect.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2220
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2221 Do not alter `after-change-functions' or `before-change-functions'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2222 in BODY."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2223 (declare (indent 0) (debug t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2224 `(unwind-protect
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2225 (let ((combine-after-change-calls t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2226 . ,body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2227 (combine-after-change-execute)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2228
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2229 ;;;; Constructing completion tables.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2230
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2231 (defmacro dynamic-completion-table (fun)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2232 "Use function FUN as a dynamic completion table.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2233 FUN is called with one argument, the string for which completion is required,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2234 and it should return an alist containing all the intended possible
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2235 completions. This alist may be a full list of possible completions so that FUN
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2236 can ignore the value of its argument. If completion is performed in the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2237 minibuffer, FUN will be called in the buffer from which the minibuffer was
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2238 entered.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2239
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2240 The result of the `dynamic-completion-table' form is a function
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2241 that can be used as the ALIST argument to `try-completion' and
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2242 `all-completion'. See Info node `(elisp)Programmed Completion'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2243 (declare (debug (lambda-expr)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2244 (let ((win (make-symbol "window"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2245 (string (make-symbol "string"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2246 (predicate (make-symbol "predicate"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2247 (mode (make-symbol "mode")))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2248 `(lambda (,string ,predicate ,mode)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2249 (with-current-buffer (let ((,win (minibuffer-selected-window)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2250 (if (window-live-p ,win) (window-buffer ,win)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2251 (current-buffer)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2252 (cond
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2253 ((eq ,mode t) (all-completions ,string (,fun ,string) ,predicate))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2254 ((not ,mode) (try-completion ,string (,fun ,string) ,predicate))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2255 (t (test-completion ,string (,fun ,string) ,predicate)))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2256
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2257 (defmacro lazy-completion-table (var fun)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2258 ;; We used to have `&rest args' where `args' were evaluated late (at the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2259 ;; time of the call to `fun'), which was counter intuitive. But to get
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2260 ;; them to be evaluated early, we have to either use lexical-let (which is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2261 ;; not available in subr.el) or use `(lambda (,str) ...) which prevents the use
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2262 ;; of lexical-let in the callers.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2263 ;; So we just removed the argument. Callers can then simply use either of:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2264 ;; (lazy-completion-table var (lambda () (fun x y)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2265 ;; or
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2266 ;; (lazy-completion-table var `(lambda () (fun ',x ',y)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2267 ;; or
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2268 ;; (lexical-let ((x x)) ((y y))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2269 ;; (lazy-completion-table var (lambda () (fun x y))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2270 ;; depending on the behavior they want.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2271 "Initialize variable VAR as a lazy completion table.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2272 If the completion table VAR is used for the first time (e.g., by passing VAR
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2273 as an argument to `try-completion'), the function FUN is called with no
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2274 arguments. FUN must return the completion table that will be stored in VAR.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2275 If completion is requested in the minibuffer, FUN will be called in the buffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2276 from which the minibuffer was entered. The return value of
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2277 `lazy-completion-table' must be used to initialize the value of VAR."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2278 (declare (debug (symbol lambda-expr)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2279 (let ((str (make-symbol "string")))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2280 `(dynamic-completion-table
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2281 (lambda (,str)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2282 (when (functionp ,var)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2283 (setq ,var (,fun)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2284 ,var))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2285
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2286 (defmacro complete-in-turn (a b)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2287 "Create a completion table that first tries completion in A and then in B.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2288 A and B should not be costly (or side-effecting) expressions."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2289 (declare (debug (def-form def-form)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2290 `(lambda (string predicate mode)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2291 (cond
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2292 ((eq mode t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2293 (or (all-completions string ,a predicate)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2294 (all-completions string ,b predicate)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2295 ((eq mode nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2296 (or (try-completion string ,a predicate)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2297 (try-completion string ,b predicate)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2298 (t
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2299 (or (test-completion string ,a predicate)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2300 (test-completion string ,b predicate))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2301
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2302 ;;; Matching and match data.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2303
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2304 (defvar save-match-data-internal)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2305
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2306 ;; We use save-match-data-internal as the local variable because
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2307 ;; that works ok in practice (people should not use that variable elsewhere).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2308 ;; We used to use an uninterned symbol; the compiler handles that properly
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2309 ;; now, but it generates slower code.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2310 (defmacro save-match-data (&rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2311 "Execute the BODY forms, restoring the global value of the match data.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2312 The value returned is the value of the last form in BODY."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2313 ;; It is better not to use backquote here,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2314 ;; because that makes a bootstrapping problem
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2315 ;; if you need to recompile all the Lisp files using interpreted code.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2316 (declare (indent 0) (debug t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2317 (list 'let
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2318 '((save-match-data-internal (match-data)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2319 (list 'unwind-protect
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2320 (cons 'progn body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2321 ;; It is safe to free (evaporate) markers immediately here,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2322 ;; as Lisp programs should not copy from save-match-data-internal.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2323 '(set-match-data save-match-data-internal 'evaporate))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2324
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2325 (defun match-string (num &optional string)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2326 "Return string of text matched by last search.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2327 NUM specifies which parenthesized expression in the last regexp.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2328 Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2329 Zero means the entire text matched by the whole regexp or whole string.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2330 STRING should be given if the last search was by `string-match' on STRING."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2331 (if (match-beginning num)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2332 (if string
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2333 (substring string (match-beginning num) (match-end num))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2334 (buffer-substring (match-beginning num) (match-end num)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2335
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2336 (defun match-string-no-properties (num &optional string)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2337 "Return string of text matched by last search, without text properties.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2338 NUM specifies which parenthesized expression in the last regexp.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2339 Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2340 Zero means the entire text matched by the whole regexp or whole string.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2341 STRING should be given if the last search was by `string-match' on STRING."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2342 (if (match-beginning num)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2343 (if string
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2344 (substring-no-properties string (match-beginning num)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2345 (match-end num))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2346 (buffer-substring-no-properties (match-beginning num)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2347 (match-end num)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2348
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2349 (defun looking-back (regexp &optional limit greedy)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2350 "Return non-nil if text before point matches regular expression REGEXP.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2351 Like `looking-at' except matches before point, and is slower.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2352 LIMIT if non-nil speeds up the search by specifying how far back the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2353 match can start.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2354
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2355 If GREEDY is non-nil, extend the match backwards as far as possible,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2356 stopping when a single additional previous character cannot be part
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2357 of a match for REGEXP."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2358 (let ((start (point))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2359 (pos
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2360 (save-excursion
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2361 (and (re-search-backward (concat "\\(?:" regexp "\\)\\=") limit t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2362 (point)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2363 (if (and greedy pos)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2364 (save-restriction
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2365 (narrow-to-region (point-min) start)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2366 (while (and (> pos (point-min))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2367 (save-excursion
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2368 (goto-char pos)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2369 (backward-char 1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2370 (looking-at (concat "\\(?:" regexp "\\)\\'"))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2371 (setq pos (1- pos)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2372 (save-excursion
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2373 (goto-char pos)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2374 (looking-at (concat "\\(?:" regexp "\\)\\'")))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2375 (not (null pos))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2376
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2377 (defun subregexp-context-p (regexp pos &optional start)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2378 "Return non-nil if POS is in a normal subregexp context in REGEXP.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2379 A subregexp context is one where a sub-regexp can appear.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2380 A non-subregexp context is for example within brackets, or within a
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2381 repetition bounds operator `\\=\\{...\\}', or right after a `\\'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2382 If START is non-nil, it should be a position in REGEXP, smaller
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2383 than POS, and known to be in a subregexp context."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2384 ;; Here's one possible implementation, with the great benefit that it
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2385 ;; reuses the regexp-matcher's own parser, so it understands all the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2386 ;; details of the syntax. A disadvantage is that it needs to match the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2387 ;; error string.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2388 (condition-case err
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2389 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2390 (string-match (substring regexp (or start 0) pos) "")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2391 t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2392 (invalid-regexp
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2393 (not (member (cadr err) '("Unmatched [ or [^"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2394 "Unmatched \\{"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2395 "Trailing backslash")))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2396 ;; An alternative implementation:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2397 ;; (defconst re-context-re
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2398 ;; (let* ((harmless-ch "[^\\[]")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2399 ;; (harmless-esc "\\\\[^{]")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2400 ;; (class-harmless-ch "[^][]")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2401 ;; (class-lb-harmless "[^]:]")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2402 ;; (class-lb-colon-maybe-charclass ":\\([a-z]+:]\\)?")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2403 ;; (class-lb (concat "\\[\\(" class-lb-harmless
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2404 ;; "\\|" class-lb-colon-maybe-charclass "\\)"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2405 ;; (class
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2406 ;; (concat "\\[^?]?"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2407 ;; "\\(" class-harmless-ch
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2408 ;; "\\|" class-lb "\\)*"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2409 ;; "\\[?]")) ; special handling for bare [ at end of re
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2410 ;; (braces "\\\\{[0-9,]+\\\\}"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2411 ;; (concat "\\`\\(" harmless-ch "\\|" harmless-esc
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2412 ;; "\\|" class "\\|" braces "\\)*\\'"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2413 ;; "Matches any prefix that corresponds to a normal subregexp context.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2414 ;; (string-match re-context-re (substring regexp (or start 0) pos))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2415 )
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2416
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2417 ;;;; split-string
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2418
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2419 (defconst split-string-default-separators "[ \f\t\n\r\v]+"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2420 "The default value of separators for `split-string'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2421
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2422 A regexp matching strings of whitespace. May be locale-dependent
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2423 \(as yet unimplemented). Should not match non-breaking spaces.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2424
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2425 Warning: binding this to a different value and using it as default is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2426 likely to have undesired semantics.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2427
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2428 ;; The specification says that if both SEPARATORS and OMIT-NULLS are
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2429 ;; defaulted, OMIT-NULLS should be treated as t. Simplifying the logical
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2430 ;; expression leads to the equivalent implementation that if SEPARATORS
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2431 ;; is defaulted, OMIT-NULLS is treated as t.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2432 (defun split-string (string &optional separators omit-nulls)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2433 "Split STRING into substrings bounded by matches for SEPARATORS.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2434
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2435 The beginning and end of STRING, and each match for SEPARATORS, are
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2436 splitting points. The substrings matching SEPARATORS are removed, and
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2437 the substrings between the splitting points are collected as a list,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2438 which is returned.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2439
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2440 If SEPARATORS is non-nil, it should be a regular expression matching text
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2441 which separates, but is not part of, the substrings. If nil it defaults to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2442 `split-string-default-separators', normally \"[ \\f\\t\\n\\r\\v]+\", and
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2443 OMIT-NULLS is forced to t.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2444
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2445 If OMIT-NULLS is t, zero-length substrings are omitted from the list \(so
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2446 that for the default value of SEPARATORS leading and trailing whitespace
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2447 are effectively trimmed). If nil, all zero-length substrings are retained,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2448 which correctly parses CSV format, for example.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2449
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2450 Note that the effect of `(split-string STRING)' is the same as
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2451 `(split-string STRING split-string-default-separators t)'). In the rare
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2452 case that you wish to retain zero-length substrings when splitting on
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2453 whitespace, use `(split-string STRING split-string-default-separators)'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2454
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2455 Modifies the match data; use `save-match-data' if necessary."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2456 (let ((keep-nulls (not (if separators omit-nulls t)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2457 (rexp (or separators split-string-default-separators))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2458 (start 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2459 notfirst
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2460 (list nil))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2461 (while (and (string-match rexp string
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2462 (if (and notfirst
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2463 (= start (match-beginning 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2464 (< start (length string)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2465 (1+ start) start))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2466 (< start (length string)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2467 (setq notfirst t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2468 (if (or keep-nulls (< start (match-beginning 0)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2469 (setq list
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2470 (cons (substring string start (match-beginning 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2471 list)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2472 (setq start (match-end 0)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2473 (if (or keep-nulls (< start (length string)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2474 (setq list
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2475 (cons (substring string start)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2476 list)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2477 (nreverse list)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2478
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2479 ;;;; Replacement in strings.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2480
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2481 (defun subst-char-in-string (fromchar tochar string &optional inplace)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2482 "Replace FROMCHAR with TOCHAR in STRING each time it occurs.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2483 Unless optional argument INPLACE is non-nil, return a new string."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2484 (let ((i (length string))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2485 (newstr (if inplace string (copy-sequence string))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2486 (while (> i 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2487 (setq i (1- i))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2488 (if (eq (aref newstr i) fromchar)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2489 (aset newstr i tochar)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2490 newstr))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2491
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2492 (defun replace-regexp-in-string (regexp rep string &optional
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2493 fixedcase literal subexp start)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2494 "Replace all matches for REGEXP with REP in STRING.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2495
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2496 Return a new string containing the replacements.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2497
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2498 Optional arguments FIXEDCASE, LITERAL and SUBEXP are like the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2499 arguments with the same names of function `replace-match'. If START
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2500 is non-nil, start replacements at that index in STRING.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2501
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2502 REP is either a string used as the NEWTEXT arg of `replace-match' or a
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2503 function. If it is a function, it is called with the actual text of each
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2504 match, and its value is used as the replacement text. When REP is called,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2505 the match-data are the result of matching REGEXP against a substring
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2506 of STRING.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2507
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2508 To replace only the first match (if any), make REGEXP match up to \\'
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2509 and replace a sub-expression, e.g.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2510 (replace-regexp-in-string \"\\\\(foo\\\\).*\\\\'\" \"bar\" \" foo foo\" nil nil 1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2511 => \" bar foo\"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2512 "
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2513
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2514 ;; To avoid excessive consing from multiple matches in long strings,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2515 ;; don't just call `replace-match' continually. Walk down the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2516 ;; string looking for matches of REGEXP and building up a (reversed)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2517 ;; list MATCHES. This comprises segments of STRING which weren't
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2518 ;; matched interspersed with replacements for segments that were.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2519 ;; [For a `large' number of replacements it's more efficient to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2520 ;; operate in a temporary buffer; we can't tell from the function's
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2521 ;; args whether to choose the buffer-based implementation, though it
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2522 ;; might be reasonable to do so for long enough STRING.]
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2523 (let ((l (length string))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2524 (start (or start 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2525 matches str mb me)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2526 (save-match-data
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2527 (while (and (< start l) (string-match regexp string start))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2528 (setq mb (match-beginning 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2529 me (match-end 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2530 ;; If we matched the empty string, make sure we advance by one char
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2531 (when (= me mb) (setq me (min l (1+ mb))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2532 ;; Generate a replacement for the matched substring.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2533 ;; Operate only on the substring to minimize string consing.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2534 ;; Set up match data for the substring for replacement;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2535 ;; presumably this is likely to be faster than munging the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2536 ;; match data directly in Lisp.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2537 (string-match regexp (setq str (substring string mb me)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2538 (setq matches
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2539 (cons (replace-match (if (stringp rep)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2540 rep
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2541 (funcall rep (match-string 0 str)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2542 fixedcase literal str subexp)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2543 (cons (substring string start mb) ; unmatched prefix
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2544 matches)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2545 (setq start me))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2546 ;; Reconstruct a string from the pieces.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2547 (setq matches (cons (substring string start l) matches)) ; leftover
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2548 (apply #'concat (nreverse matches)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2549
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2550 ;;;; invisibility specs
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2551
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2552 (defun add-to-invisibility-spec (element)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2553 "Add ELEMENT to `buffer-invisibility-spec'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2554 See documentation for `buffer-invisibility-spec' for the kind of elements
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2555 that can be added."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2556 (if (eq buffer-invisibility-spec t)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2557 (setq buffer-invisibility-spec (list t)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2558 (setq buffer-invisibility-spec
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2559 (cons element buffer-invisibility-spec)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2560
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2561 (defun remove-from-invisibility-spec (element)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2562 "Remove ELEMENT from `buffer-invisibility-spec'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2563 (if (consp buffer-invisibility-spec)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2564 (setq buffer-invisibility-spec (delete element buffer-invisibility-spec))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2565
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2566 ;;;; Syntax tables.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2567
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2568 (defmacro with-syntax-table (table &rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2569 "Evaluate BODY with syntax table of current buffer set to TABLE.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2570 The syntax table of the current buffer is saved, BODY is evaluated, and the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2571 saved table is restored, even in case of an abnormal exit.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2572 Value is what BODY returns."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2573 (declare (debug t))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2574 (let ((old-table (make-symbol "table"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2575 (old-buffer (make-symbol "buffer")))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2576 `(let ((,old-table (syntax-table))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2577 (,old-buffer (current-buffer)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2578 (unwind-protect
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2579 (progn
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2580 (set-syntax-table ,table)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2581 ,@body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2582 (save-current-buffer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2583 (set-buffer ,old-buffer)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2584 (set-syntax-table ,old-table))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2585
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2586 (defun make-syntax-table (&optional oldtable)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2587 "Return a new syntax table.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2588 Create a syntax table which inherits from OLDTABLE (if non-nil) or
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2589 from `standard-syntax-table' otherwise."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2590 (let ((table (make-char-table 'syntax-table nil)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2591 (set-char-table-parent table (or oldtable (standard-syntax-table)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2592 table))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2593
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2594 (defun syntax-after (pos)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2595 "Return the raw syntax of the char after POS.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2596 If POS is outside the buffer's accessible portion, return nil."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2597 (unless (or (< pos (point-min)) (>= pos (point-max)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2598 (let ((st (if parse-sexp-lookup-properties
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2599 (get-char-property pos 'syntax-table))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2600 (if (consp st) st
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2601 (aref (or st (syntax-table)) (char-after pos))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2602
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2603 (defun syntax-class (syntax)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2604 "Return the syntax class part of the syntax descriptor SYNTAX.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2605 If SYNTAX is nil, return nil."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2606 (and syntax (logand (car syntax) 65535)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2607
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2608 ;;;; Text clones
40282
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2609
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2610 (defun text-clone-maintain (ol1 after beg end &optional len)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2611 "Propagate the changes made under the overlay OL1 to the other clones.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2612 This is used on the `modification-hooks' property of text clones."
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2613 (when (and after (not undo-in-progress) (overlay-start ol1))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2614 (let ((margin (if (overlay-get ol1 'text-clone-spreadp) 1 0)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2615 (setq beg (max beg (+ (overlay-start ol1) margin)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2616 (setq end (min end (- (overlay-end ol1) margin)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2617 (when (<= beg end)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2618 (save-excursion
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2619 (when (overlay-get ol1 'text-clone-syntax)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2620 ;; Check content of the clone's text.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2621 (let ((cbeg (+ (overlay-start ol1) margin))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2622 (cend (- (overlay-end ol1) margin)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2623 (goto-char cbeg)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2624 (save-match-data
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2625 (if (not (re-search-forward
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2626 (overlay-get ol1 'text-clone-syntax) cend t))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2627 ;; Mark the overlay for deletion.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2628 (overlay-put ol1 'text-clones nil)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2629 (when (< (match-end 0) cend)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2630 ;; Shrink the clone at its end.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2631 (setq end (min end (match-end 0)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2632 (move-overlay ol1 (overlay-start ol1)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2633 (+ (match-end 0) margin)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2634 (when (> (match-beginning 0) cbeg)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2635 ;; Shrink the clone at its beginning.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2636 (setq beg (max (match-beginning 0) beg))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2637 (move-overlay ol1 (- (match-beginning 0) margin)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2638 (overlay-end ol1)))))))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2639 ;; Now go ahead and update the clones.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2640 (let ((head (- beg (overlay-start ol1)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2641 (tail (- (overlay-end ol1) end))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2642 (str (buffer-substring beg end))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2643 (nothing-left t)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2644 (inhibit-modification-hooks t))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2645 (dolist (ol2 (overlay-get ol1 'text-clones))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2646 (let ((oe (overlay-end ol2)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2647 (unless (or (eq ol1 ol2) (null oe))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2648 (setq nothing-left nil)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2649 (let ((mod-beg (+ (overlay-start ol2) head)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2650 ;;(overlay-put ol2 'modification-hooks nil)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2651 (goto-char (- (overlay-end ol2) tail))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2652 (unless (> mod-beg (point))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2653 (save-excursion (insert str))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2654 (delete-region mod-beg (point)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2655 ;;(overlay-put ol2 'modification-hooks '(text-clone-maintain))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2656 ))))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2657 (if nothing-left (delete-overlay ol1))))))))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2658
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2659 (defun text-clone-create (start end &optional spreadp syntax)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2660 "Create a text clone of START...END at point.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2661 Text clones are chunks of text that are automatically kept identical:
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2662 changes done to one of the clones will be immediately propagated to the other.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2663
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2664 The buffer's content at point is assumed to be already identical to
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2665 the one between START and END.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2666 If SYNTAX is provided it's a regexp that describes the possible text of
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2667 the clones; the clone will be shrunk or killed if necessary to ensure that
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2668 its text matches the regexp.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2669 If SPREADP is non-nil it indicates that text inserted before/after the
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2670 clone should be incorporated in the clone."
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2671 ;; To deal with SPREADP we can either use an overlay with `nil t' along
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2672 ;; with insert-(behind|in-front-of)-hooks or use a slightly larger overlay
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2673 ;; (with a one-char margin at each end) with `t nil'.
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2674 ;; We opted for a larger overlay because it behaves better in the case
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2675 ;; where the clone is reduced to the empty string (we want the overlay to
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2676 ;; stay when the clone's content is the empty string and we want to use
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2677 ;; `evaporate' to make sure those overlays get deleted when needed).
47916
0bb8dc016c43 (remq): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47747
diff changeset
2678 ;;
40282
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2679 (let* ((pt-end (+ (point) (- end start)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2680 (start-margin (if (or (not spreadp) (bobp) (<= start (point-min)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2681 0 1))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2682 (end-margin (if (or (not spreadp)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2683 (>= pt-end (point-max))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2684 (>= start (point-max)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2685 0 1))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2686 (ol1 (make-overlay (- start start-margin) (+ end end-margin) nil t))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2687 (ol2 (make-overlay (- (point) start-margin) (+ pt-end end-margin) nil t))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2688 (dups (list ol1 ol2)))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2689 (overlay-put ol1 'modification-hooks '(text-clone-maintain))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2690 (when spreadp (overlay-put ol1 'text-clone-spreadp t))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2691 (when syntax (overlay-put ol1 'text-clone-syntax syntax))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2692 ;;(overlay-put ol1 'face 'underline)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2693 (overlay-put ol1 'evaporate t)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2694 (overlay-put ol1 'text-clones dups)
47916
0bb8dc016c43 (remq): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47747
diff changeset
2695 ;;
40282
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2696 (overlay-put ol2 'modification-hooks '(text-clone-maintain))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2697 (when spreadp (overlay-put ol2 'text-clone-spreadp t))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2698 (when syntax (overlay-put ol2 'text-clone-syntax syntax))
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2699 ;;(overlay-put ol2 'face 'underline)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2700 (overlay-put ol2 'evaporate t)
7f05eff77ea2 (delay-mode-hooks, delayed-mode-hooks, run-mode-hooks): New vars and functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39725
diff changeset
2701 (overlay-put ol2 'text-clones dups)))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2702
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2703 ;;;; Mail user agents.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2704
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2705 ;; Here we include just enough for other packages to be able
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2706 ;; to define them.
44422
5f7f8b191a8c (play-sound): Move here from simple.el.
Pavel Janík <Pavel@Janik.cz>
parents: 44285
diff changeset
2707
47406
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2708 (defun define-mail-user-agent (symbol composefunc sendfunc
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2709 &optional abortfunc hookvar)
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2710 "Define a symbol to identify a mail-sending package for `mail-user-agent'.
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2711
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2712 SYMBOL can be any Lisp symbol. Its function definition and/or
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2713 value as a variable do not matter for this usage; we use only certain
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2714 properties on its property list, to encode the rest of the arguments.
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2715
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2716 COMPOSEFUNC is program callable function that composes an outgoing
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2717 mail message buffer. This function should set up the basics of the
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2718 buffer without requiring user interaction. It should populate the
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2719 standard mail headers, leaving the `to:' and `subject:' headers blank
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2720 by default.
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2721
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2722 COMPOSEFUNC should accept several optional arguments--the same
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2723 arguments that `compose-mail' takes. See that function's documentation.
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2724
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2725 SENDFUNC is the command a user would run to send the message.
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2726
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2727 Optional ABORTFUNC is the command a user would run to abort the
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2728 message. For mail packages that don't have a separate abort function,
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2729 this can be `kill-buffer' (the equivalent of omitting this argument).
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2730
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2731 Optional HOOKVAR is a hook variable that gets run before the message
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2732 is actually sent. Callers that use the `mail-user-agent' may
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2733 install a hook function temporarily on this hook variable.
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2734 If HOOKVAR is nil, `mail-send-hook' is used.
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2735
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2736 The properties used on SYMBOL are `composefunc', `sendfunc',
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2737 `abortfunc', and `hookvar'."
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2738 (put symbol 'composefunc composefunc)
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2739 (put symbol 'sendfunc sendfunc)
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2740 (put symbol 'abortfunc (or abortfunc 'kill-buffer))
fbd7a9a8682c (define-mail-user-agent): Moved from simple.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47355
diff changeset
2741 (put symbol 'hookvar (or hookvar 'mail-send-hook)))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2742
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2743 ;;;; Progress reporters.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2744
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2745 ;; Progress reporter has the following structure:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2746 ;;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2747 ;; (NEXT-UPDATE-VALUE . [NEXT-UPDATE-TIME
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2748 ;; MIN-VALUE
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2749 ;; MAX-VALUE
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2750 ;; MESSAGE
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2751 ;; MIN-CHANGE
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2752 ;; MIN-TIME])
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2753 ;;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2754 ;; This weirdeness is for optimization reasons: we want
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2755 ;; `progress-reporter-update' to be as fast as possible, so
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2756 ;; `(car reporter)' is better than `(aref reporter 0)'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2757 ;;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2758 ;; NEXT-UPDATE-TIME is a float. While `float-time' loses a couple
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2759 ;; digits of precision, it doesn't really matter here. On the other
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2760 ;; hand, it greatly simplifies the code.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2761
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2762 (defsubst progress-reporter-update (reporter value)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2763 "Report progress of an operation in the echo area.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2764 However, if the change since last echo area update is too small
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2765 or not enough time has passed, then do nothing (see
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2766 `make-progress-reporter' for details).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2767
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2768 First parameter, REPORTER, should be the result of a call to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2769 `make-progress-reporter'. Second, VALUE, determines the actual
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2770 progress of operation; it must be between MIN-VALUE and MAX-VALUE
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2771 as passed to `make-progress-reporter'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2772
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2773 This function is very inexpensive, you may not bother how often
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2774 you call it."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2775 (when (>= value (car reporter))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2776 (progress-reporter-do-update reporter value)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2777
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2778 (defun make-progress-reporter (message min-value max-value
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2779 &optional current-value
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2780 min-change min-time)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2781 "Return progress reporter object to be used with `progress-reporter-update'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2782
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2783 MESSAGE is shown in the echo area. When at least 1% of operation
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2784 is complete, the exact percentage will be appended to the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2785 MESSAGE. When you call `progress-reporter-done', word \"done\"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2786 is printed after the MESSAGE. You can change MESSAGE of an
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2787 existing progress reporter with `progress-reporter-force-update'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2788
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2789 MIN-VALUE and MAX-VALUE designate starting (0% complete) and
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2790 final (100% complete) states of operation. The latter should be
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2791 larger; if this is not the case, then simply negate all values.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2792 Optional CURRENT-VALUE specifies the progress by the moment you
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2793 call this function. You should omit it or set it to nil in most
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2794 cases since it defaults to MIN-VALUE.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2795
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2796 Optional MIN-CHANGE determines the minimal change in percents to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2797 report (default is 1%.) Optional MIN-TIME specifies the minimal
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2798 time before echo area updates (default is 0.2 seconds.) If
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2799 `float-time' function is not present, then time is not tracked
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2800 at all. If OS is not capable of measuring fractions of seconds,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2801 then this parameter is effectively rounded up."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2802
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2803 (unless min-time
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2804 (setq min-time 0.2))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2805 (let ((reporter
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2806 (cons min-value ;; Force a call to `message' now
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2807 (vector (if (and (fboundp 'float-time)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2808 (>= min-time 0.02))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2809 (float-time) nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2810 min-value
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2811 max-value
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2812 message
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2813 (if min-change (max (min min-change 50) 1) 1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2814 min-time))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2815 (progress-reporter-update reporter (or current-value min-value))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2816 reporter))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2817
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2818 (defun progress-reporter-force-update (reporter value &optional new-message)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2819 "Report progress of an operation in the echo area unconditionally.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2820
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2821 First two parameters are the same as for
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2822 `progress-reporter-update'. Optional NEW-MESSAGE allows you to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2823 change the displayed message."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2824 (let ((parameters (cdr reporter)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2825 (when new-message
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2826 (aset parameters 3 new-message))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2827 (when (aref parameters 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2828 (aset parameters 0 (float-time)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2829 (progress-reporter-do-update reporter value)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2830
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2831 (defun progress-reporter-do-update (reporter value)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2832 (let* ((parameters (cdr reporter))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2833 (min-value (aref parameters 1))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2834 (max-value (aref parameters 2))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2835 (one-percent (/ (- max-value min-value) 100.0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2836 (percentage (if (= max-value min-value)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2837 0
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2838 (truncate (/ (- value min-value) one-percent))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2839 (update-time (aref parameters 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2840 (current-time (float-time))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2841 (enough-time-passed
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2842 ;; See if enough time has passed since the last update.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2843 (or (not update-time)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2844 (when (>= current-time update-time)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2845 ;; Calculate time for the next update
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2846 (aset parameters 0 (+ update-time (aref parameters 5)))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2847 ;;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2848 ;; Calculate NEXT-UPDATE-VALUE. If we are not going to print
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2849 ;; message this time because not enough time has passed, then use
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2850 ;; 1 instead of MIN-CHANGE. This makes delays between echo area
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2851 ;; updates closer to MIN-TIME.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2852 (setcar reporter
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2853 (min (+ min-value (* (+ percentage
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2854 (if enough-time-passed
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2855 (aref parameters 4) ;; MIN-CHANGE
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2856 1))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2857 one-percent))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2858 max-value))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2859 (when (integerp value)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2860 (setcar reporter (ceiling (car reporter))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2861 ;;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2862 ;; Only print message if enough time has passed
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2863 (when enough-time-passed
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2864 (if (> percentage 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2865 (message "%s%d%%" (aref parameters 3) percentage)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2866 (message "%s" (aref parameters 3))))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2867
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2868 (defun progress-reporter-done (reporter)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2869 "Print reporter's message followed by word \"done\" in echo area."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2870 (message "%sdone" (aref (cdr reporter) 3)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2871
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2872 (defmacro dotimes-with-progress-reporter (spec message &rest body)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2873 "Loop a certain number of times and report progress in the echo area.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2874 Evaluate BODY with VAR bound to successive integers running from
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2875 0, inclusive, to COUNT, exclusive. Then evaluate RESULT to get
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2876 the return value (nil if RESULT is omitted).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2877
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2878 At each iteration MESSAGE followed by progress percentage is
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2879 printed in the echo area. After the loop is finished, MESSAGE
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2880 followed by word \"done\" is printed. This macro is a
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2881 convenience wrapper around `make-progress-reporter' and friends.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2882
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2883 \(fn (VAR COUNT [RESULT]) MESSAGE BODY...)"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2884 (declare (indent 2) (debug ((symbolp form &optional form) form body)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2885 (let ((temp (make-symbol "--dotimes-temp--"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2886 (temp2 (make-symbol "--dotimes-temp2--"))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2887 (start 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2888 (end (nth 1 spec)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2889 `(let ((,temp ,end)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2890 (,(car spec) ,start)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2891 (,temp2 (make-progress-reporter ,message ,start ,end)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2892 (while (< ,(car spec) ,temp)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2893 ,@body
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2894 (progress-reporter-update ,temp2
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2895 (setq ,(car spec) (1+ ,(car spec)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2896 (progress-reporter-done ,temp2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2897 nil ,@(cdr (cdr spec)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2898
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2899
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2900 ;;;; Comparing version strings.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2901
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2902 (defvar version-separator "."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2903 "*Specify the string used to separate the version elements.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2904
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2905 Usually the separator is \".\", but it can be any other string.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2906
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2907
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2908 (defvar version-regexp-alist
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2909 '(("^[-_+ ]?a\\(lpha\\)?$" . -3)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2910 ("^[-_+]$" . -3) ; treat "1.2.3-20050920" and "1.2-3" as alpha releases
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2911 ("^[-_+ ]cvs$" . -3) ; treat "1.2.3-CVS" as alpha release
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2912 ("^[-_+ ]?b\\(eta\\)?$" . -2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2913 ("^[-_+ ]?\\(pre\\|rc\\)$" . -1))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2914 "*Specify association between non-numeric version part and a priority.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2915
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2916 This association is used to handle version string like \"1.0pre2\",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2917 \"0.9alpha1\", etc. It's used by `version-to-list' (which see) to convert the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2918 non-numeric part to an integer. For example:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2919
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2920 String Version Integer List Version
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2921 \"1.0pre2\" (1 0 -1 2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2922 \"1.0PRE2\" (1 0 -1 2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2923 \"22.8beta3\" (22 8 -2 3)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2924 \"22.8 Beta3\" (22 8 -2 3)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2925 \"0.9alpha1\" (0 9 -3 1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2926 \"0.9AlphA1\" (0 9 -3 1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2927 \"0.9 alpha\" (0 9 -3)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2928
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2929 Each element has the following form:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2930
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2931 (REGEXP . PRIORITY)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2932
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2933 Where:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2934
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2935 REGEXP regexp used to match non-numeric part of a version string.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2936 It should begin with a `^' anchor and end with a `$' to
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2937 prevent false hits. Letter-case is ignored while matching
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2938 REGEXP.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2939
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2940 PRIORITY negative integer which indicate the non-numeric priority.")
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2941
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2942
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2943 (defun version-to-list (ver)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2944 "Convert version string VER into an integer list.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2945
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2946 The version syntax is given by the following EBNF:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2947
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2948 VERSION ::= NUMBER ( SEPARATOR NUMBER )*.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2949
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2950 NUMBER ::= (0|1|2|3|4|5|6|7|8|9)+.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2951
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2952 SEPARATOR ::= `version-separator' (which see)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2953 | `version-regexp-alist' (which see).
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2954
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2955 The NUMBER part is optional if SEPARATOR is a match for an element
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2956 in `version-regexp-alist'.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2957
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2958 As an example of valid version syntax:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2959
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2960 1.0pre2 1.0.7.5 22.8beta3 0.9alpha1 6.9.30Beta
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2961
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2962 As an example of invalid version syntax:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2963
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2964 1.0prepre2 1.0..7.5 22.8X3 alpha3.2 .5
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2965
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2966 As an example of version convertion:
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2967
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2968 String Version Integer List Version
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2969 \"1.0.7.5\" (1 0 7 5)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2970 \"1.0pre2\" (1 0 -1 2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2971 \"1.0PRE2\" (1 0 -1 2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2972 \"22.8beta3\" (22 8 -2 3)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2973 \"22.8Beta3\" (22 8 -2 3)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2974 \"0.9alpha1\" (0 9 -3 1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2975 \"0.9AlphA1\" (0 9 -3 1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2976 \"0.9alpha\" (0 9 -3)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2977
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2978 See documentation for `version-separator' and `version-regexp-alist'."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2979 (or (and (stringp ver) (> (length ver) 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2980 (error "Invalid version string: '%s'" ver))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2981 ;; Change .x.y to 0.x.y
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2982 (if (and (>= (length ver) (length version-separator))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2983 (string-equal (substring ver 0 (length version-separator))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2984 version-separator))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2985 (setq ver (concat "0" ver)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2986 (save-match-data
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2987 (let ((i 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2988 (case-fold-search t) ; ignore case in matching
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2989 lst s al)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2990 (while (and (setq s (string-match "[0-9]+" ver i))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2991 (= s i))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2992 ;; handle numeric part
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2993 (setq lst (cons (string-to-number (substring ver i (match-end 0)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2994 lst)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2995 i (match-end 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2996 ;; handle non-numeric part
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2997 (when (and (setq s (string-match "[^0-9]+" ver i))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2998 (= s i))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
2999 (setq s (substring ver i (match-end 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3000 i (match-end 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3001 ;; handle alpha, beta, pre, etc. separator
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3002 (unless (string= s version-separator)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3003 (setq al version-regexp-alist)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3004 (while (and al (not (string-match (caar al) s)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3005 (setq al (cdr al)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3006 (or al (error "Invalid version syntax: '%s'" ver))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3007 (setq lst (cons (cdar al) lst)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3008 (if (null lst)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3009 (error "Invalid version syntax: '%s'" ver)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3010 (nreverse lst)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3011
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3012
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3013 (defun version-list-< (l1 l2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3014 "Return t if integer list L1 is lesser than L2.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3015
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3016 Note that integer list (1) is equal to (1 0), (1 0 0), (1 0 0 0),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3017 etc. That is, the trailing zeroes are irrelevant. Also, integer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3018 list (1) is greater than (1 -1) which is greater than (1 -2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3019 which is greater than (1 -3)."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3020 (while (and l1 l2 (= (car l1) (car l2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3021 (setq l1 (cdr l1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3022 l2 (cdr l2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3023 (cond
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3024 ;; l1 not null and l2 not null
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3025 ((and l1 l2) (< (car l1) (car l2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3026 ;; l1 null and l2 null ==> l1 length = l2 length
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3027 ((and (null l1) (null l2)) nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3028 ;; l1 not null and l2 null ==> l1 length > l2 length
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3029 (l1 (< (version-list-not-zero l1) 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3030 ;; l1 null and l2 not null ==> l2 length > l1 length
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3031 (t (< 0 (version-list-not-zero l2)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3032
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3033
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3034 (defun version-list-= (l1 l2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3035 "Return t if integer list L1 is equal to L2.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3036
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3037 Note that integer list (1) is equal to (1 0), (1 0 0), (1 0 0 0),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3038 etc. That is, the trailing zeroes are irrelevant. Also, integer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3039 list (1) is greater than (1 -1) which is greater than (1 -2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3040 which is greater than (1 -3)."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3041 (while (and l1 l2 (= (car l1) (car l2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3042 (setq l1 (cdr l1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3043 l2 (cdr l2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3044 (cond
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3045 ;; l1 not null and l2 not null
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3046 ((and l1 l2) nil)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3047 ;; l1 null and l2 null ==> l1 length = l2 length
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3048 ((and (null l1) (null l2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3049 ;; l1 not null and l2 null ==> l1 length > l2 length
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3050 (l1 (zerop (version-list-not-zero l1)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3051 ;; l1 null and l2 not null ==> l2 length > l1 length
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3052 (t (zerop (version-list-not-zero l2)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3053
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3054
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3055 (defun version-list-<= (l1 l2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3056 "Return t if integer list L1 is lesser than or equal to L2.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3057
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3058 Note that integer list (1) is equal to (1 0), (1 0 0), (1 0 0 0),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3059 etc. That is, the trailing zeroes are irrelevant. Also, integer
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3060 list (1) is greater than (1 -1) which is greater than (1 -2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3061 which is greater than (1 -3)."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3062 (while (and l1 l2 (= (car l1) (car l2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3063 (setq l1 (cdr l1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3064 l2 (cdr l2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3065 (cond
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3066 ;; l1 not null and l2 not null
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3067 ((and l1 l2) (< (car l1) (car l2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3068 ;; l1 null and l2 null ==> l1 length = l2 length
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3069 ((and (null l1) (null l2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3070 ;; l1 not null and l2 null ==> l1 length > l2 length
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3071 (l1 (<= (version-list-not-zero l1) 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3072 ;; l1 null and l2 not null ==> l2 length > l1 length
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3073 (t (<= 0 (version-list-not-zero l2)))))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3074
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3075 (defun version-list-not-zero (lst)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3076 "Return the first non-zero element of integer list LST.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3077
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3078 If all LST elements are zeroes or LST is nil, return zero."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3079 (while (and lst (zerop (car lst)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3080 (setq lst (cdr lst)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3081 (if lst
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3082 (car lst)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3083 ;; there is no element different of zero
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3084 0))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3085
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3086
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3087 (defun version< (v1 v2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3088 "Return t if version V1 is lesser than V2.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3089
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3090 Note that version string \"1\" is equal to \"1.0\", \"1.0.0\", \"1.0.0.0\",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3091 etc. That is, the trailing \".0\"s are irrelevant. Also, version string \"1\"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3092 is greater than \"1pre\" which is greater than \"1beta\" which is greater than
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3093 \"1alpha\"."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3094 (version-list-< (version-to-list v1) (version-to-list v2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3095
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3096
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3097 (defun version<= (v1 v2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3098 "Return t if version V1 is lesser than or equal to V2.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3099
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3100 Note that version string \"1\" is equal to \"1.0\", \"1.0.0\", \"1.0.0.0\",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3101 etc. That is, the trailing \".0\"s are irrelevant. Also, version string \"1\"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3102 is greater than \"1pre\" which is greater than \"1beta\" which is greater than
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3103 \"1alpha\"."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3104 (version-list-<= (version-to-list v1) (version-to-list v2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3105
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3106 (defun version= (v1 v2)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3107 "Return t if version V1 is equal to V2.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3108
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3109 Note that version string \"1\" is equal to \"1.0\", \"1.0.0\", \"1.0.0.0\",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3110 etc. That is, the trailing \".0\"s are irrelevant. Also, version string \"1\"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3111 is greater than \"1pre\" which is greater than \"1beta\" which is greater than
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3112 \"1alpha\"."
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3113 (version-list-= (version-to-list v1) (version-to-list v2)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3114
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3115
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3116
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49597
diff changeset
3117 ;; arch-tag: f7e0e6e5-70aa-4897-ae72-7a3511ec40bc
787
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 779
diff changeset
3118 ;;; subr.el ends here