annotate lisp/emacs-lisp/re-builder.el @ 51010:f79532778159

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