annotate lisp/extents.el @ 5753:dbd8305e13cb

Warn about non-string non-integer ARG to #'gensym, bytecomp.el. lisp/ChangeLog addition: 2013-08-21 Aidan Kehoe <kehoea@parhasard.net> * bytecomp.el: * bytecomp.el (gensym): * bytecomp.el (byte-compile-gensym): New. Warn that gensym called in a for-effect context is unlikely to be useful. Warn about non-string non-integer ARGs, this is incorrect. Am not changing the function to error with same, most code that makes the mistake is has no problems, which is why it has survived so long. * window-xemacs.el (save-window-excursion/mapping): * window.el (save-window-excursion): Call #'gensym with a string, not a symbol.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 21 Aug 2013 19:02:59 +0100
parents 308d34e9f07d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; extents.el --- miscellaneous extent functions not written in C
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1993-4, 1997 Free Software Foundation, Inc.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
4 ;; Copyright (C) 2000 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 ;; Keywords: internal, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5264
diff changeset
10 ;; XEmacs is free software: you can redistribute it and/or modify it
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5264
diff changeset
11 ;; under the terms of the GNU General Public License as published by the
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5264
diff changeset
12 ;; Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5264
diff changeset
13 ;; option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5264
diff changeset
15 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5264
diff changeset
16 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5264
diff changeset
17 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5264
diff changeset
18 ;; for more details.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5264
diff changeset
21 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 ;;; Synched up with: Not in FSF.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
27 ;;; Authorship:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
28
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
29 ;; Created 1995 Ben Wing.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
30 ;; mapcar-extents (and extent-list?) from stig@hackvan.com, c. 1996.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;; an alternative to map-extents.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 (defun mapcar-extents (function &optional predicate buffer-or-string from to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 flags property value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 "Apply FUNCTION to all extents which overlap a region in BUFFER-OR-STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 The region is delimited by FROM and TO. FUNCTION is called with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 one argument, the extent. A list of the values returned by FUNCTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 is returned. An optional PREDICATE may be used to further limit the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 extents over which FUNCTION is mapped. The optional arguments FLAGS,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 PROPERTY, and VALUE may also be used to control the extents passed to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 PREDICATE or FUNCTION. See also `map-extents'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 (let (*result*)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 (map-extents (if predicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 #'(lambda (ex junk)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 (and (funcall predicate ex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 (setq *result* (cons (funcall function ex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 *result*)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 #'(lambda (ex junk)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 (setq *result* (cons (funcall function ex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 *result*))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 buffer-or-string from to nil flags property value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 (nreverse *result*)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
58 (defun extent-list (&optional buffer-or-string from to flags property value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 "Return a list of the extents in BUFFER-OR-STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 BUFFER-OR-STRING defaults to the current buffer if omitted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 FROM and TO can be used to limit the range over which extents are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 returned; if omitted, all extents in the buffer or string are returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 More specifically, if a range is specified using FROM and TO, only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 extents that overlap the range (i.e. begin or end inside of the range)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 are included in the list. FROM and TO default to the beginning and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 end of BUFFER-OR-STRING, respectively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 FLAGS controls how end cases are treated. For a discussion of this,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
70 and exactly what ``overlap'' means, see `map-extents'. PROPERTY and VALUE
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
71 are also as in `map-extents'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 If you want to map a function over the extents in a buffer or string,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
74 consider using `map-extents' or `mapcar-extents' instead.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
75
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
76 See also `extents-at'."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
77 (mapcar-extents 'identity nil buffer-or-string from to flags property value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
78
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
79 (defun extent-at-event (event &optional property before at-flag)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
80 "Return the smallest extent under EVENT, if any.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
81 PROPERTY, BEFORE, and AT-FLAG are as in `extent-at'."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
82 (let* ((win (event-window event))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
83 (p (event-point event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
84 (and win p (extent-at p (window-buffer win) property before at-flag))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
85
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
86 (defun extents-at-event (event &optional property before at-flag)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
87 "Return a list of all extents under EVENT.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
88 PROPERTY, BEFORE, and AT-FLAG are as in `extent-at'."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
89 (let* ((win (event-window event))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
90 (p (event-point event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
91 (and win p (extents-at p (window-buffer win) property before at-flag))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 (defun extent-string (extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 "Return the string delimited by the bounds of EXTENT."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 (let ((object (extent-object extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 (if (bufferp object)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 (buffer-substring (extent-start-position extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 (extent-end-position extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 object)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 (substring object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 (extent-start-position extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 (extent-end-position extent)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 (defun extent-descendants (extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 "Return a list of all descendants of EXTENT, including EXTENT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 This recursively applies `extent-children' to any children of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 EXTENT, until no more children can be found."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 (let ((children (extent-children extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 (if children
5264
0d43872986b6 Change (apply 'nconc (mapcar ...)) to (mapcan ...); warn about first form.
Aidan Kehoe <kehoea@parhasard.net>
parents: 442
diff changeset
110 (mapcan 'extent-descendants children)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 (list extent))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 (defun set-extent-keymap (extent keymap)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 "Set EXTENT's `keymap' property to KEYMAP."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 (set-extent-property extent 'keymap keymap))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 (defun extent-keymap (extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 "Return EXTENT's `keymap' property."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 (extent-property extent 'keymap))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 ;;; extents.el ends here