annotate lisp/emacs-lisp/re-builder.el @ 72863:526dc1f36b09

(produce_image_glyph): Automatically crop wide images at right window edge so we can draw the cursor on the same row to avoid confusing redisplay by placing the cursor outside the visible window area.
author Kim F. Storm <storm@cua.dk>
date Thu, 14 Sep 2006 09:37:44 +0000
parents ce092da13632
children 5aa08f9f45e5 146cd8369025
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 36012
diff changeset
1 ;;; re-builder.el --- building Regexps with visual feedback
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2
64751
5b1a238fcbb4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64624
diff changeset
3 ;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
68648
067115a6e738 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64751
diff changeset
4 ;; 2005, 2006 Free Software Foundation, Inc.
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
5
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
6 ;; Author: Detlev Zundel <dzu@gnu.org>
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
7 ;; Keywords: matching, lisp, tools
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
8
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
10
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
14 ;; any later version.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
15
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
20
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64085
18a818a2ee7c Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62757
diff changeset
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18a818a2ee7c Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62757
diff changeset
24 ;; Boston, MA 02110-1301, USA.
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
25
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
26 ;;; Commentary:
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
27
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
28 ;; When I have to come up with regular expressions that are more
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
29 ;; complex than simple string matchers, especially if they contain sub
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30 ;; expressions, I find myself spending quite some time in the
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
31 ;; `development cycle'. `re-builder' aims to shorten this time span
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
32 ;; so I can get on with the more interesting bits.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
33
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
34 ;; With it you can have immediate visual feedback about how well the
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
35 ;; regexp behaves to your expectations on the intended data.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
36
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
37 ;; When called up `re-builder' attaches itself to the current buffer
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
38 ;; which becomes its target buffer, where all the matching is done.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
39 ;; The active window is split so you have a view on the data while
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
40 ;; authoring the RE. If the edited expression is valid the matches in
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
41 ;; the target buffer are marked automatically with colored overlays
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
42 ;; (for non-color displays see below) giving you feedback over the
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
43 ;; extents of the matched (sub) expressions. The (non-)validity is
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
44 ;; shown only in the modeline without throwing the errors at you. If
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
45 ;; you want to know the reason why RE Builder considers it as invalid
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
46 ;; call `reb-force-update' ("\C-c\C-u") which should reveal the error.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
47
41313
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
48 ;; The target buffer can be changed with `reb-change-target-buffer'
56698
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
49 ;; ("\C-c\C-b"). Changing the target buffer automatically removes
41313
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
50 ;; the overlays from the old buffer and displays the new one in the
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
51 ;; target window.
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
52
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
53 ;; The `re-builder' keeps the focus while updating the matches in the
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
54 ;; target buffer so corrections are easy to incorporate. If you are
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
55 ;; satisfied with the result you can paste the RE to the kill-ring
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
56 ;; with `reb-copy' ("\C-c\C-w"), quit the `re-builder' ("\C-c\C-q")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
57 ;; and use it wherever you need it.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
58
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
59 ;; As the automatic updates can take some time on large buffers, they
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
60 ;; can be limited by `reb-auto-match-limit' so that they should not
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
61 ;; have a negative impact on the editing. Setting it to nil makes
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
62 ;; even the auto updates go all the way. Forcing an update overrides
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
63 ;; this limit allowing an easy way to see all matches.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
64
59396
1c58b91ca0df Update copyright. Update commentary to mention rx syntax support.
John Paul Wallington <jpw@pobox.com>
parents: 56698
diff changeset
65 ;; Currently `re-builder' understands five different forms of input,
1c58b91ca0df Update copyright. Update commentary to mention rx syntax support.
John Paul Wallington <jpw@pobox.com>
parents: 56698
diff changeset
66 ;; namely `read', `string', `rx', `sregex' and `lisp-re' syntax. Read
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
67 ;; syntax and string syntax are both delimited by `"'s and behave
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
68 ;; according to their name. With the `string' syntax there's no need
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
69 ;; to escape the backslashes and double quotes simplifying the editing
59396
1c58b91ca0df Update copyright. Update commentary to mention rx syntax support.
John Paul Wallington <jpw@pobox.com>
parents: 56698
diff changeset
70 ;; somewhat. The other three allow editing of symbolic regular
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
71 ;; expressions supported by the packages of the same name. (`lisp-re'
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
72 ;; is a package by me and its support may go away as it is nearly the
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
73 ;; same as the `sregex' package in Emacs)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
74
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
75 ;; Editing symbolic expressions is done through a major mode derived
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
76 ;; from `emacs-lisp-mode' so you'll get all the good stuff like
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
77 ;; automatic indentation and font-locking etc.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
78
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
79 ;; When editing a symbolic regular expression, only the first
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
80 ;; expression in the RE Builder buffer is considered, which helps
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
81 ;; limiting the extent of the expression like the `"'s do for the text
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
82 ;; modes. For the `sregex' syntax the function `sregex' is applied to
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
83 ;; the evaluated expression read. So you can use quoted arguments
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
84 ;; with something like '("findme") or you can construct arguments to
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
85 ;; your hearts delight with a valid ELisp expression. (The compiled
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86 ;; string form will be copied by `reb-copy') If you want to take
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
87 ;; a glance at the corresponding string you can temporarily change the
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88 ;; input syntax.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
89
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
90 ;; Changing the input syntax is transparent (for the obvious exception
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
91 ;; non-symbolic -> symbolic) so you can change your mind as often as
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
92 ;; you like.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
93
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
94 ;; There is also a shortcut function for toggling the
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
95 ;; `case-fold-search' variable in the target buffer with an immediate
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
96 ;; update.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
97
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
99 ;; Q: But what if my display cannot show colored overlays?
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
100 ;; A: Then the cursor will flash around the matched text making it stand
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
101 ;; out.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
102
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
103 ;; Q: But how can I then make out the sub-expressions?
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
104 ;; A: Thats where the `sub-expression mode' comes in. In it only the
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
105 ;; digit keys are assigned to perform an update that will flash the
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
106 ;; corresponding subexp only.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
107
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
109 ;;; Code:
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
110
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
111 ;; On XEmacs, load the overlay compatibility library
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
112 (if (not (fboundp 'make-overlay))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
113 (require 'overlay))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
114
70404
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
115 ;; User customizable variables
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
116 (defgroup re-builder nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
117 "Options for the RE Builder."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
118 :group 'lisp
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
119 :prefix "reb-")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
120
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
121 (defcustom reb-blink-delay 0.5
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
122 "*Seconds to blink cursor for next/previous match in RE Builder."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
123 :group 're-builder
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
124 :type 'number)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
125
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
126 (defcustom reb-mode-hook nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
127 "*Hooks to run on entering RE Builder mode."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
128 :group 're-builder
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
129 :type 'hook)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
130
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
131 (defcustom reb-re-syntax 'read
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
132 "*Syntax for the REs in the RE Builder.
28097
5d7390b72a44 (reb-re-syntax): Fix typo in `:type'. Fix comment.
Gerd Moellmann <gerd@gnu.org>
parents: 28077
diff changeset
133 Can either be `read', `string', `sregex' or `lisp-re'."
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
134 :group 're-builder
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
135 :type '(choice (const :tag "Read syntax" read)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
136 (const :tag "String syntax" string)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
137 (const :tag "`sregex' syntax" sregex)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
138 (const :tag "`lisp-re' syntax" lisp-re)
56611
8b14a3e64595 (reb-re-syntax): Add `rx' syntax.
John Paul Wallington <jpw@pobox.com>
parents: 56382
diff changeset
139 (const :tag "`rx' syntax" rx)
28097
5d7390b72a44 (reb-re-syntax): Fix typo in `:type'. Fix comment.
Gerd Moellmann <gerd@gnu.org>
parents: 28077
diff changeset
140 (value: string)))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
141
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
142 (defcustom reb-auto-match-limit 200
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
143 "*Positive integer limiting the matches for RE Builder auto updates.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
144 Set it to nil if you don't want limits here."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
145 :group 're-builder
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
146 :type '(restricted-sexp :match-alternatives
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
147 (integerp 'nil)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
148
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
149
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
150 (defface reb-match-0
41371
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
151 '((((class color) (background light))
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
152 :background "lightblue")
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
153 (((class color) (background dark))
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
154 :background "steelblue4")
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
155 (t
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
156 :inverse-video t))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
157 "Used for displaying the whole match."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
158 :group 're-builder)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
159
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
160 (defface reb-match-1
41371
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
161 '((((class color) (background light))
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
162 :background "aquamarine")
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
163 (((class color) (background dark))
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
164 :background "blue3")
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
165 (t
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
166 :inverse-video t))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
167 "Used for displaying the first matching subexpression."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
168 :group 're-builder)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
169
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
170 (defface reb-match-2
41371
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
171 '((((class color) (background light))
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
172 :background "springgreen")
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
173 (((class color) (background dark))
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
174 :background "chartreuse4")
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
175 (t
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
176 :inverse-video t))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
177 "Used for displaying the second matching subexpression."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
178 :group 're-builder)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
179
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
180 (defface reb-match-3
61394
31aa9a390538 * mh-customize.el (mh-speedbar-selected-folder-face): Special case
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60282
diff changeset
181 '((((min-colors 88) (class color) (background light))
31aa9a390538 * mh-customize.el (mh-speedbar-selected-folder-face): Special case
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60282
diff changeset
182 :background "yellow1")
31aa9a390538 * mh-customize.el (mh-speedbar-selected-folder-face): Special case
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60282
diff changeset
183 (((class color) (background light))
41371
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
184 :background "yellow")
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
185 (((class color) (background dark))
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
186 :background "sienna4")
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
187 (t
d99daedf49db (reb-match-0, reb-match-1)
Miles Bader <miles@gnu.org>
parents: 41333
diff changeset
188 :inverse-video t))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
189 "Used for displaying the third matching subexpression."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
190 :group 're-builder)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
191
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
192 ;; Internal variables below
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
193 (defvar reb-mode nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
194 "Enables the RE Builder minor mode.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
195
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
196 (defvar reb-target-buffer nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
197 "Buffer to which the RE is applied to.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
198
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
199 (defvar reb-target-window nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
200 "Window to which the RE is applied to.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
201
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
202 (defvar reb-regexp nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
203 "Last regexp used by RE Builder.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
204
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
205 (defvar reb-regexp-src nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
206 "Last regexp used by RE Builder before processing it.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
207 Except for Lisp syntax this is the same as `reb-regexp'.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
208
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
209 (defvar reb-overlays nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
210 "List of overlays of the RE Builder.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
211
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
212 (defvar reb-window-config nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
213 "Old window configuration.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
214
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
215 (defvar reb-subexp-mode nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
216 "Indicates whether sub-exp mode is active.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
217
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
218 (defvar reb-subexp-displayed nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
219 "Indicates which sub-exp is active.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
220
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
221 (defvar reb-mode-string ""
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
222 "String in mode line for additional info.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
223
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
224 (defvar reb-valid-string ""
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
225 "String in mode line showing validity of RE.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
226
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
227 (make-variable-buffer-local 'reb-overlays)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
228 (make-variable-buffer-local 'reb-regexp)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
229 (make-variable-buffer-local 'reb-regexp-src)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
230
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
231 (defconst reb-buffer "*RE-Builder*"
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
232 "Buffer to use for the RE Builder.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
233
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
234 ;; Define the local "\C-c" keymap
56698
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
235 (defvar reb-mode-map
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
236 (let ((map (make-sparse-keymap)))
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
237 (define-key map "\C-c\C-c" 'reb-toggle-case)
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
238 (define-key map "\C-c\C-q" 'reb-quit)
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
239 (define-key map "\C-c\C-w" 'reb-copy)
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
240 (define-key map "\C-c\C-s" 'reb-next-match)
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
241 (define-key map "\C-c\C-r" 'reb-prev-match)
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
242 (define-key map "\C-c\C-i" 'reb-change-syntax)
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
243 (define-key map "\C-c\C-e" 'reb-enter-subexp-mode)
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
244 (define-key map "\C-c\C-b" 'reb-change-target-buffer)
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
245 (define-key map "\C-c\C-u" 'reb-force-update)
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
246 map)
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
247 "Keymap used by the RE Builder.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
248
41333
fcb2aaafc8b2 (reb-mode): Don't use define-derived-mode. Call kill-all-local-variables.
Richard M. Stallman <rms@gnu.org>
parents: 41314
diff changeset
249 (defun reb-mode ()
fcb2aaafc8b2 (reb-mode): Don't use define-derived-mode. Call kill-all-local-variables.
Richard M. Stallman <rms@gnu.org>
parents: 41314
diff changeset
250 "Major mode for interactively building Regular Expressions.
fcb2aaafc8b2 (reb-mode): Don't use define-derived-mode. Call kill-all-local-variables.
Richard M. Stallman <rms@gnu.org>
parents: 41314
diff changeset
251 \\{reb-mode-map}"
fcb2aaafc8b2 (reb-mode): Don't use define-derived-mode. Call kill-all-local-variables.
Richard M. Stallman <rms@gnu.org>
parents: 41314
diff changeset
252 (interactive)
fcb2aaafc8b2 (reb-mode): Don't use define-derived-mode. Call kill-all-local-variables.
Richard M. Stallman <rms@gnu.org>
parents: 41314
diff changeset
253 (kill-all-local-variables)
fcb2aaafc8b2 (reb-mode): Don't use define-derived-mode. Call kill-all-local-variables.
Richard M. Stallman <rms@gnu.org>
parents: 41314
diff changeset
254 (setq major-mode 'reb-mode
fcb2aaafc8b2 (reb-mode): Don't use define-derived-mode. Call kill-all-local-variables.
Richard M. Stallman <rms@gnu.org>
parents: 41314
diff changeset
255 mode-name "RE Builder")
fcb2aaafc8b2 (reb-mode): Don't use define-derived-mode. Call kill-all-local-variables.
Richard M. Stallman <rms@gnu.org>
parents: 41314
diff changeset
256 (use-local-map reb-mode-map)
fcb2aaafc8b2 (reb-mode): Don't use define-derived-mode. Call kill-all-local-variables.
Richard M. Stallman <rms@gnu.org>
parents: 41314
diff changeset
257 (reb-mode-common)
62757
0c94929d0a7d (reb-mode): Use run-mode-hooks.
Lute Kamstra <lute@gnu.org>
parents: 62402
diff changeset
258 (run-mode-hooks 'reb-mode-hook))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
259
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
260 (define-derived-mode reb-lisp-mode
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
261 emacs-lisp-mode "RE Builder Lisp"
41225
74219f3013c6 (reb-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
262 "Major mode for interactively building symbolic Regular Expressions."
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
263 (cond ((eq reb-re-syntax 'lisp-re) ; Pull in packages
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
264 (require 'lisp-re)) ; as needed
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
265 ((eq reb-re-syntax 'sregex) ; sregex is not autoloaded
56611
8b14a3e64595 (reb-re-syntax): Add `rx' syntax.
John Paul Wallington <jpw@pobox.com>
parents: 56382
diff changeset
266 (require 'sregex)) ; right now..
8b14a3e64595 (reb-re-syntax): Add `rx' syntax.
John Paul Wallington <jpw@pobox.com>
parents: 56382
diff changeset
267 ((eq reb-re-syntax 'rx) ; rx-to-string is autoloaded
8b14a3e64595 (reb-re-syntax): Add `rx' syntax.
John Paul Wallington <jpw@pobox.com>
parents: 56382
diff changeset
268 (require 'rx))) ; require rx anyway
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
269 (reb-mode-common))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
270
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
271 ;; Use the same "\C-c" keymap as `reb-mode' and use font-locking from
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
272 ;; `emacs-lisp-mode'
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
273 (define-key reb-lisp-mode-map "\C-c"
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
274 (lookup-key reb-mode-map "\C-c"))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
275
49598
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48379
diff changeset
276 (defvar reb-subexp-mode-map
41225
74219f3013c6 (reb-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
277 (let ((m (make-keymap)))
74219f3013c6 (reb-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
278 (suppress-keymap m)
74219f3013c6 (reb-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
279 ;; Again share the "\C-c" keymap for the commands
74219f3013c6 (reb-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
280 (define-key m "\C-c" (lookup-key reb-mode-map "\C-c"))
74219f3013c6 (reb-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
281 (define-key m "q" 'reb-quit-subexp-mode)
74219f3013c6 (reb-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
282 (dotimes (digit 10)
74219f3013c6 (reb-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
283 (define-key m (int-to-string digit) 'reb-display-subexp))
74219f3013c6 (reb-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
284 m)
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
285 "Keymap used by the RE Builder for the subexpression mode.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
286
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
287 (defun reb-mode-common ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
288 "Setup functions common to functions `reb-mode' and `reb-mode-lisp'."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
289
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
290 (setq reb-mode-string ""
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
291 reb-valid-string ""
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
292 mode-line-buffer-identification
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
293 '(25 . ("%b" reb-mode-string reb-valid-string)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
294 (reb-update-modestring)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
295 (make-local-variable 'after-change-functions)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
296 (add-hook 'after-change-functions
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
297 'reb-auto-update)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
298 ;; At least make the overlays go away if the buffer is killed
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
299 (make-local-variable 'reb-kill-buffer)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
300 (add-hook 'kill-buffer-hook 'reb-kill-buffer)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
301 (reb-auto-update nil nil nil))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
302
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
303 (defun reb-color-display-p ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
304 "Return t if display is capable of displaying colors."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
305 (eq 'color
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
306 ;; emacs/xemacs compatibility
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
307 (if (fboundp 'frame-parameter)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
308 (frame-parameter (selected-frame) 'display-type)
64382
c16c027014c6 (reb-cook-regexp): Avoid warning calling lre-compile-string.
Richard M. Stallman <rms@gnu.org>
parents: 64085
diff changeset
309 (if (fboundp 'frame-property)
c16c027014c6 (reb-cook-regexp): Avoid warning calling lre-compile-string.
Richard M. Stallman <rms@gnu.org>
parents: 64085
diff changeset
310 (frame-property (selected-frame) 'display-type)))))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
311
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
312 (defsubst reb-lisp-syntax-p ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
313 "Return non-nil if RE Builder uses a Lisp syntax."
56611
8b14a3e64595 (reb-re-syntax): Add `rx' syntax.
John Paul Wallington <jpw@pobox.com>
parents: 56382
diff changeset
314 (memq reb-re-syntax '(lisp-re sregex rx)))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
315
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
316 (defmacro reb-target-binding (symbol)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
317 "Return binding for SYMBOL in the RE Builder target buffer."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
318 `(with-current-buffer reb-target-buffer ,symbol))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
319
64624
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
320 (defun reb-initialize-buffer ()
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
321 "Initialize the current buffer as a RE Builder buffer."
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
322 (erase-buffer)
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
323 (reb-insert-regexp)
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
324 (goto-char (+ 2 (point-min)))
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
325 (cond ((reb-lisp-syntax-p)
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
326 (reb-lisp-mode))
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
327 (t (reb-mode))))
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
328
60282
b6fcc94c2d6a (regexp-builder): New function.
Richard M. Stallman <rms@gnu.org>
parents: 59396
diff changeset
329 ;;; This is to help people find this in Apropos.
b6fcc94c2d6a (regexp-builder): New function.
Richard M. Stallman <rms@gnu.org>
parents: 59396
diff changeset
330 ;;;###autoload
64557
c68bf82df188 (regexp-builder): Use `defalias' instead of faking it.
Juanma Barranquero <lekktu@gmail.com>
parents: 64382
diff changeset
331 (defalias 'regexp-builder 're-builder)
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
332
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
333 ;;;###autoload
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
334 (defun re-builder ()
60282
b6fcc94c2d6a (regexp-builder): New function.
Richard M. Stallman <rms@gnu.org>
parents: 59396
diff changeset
335 "Construct a regexp interactively."
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
336 (interactive)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
337
41314
a2bce9d9c349 (re-builder): Don't re-enter RE Builder Mode.
Eli Zaretskii <eliz@gnu.org>
parents: 41313
diff changeset
338 (if (and (string= (buffer-name) reb-buffer)
a2bce9d9c349 (re-builder): Don't re-enter RE Builder Mode.
Eli Zaretskii <eliz@gnu.org>
parents: 41313
diff changeset
339 (memq major-mode '(reb-mode reb-lisp-mode)))
a2bce9d9c349 (re-builder): Don't re-enter RE Builder Mode.
Eli Zaretskii <eliz@gnu.org>
parents: 41313
diff changeset
340 (message "Already in the RE Builder")
a2bce9d9c349 (re-builder): Don't re-enter RE Builder Mode.
Eli Zaretskii <eliz@gnu.org>
parents: 41313
diff changeset
341 (if reb-target-buffer
a2bce9d9c349 (re-builder): Don't re-enter RE Builder Mode.
Eli Zaretskii <eliz@gnu.org>
parents: 41313
diff changeset
342 (reb-delete-overlays))
a2bce9d9c349 (re-builder): Don't re-enter RE Builder Mode.
Eli Zaretskii <eliz@gnu.org>
parents: 41313
diff changeset
343 (setq reb-target-buffer (current-buffer)
a2bce9d9c349 (re-builder): Don't re-enter RE Builder Mode.
Eli Zaretskii <eliz@gnu.org>
parents: 41313
diff changeset
344 reb-target-window (selected-window)
a2bce9d9c349 (re-builder): Don't re-enter RE Builder Mode.
Eli Zaretskii <eliz@gnu.org>
parents: 41313
diff changeset
345 reb-window-config (current-window-configuration))
a2bce9d9c349 (re-builder): Don't re-enter RE Builder Mode.
Eli Zaretskii <eliz@gnu.org>
parents: 41313
diff changeset
346 (select-window (split-window (selected-window) (- (window-height) 4)))
a2bce9d9c349 (re-builder): Don't re-enter RE Builder Mode.
Eli Zaretskii <eliz@gnu.org>
parents: 41313
diff changeset
347 (switch-to-buffer (get-buffer-create reb-buffer))
64624
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
348 (reb-initialize-buffer)))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
349
41313
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
350 (defun reb-change-target-buffer (buf)
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
351 "Change the target buffer and display it in the target window."
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
352 (interactive "bSet target buffer to: ")
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
353
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
354 (let ((buffer (get-buffer buf)))
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
355 (if (not buffer)
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
356 (error "No such buffer")
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
357 (reb-delete-overlays)
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
358 (setq reb-target-buffer buffer)
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
359 (reb-do-update
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
360 (if reb-subexp-mode reb-subexp-displayed nil))
2186cf9476ba (reb-change-target-buffer): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 41225
diff changeset
361 (reb-update-modestring))))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
362
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
363 (defun reb-force-update ()
56698
7dbbaf3dc171 (reb-mode-map): Define within defvar.
John Paul Wallington <jpw@pobox.com>
parents: 56611
diff changeset
364 "Force an update in the RE Builder target window without a match limit."
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
365 (interactive)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
366
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
367 (let ((reb-auto-match-limit nil))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
368 (reb-update-overlays
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
369 (if reb-subexp-mode reb-subexp-displayed nil))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
370
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
371 (defun reb-quit ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
372 "Quit the RE Builder mode."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
373 (interactive)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
374
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
375 (setq reb-subexp-mode nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
376 reb-subexp-displayed nil)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
377 (reb-delete-overlays)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
378 (bury-buffer)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
379 (set-window-configuration reb-window-config))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
380
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
381 (defun reb-next-match ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
382 "Go to next match in the RE Builder target window."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
383 (interactive)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
384
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
385 (reb-assert-buffer-in-window)
64624
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
386 (with-selected-window reb-target-window
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
387 (if (not (re-search-forward reb-regexp (point-max) t))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
388 (message "No more matches.")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
389 (reb-show-subexp
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
390 (or (and reb-subexp-mode reb-subexp-displayed) 0)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
391 t))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
392
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
393 (defun reb-prev-match ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
394 "Go to previous match in the RE Builder target window."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
395 (interactive)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
396
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
397 (reb-assert-buffer-in-window)
64624
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
398 (with-selected-window reb-target-window
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
399 (let ((p (point)))
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
400 (goto-char (1- p))
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
401 (if (re-search-backward reb-regexp (point-min) t)
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
402 (reb-show-subexp
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
403 (or (and reb-subexp-mode reb-subexp-displayed) 0)
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
404 t)
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
405 (goto-char p)
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
406 (message "No more matches.")))))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
407
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
408 (defun reb-toggle-case ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
409 "Toggle case sensitivity of searches for RE Builder target buffer."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
410 (interactive)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
411
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
412 (with-current-buffer reb-target-buffer
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
413 (setq case-fold-search (not case-fold-search)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
414 (reb-update-modestring)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
415 (reb-auto-update nil nil nil t))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
416
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
417 (defun reb-copy ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
418 "Copy current RE into the kill ring for later insertion."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
419 (interactive)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
420
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
421 (reb-update-regexp)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
422 (let ((re (with-output-to-string
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
423 (print (reb-target-binding reb-regexp)))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
424 (kill-new (substring re 1 (1- (length re))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
425 (message "Regexp copied to kill-ring")))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
426
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
427 ;; The subexpression mode is not electric because the number of
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
428 ;; matches should be seen rather than a prompt.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
429 (defun reb-enter-subexp-mode ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
430 "Enter the subexpression mode in the RE Builder."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
431 (interactive)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
432 (setq reb-subexp-mode t)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
433 (reb-update-modestring)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
434 (use-local-map reb-subexp-mode-map)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
435 (message "`0'-`9' to display subexpressions `q' to quit subexp mode."))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
436
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
437 (defun reb-show-subexp (subexp &optional pause)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
438 "Visually show limit of subexpression SUBEXP of recent search.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
439 On color displays this just puts point to the end of the expression as
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
440 the match should already be marked by an overlay.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
441 On other displays jump to the beginning and the end of it.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
442 If the optional PAUSE is non-nil then pause at the end in any case."
64624
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
443 (with-selected-window reb-target-window
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
444 (if (not (reb-color-display-p))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
445 (progn (goto-char (match-beginning subexp))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
446 (sit-for reb-blink-delay)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
447 (goto-char (match-end subexp))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
448 (if (or (not (reb-color-display-p)) pause)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
449 (sit-for reb-blink-delay))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
450
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
451 (defun reb-quit-subexp-mode ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
452 "Quit the subexpression mode in the RE Builder."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
453 (interactive)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
454 (setq reb-subexp-mode nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
455 reb-subexp-displayed nil)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
456 (reb-update-modestring)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
457 (use-local-map reb-mode-map)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
458 (reb-do-update))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
459
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
460 (defun reb-change-syntax (&optional syntax)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
461 "Change the syntax used by the RE Builder.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
462 Optional argument SYNTAX must be specified if called non-interactively."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
463 (interactive
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
464 (list (intern
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
465 (completing-read "Select syntax: "
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
466 (mapcar (lambda (el) (cons (symbol-name el) 1))
56611
8b14a3e64595 (reb-re-syntax): Add `rx' syntax.
John Paul Wallington <jpw@pobox.com>
parents: 56382
diff changeset
467 '(read string lisp-re sregex rx))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
468 nil t (symbol-name reb-re-syntax)))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
469
56611
8b14a3e64595 (reb-re-syntax): Add `rx' syntax.
John Paul Wallington <jpw@pobox.com>
parents: 56382
diff changeset
470 (if (memq syntax '(read string lisp-re sregex rx))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
471 (let ((buffer (get-buffer reb-buffer)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
472 (setq reb-re-syntax syntax)
64624
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
473 (when buffer
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
474 (with-current-buffer buffer
c3a907cbd503 (reb-with-current-window): Delete.
Juanma Barranquero <lekktu@gmail.com>
parents: 64557
diff changeset
475 (reb-initialize-buffer))))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
476 (error "Invalid syntax: %s" syntax)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
477
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
478
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
479 ;; Non-interactive functions below
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
480 (defun reb-do-update (&optional subexp)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
481 "Update matches in the RE Builder target window.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
482 If SUBEXP is non-nil mark only the corresponding sub-expressions."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
483
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
484 (reb-assert-buffer-in-window)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
485 (reb-update-regexp)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
486 (reb-update-overlays subexp))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
487
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
488 (defun reb-auto-update (beg end lenold &optional force)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
489 "Called from `after-update-functions' to update the display.
55404
14a47b65c288 (reb-auto-update): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 52401
diff changeset
490 BEG, END and LENOLD are passed in from the hook.
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
491 An actual update is only done if the regexp has changed or if the
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
492 optional fourth argument FORCE is non-nil."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
493 (let ((prev-valid reb-valid-string)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
494 (new-valid
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
495 (condition-case nil
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
496 (progn
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
497 (if (or (reb-update-regexp) force)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
498 (progn
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
499 (reb-assert-buffer-in-window)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
500 (reb-do-update)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
501 "")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
502 (error " *invalid*"))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
503 (setq reb-valid-string new-valid)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
504 (force-mode-line-update)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
505
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
506 ;; Through the caching of the re a change invalidating the syntax
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
507 ;; for symbolic expressions will not delete the overlays so we
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
508 ;; catch it here
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
509 (if (and (reb-lisp-syntax-p)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
510 (not (string= prev-valid new-valid))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
511 (string= prev-valid ""))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
512 (reb-delete-overlays))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
513
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
514 (defun reb-delete-overlays ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
515 "Delete all RE Builder overlays in the `reb-target-buffer' buffer."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
516 (if (buffer-live-p reb-target-buffer)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
517 (with-current-buffer reb-target-buffer
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
518 (mapcar 'delete-overlay reb-overlays)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
519 (setq reb-overlays nil))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
520
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
521 (defun reb-assert-buffer-in-window ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
522 "Assert that `reb-target-buffer' is displayed in `reb-target-window'."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
523
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
524 (if (not (eq reb-target-buffer (window-buffer reb-target-window)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
525 (set-window-buffer reb-target-window reb-target-buffer)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
526
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
527 (defun reb-update-modestring ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
528 "Update the variable `reb-mode-string' displayed in the mode line."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
529 (setq reb-mode-string
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
530 (concat
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
531 (if reb-subexp-mode
35756
8a4490cbee15 (reb-update-modestring): Don't use concat for integers.
Eli Zaretskii <eliz@gnu.org>
parents: 28107
diff changeset
532 (format " (subexp %s)" (or reb-subexp-displayed "-"))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
533 "")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
534 (if (not (reb-target-binding case-fold-search))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
535 " Case"
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
536 "")))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
537 (force-mode-line-update))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
538
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
539 (defun reb-display-subexp (&optional subexp)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
540 "Highlight only subexpression SUBEXP in the RE Builder."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
541 (interactive)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
542
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
543 (setq reb-subexp-displayed
62402
a7e02ef1e3d6 Replace `string-to-int' by `string-to-number'.
Juanma Barranquero <lekktu@gmail.com>
parents: 61394
diff changeset
544 (or subexp (string-to-number (format "%c" last-command-char))))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
545 (reb-update-modestring)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
546 (reb-do-update reb-subexp-displayed))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
547
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
548 (defun reb-kill-buffer ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
549 "When the RE Builder buffer is killed make sure no overlays stay around."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
550
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
551 (if (member major-mode '(reb-mode reb-lisp-mode))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
552 (reb-delete-overlays)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
553
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
554
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
555 ;; The next functions are the interface between the regexp and
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
556 ;; its textual representation in the RE Builder buffer.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
557 ;; They are the only functions concerned with the actual syntax
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
558 ;; being used.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
559 (defun reb-read-regexp ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
560 "Read current RE."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
561 (save-excursion
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
562 (cond ((eq reb-re-syntax 'read)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
563 (goto-char (point-min))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
564 (read (current-buffer)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
565 ((eq reb-re-syntax 'string)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
566 (goto-char (point-min))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
567 (re-search-forward "\"")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
568 (let ((beg (point)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
569 (goto-char (point-max))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
570 (re-search-backward "\"")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
571 (buffer-substring-no-properties beg (point))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
572 ((reb-lisp-syntax-p)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
573 (buffer-string)))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
574
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
575 (defun reb-empty-regexp ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
576 "Return empty RE for current syntax."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
577 (cond ((reb-lisp-syntax-p) "'()")
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
578 (t "")))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
579
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
580 (defun reb-insert-regexp ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
581 "Insert current RE."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
582
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
583 (let ((re (or (reb-target-binding reb-regexp)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
584 (reb-empty-regexp))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
585 (cond ((eq reb-re-syntax 'read)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
586 (print re (current-buffer)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
587 ((eq reb-re-syntax 'string)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
588 (insert "\n\"" re "\""))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
589 ;; For the Lisp syntax we need the "source" of the regexp
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
590 ((reb-lisp-syntax-p)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
591 (insert (or (reb-target-binding reb-regexp-src)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
592 (reb-empty-regexp)))))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
593
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
594 (defun reb-cook-regexp (re)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
595 "Return RE after processing it according to `reb-re-syntax'."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
596 (cond ((eq reb-re-syntax 'lisp-re)
64382
c16c027014c6 (reb-cook-regexp): Avoid warning calling lre-compile-string.
Richard M. Stallman <rms@gnu.org>
parents: 64085
diff changeset
597 (if (fboundp 'lre-compile-string)
c16c027014c6 (reb-cook-regexp): Avoid warning calling lre-compile-string.
Richard M. Stallman <rms@gnu.org>
parents: 64085
diff changeset
598 (lre-compile-string (eval (car (read-from-string re))))))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
599 ((eq reb-re-syntax 'sregex)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
600 (apply 'sregex (eval (car (read-from-string re)))))
56611
8b14a3e64595 (reb-re-syntax): Add `rx' syntax.
John Paul Wallington <jpw@pobox.com>
parents: 56382
diff changeset
601 ((eq reb-re-syntax 'rx)
8b14a3e64595 (reb-re-syntax): Add `rx' syntax.
John Paul Wallington <jpw@pobox.com>
parents: 56382
diff changeset
602 (rx-to-string (eval (car (read-from-string re)))))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
603 (t re)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
604
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
605 (defun reb-update-regexp ()
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
606 "Update the regexp for the target buffer.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
607 Return t if the (cooked) expression changed."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
608 (let* ((re-src (reb-read-regexp))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
609 (re (reb-cook-regexp re-src)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
610 (with-current-buffer reb-target-buffer
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
611 (let ((oldre reb-regexp))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
612 (prog1
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
613 (not (string= oldre re))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
614 (setq reb-regexp re)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
615 ;; Only update the source re for the lisp formats
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
616 (if (reb-lisp-syntax-p)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
617 (setq reb-regexp-src re-src)))))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
618
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
619
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
620 ;; And now the real core of the whole thing
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
621 (defun reb-count-subexps (re)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
622 "Return number of sub-expressions in the regexp RE."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
623
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
624 (let ((i 0) (beg 0))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
625 (while (string-match "\\\\(" re beg)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
626 (setq i (1+ i)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
627 beg (match-end 0)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
628 i))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
629
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
630 (defun reb-update-overlays (&optional subexp)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
631 "Switch to `reb-target-buffer' and mark all matches of `reb-regexp'.
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
632 If SUBEXP is non-nil mark only the corresponding sub-expressions."
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
633 (let* ((re (reb-target-binding reb-regexp))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
634 (subexps (reb-count-subexps re))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
635 (matches 0)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
636 (submatches 0)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
637 firstmatch)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
638 (save-excursion
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
639 (set-buffer reb-target-buffer)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
640 (reb-delete-overlays)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
641 (goto-char (point-min))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
642 (while (and (re-search-forward re (point-max) t)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
643 (or (not reb-auto-match-limit)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
644 (< matches reb-auto-match-limit)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
645 (if (= 0 (length (match-string 0)))
70404
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
646 (error "Empty regular expression!"))
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
647 (let ((i 0)
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
648 suffix max-suffix)
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
649 (setq matches (1+ matches))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
650 (while (<= i subexps)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
651 (if (and (or (not subexp) (= subexp i))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
652 (match-beginning i))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
653 (let ((overlay (make-overlay (match-beginning i)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
654 (match-end i)))
70404
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
655 ;; When we have exceeded the number of provided faces,
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
656 ;; cycle thru them where `max-suffix' denotes the maximum
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
657 ;; suffix for `reb-match-*' that has been defined and
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
658 ;; `suffix' the suffix calculated for the current match.
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
659 (face
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
660 (cond
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
661 (max-suffix
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
662 (if (= suffix max-suffix)
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
663 (setq suffix 1)
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
664 (setq suffix (1+ suffix)))
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
665 (intern-soft (format "reb-match-%d" suffix)))
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
666 ((intern-soft (format "reb-match-%d" i)))
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
667 ((setq max-suffix (1- i))
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
668 (setq suffix 1)
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
669 ;; `reb-match-1' must exist.
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
670 'reb-match-1))))
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
671 (unless firstmatch (setq firstmatch (match-data)))
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
672 (setq reb-overlays (cons overlay reb-overlays)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
673 submatches (1+ submatches))
70404
ce092da13632 (reb-update-overlays): Cycle through provided faces once they all have been
Eli Zaretskii <eliz@gnu.org>
parents: 68648
diff changeset
674 (overlay-put overlay 'face face)
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
675 (overlay-put overlay 'priority i)))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
676 (setq i (1+ i))))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
677 (let ((count (if subexp submatches matches)))
56611
8b14a3e64595 (reb-re-syntax): Add `rx' syntax.
John Paul Wallington <jpw@pobox.com>
parents: 56382
diff changeset
678 (message "%s %smatch%s%s"
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
679 (if (= 0 count) "No" (int-to-string count))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
680 (if subexp "subexpression " "")
56382
a4c0ce40be3d (reb-update-overlays): Distinguish between one and several matches in message.
John Paul Wallington <jpw@pobox.com>
parents: 55404
diff changeset
681 (if (= 1 count) "" "es")
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
682 (if (and reb-auto-match-limit
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
683 (= reb-auto-match-limit count))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
684 " (limit reached)" "")))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
685 (if firstmatch
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
686 (progn (store-match-data firstmatch)
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
687 (reb-show-subexp (or subexp 0))))))
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
688
48379
6e55b7742a81 Add provide call.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 41371
diff changeset
689 (provide 're-builder)
6e55b7742a81 Add provide call.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 41371
diff changeset
690
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49598
diff changeset
691 ;;; arch-tag: 5c5515ac-4085-4524-a421-033f44f032e7
28077
30c2ad45d57b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
692 ;;; re-builder.el ends here