annotate lisp/replace.el @ 1436:e7c5faab6571

* xterm.c (compose_status): New variable. (XTread_socket): Pass it by reference to XLookupString. * xterm.c: Clean up some of the caps lock handling: (x_shift_lock_mask): New variable. (x_find_modifier_mappings): Set it, based on the modifier mappings. (x_convert_modifiers): Use x_shift_lock_mask, instead of assuming that the lock bit always means to shift the character. (XTread_socket): When handling KeyPress events, don't pass an XComposeStatus structure along to XLookupString. When handling MappingNotify events, call XRefreshKeyboardMapping for both MappingModifier and MappingKeyboard events, not just the latter.
author Jim Blandy <jimb@redhat.com>
date Mon, 19 Oct 1992 18:31:34 +0000
parents c49077849583
children 787f816e1f4b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 324
diff changeset
1 ;;; replace.el --- replace commands for Emacs.
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 324
diff changeset
2
862
46630543d659 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
3 ;; Copyright (C) 1985, 1986, 1987, 1992 Free Software Foundation, Inc.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 ;; This file is part of GNU Emacs.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 ;; GNU Emacs is free software; you can redistribute it and/or modify
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 ;; it under the terms of the GNU General Public License as published by
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
9 ;; the Free Software Foundation; either version 2, or (at your option)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 ;; any later version.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 ;; GNU Emacs is distributed in the hope that it will be useful,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 ;; GNU General Public License for more details.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; You should have received a copy of the GNU General Public License
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; along with GNU Emacs; see the file COPYING. If not, write to
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
788
c8d4eb38ebfc *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 732
diff changeset
21 ;;; Code:
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22
268
2dd411fe2f72 *** empty log message ***
Brian Preble <rassilon@gnu.org>
parents: 264
diff changeset
23 (defconst case-replace t "\
2dd411fe2f72 *** empty log message ***
Brian Preble <rassilon@gnu.org>
parents: 264
diff changeset
24 *Non-nil means query-replace should preserve case in replacements.")
264
7db4ff4204a5 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 260
diff changeset
25
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
26 (defvar query-replace-history nil)
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
27
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
28 (defun query-replace-read-args (string)
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
29 (let (from to)
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
30 (setq from (read-from-minibuffer (format "%s: " string)
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
31 nil nil nil
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
32 'query-replace-history))
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
33 (setq to (read-from-minibuffer (format "%s %s with: " string from)
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
34 nil nil nil
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
35 'query-replace-history))
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
36 (list from to current-prefix-arg)))
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
37
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
38 (defun query-replace (from-string to-string &optional arg)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
39 "Replace some occurrences of FROM-STRING with TO-STRING.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
40 As each match is found, the user must type a character saying
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
41 what to do with it. For directions, type \\[help-command] at that time.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
42
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
43 Preserves case in each replacement if case-replace and case-fold-search
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
44 are non-nil and FROM-STRING has no uppercase letters.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
45 Third arg DELIMITED (prefix arg if interactive) non-nil means replace
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
46 only matches surrounded by word boundaries."
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
47 (interactive (query-replace-read-args "Query replace"))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
48 (perform-replace from-string to-string t nil arg)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
49 (message "Done"))
268
2dd411fe2f72 *** empty log message ***
Brian Preble <rassilon@gnu.org>
parents: 264
diff changeset
50 (define-key esc-map "%" 'query-replace)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
51
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
52 (defun query-replace-regexp (regexp to-string &optional arg)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
53 "Replace some things after point matching REGEXP with TO-STRING.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
54 As each match is found, the user must type a character saying
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
55 what to do with it. For directions, type \\[help-command] at that time.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
56
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
57 Preserves case in each replacement if case-replace and case-fold-search
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
58 are non-nil and REGEXP has no uppercase letters.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
59 Third arg DELIMITED (prefix arg if interactive) non-nil means replace
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
60 only matches surrounded by word boundaries.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
61 In TO-STRING, \\& means insert what matched REGEXP,
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
62 and \\=\\<n> means insert what matched <n>th \\(...\\) in REGEXP."
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
63 (interactive (query-replace-read-args "Query replace regexp"))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
64 (perform-replace regexp to-string t t arg)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
65 (message "Done"))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
66
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
67 (defun map-query-replace-regexp (regexp to-strings &optional arg)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
68 "Replace some matches for REGEXP with various strings, in rotation.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
69 The second argument TO-STRINGS contains the replacement strings, separated
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
70 by spaces. This command works like `query-replace-regexp' except
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
71 that each successive replacement uses the next successive replacement string,
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
72 wrapping around from the last such string to the first.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
73
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
74 Non-interactively, TO-STRINGS may be a list of replacement strings.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
75
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
76 A prefix argument N says to use each replacement string N times
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
77 before rotating to the next."
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
78 (interactive
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
79 (let (from to)
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
80 (setq from (read-from-minibuffer "Map query replace (regexp): "
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
81 nil nil nil
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
82 'query-replace-history))
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
83 (setq to (read-from-minibuffer
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
84 (format "Query replace %s with (space-separated strings): "
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
85 from)
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
86 nil nil nil
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
87 'query-replace-history))
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
88 (list from to current-prefix-arg)))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
89 (let (replacements)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
90 (if (listp to-strings)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
91 (setq replacements to-strings)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
92 (while (/= (length to-strings) 0)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
93 (if (string-match " " to-strings)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
94 (setq replacements
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
95 (append replacements
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
96 (list (substring to-strings 0
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
97 (string-match " " to-strings))))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
98 to-strings (substring to-strings
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
99 (1+ (string-match " " to-strings))))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
100 (setq replacements (append replacements (list to-strings))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
101 to-strings ""))))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
102 (perform-replace regexp replacements t t nil arg))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
103 (message "Done"))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
104
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
105 (defun replace-string (from-string to-string &optional delimited)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
106 "Replace occurrences of FROM-STRING with TO-STRING.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
107 Preserve case in each match if `case-replace' and `case-fold-search'
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
108 are non-nil and FROM-STRING has no uppercase letters.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
109 Third arg DELIMITED (prefix arg if interactive) non-nil means replace
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
110 only matches surrounded by word boundaries.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
111
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
112 This function is usually the wrong thing to use in a Lisp program.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
113 What you probably want is a loop like this:
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
114 (while (search-forward OLD-STRING nil t)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
115 (replace-match REPLACEMENT nil t))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
116 which will run faster and will not set the mark or print anything."
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
117 (interactive (query-replace-read-args "Replace string"))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
118 (perform-replace from-string to-string nil nil delimited)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
119 (message "Done"))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
120
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
121 (defun replace-regexp (regexp to-string &optional delimited)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
122 "Replace things after point matching REGEXP with TO-STRING.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
123 Preserve case in each match if case-replace and case-fold-search
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
124 are non-nil and REGEXP has no uppercase letters.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
125 Third arg DELIMITED (prefix arg if interactive) non-nil means replace
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
126 only matches surrounded by word boundaries.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
127 In TO-STRING, \\& means insert what matched REGEXP,
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
128 and \\=\\<n> means insert what matched <n>th \\(...\\) in REGEXP.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
129
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
130 This function is usually the wrong thing to use in a Lisp program.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
131 What you probably want is a loop like this:
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
132 (while (re-search-forward REGEXP nil t)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
133 (replace-match REPLACEMENT nil nil))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
134 which will run faster and will not set the mark or print anything."
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
135 (interactive (query-replace-read-args "Replace regexp"))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
136 (perform-replace regexp to-string nil t delimited)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
137 (message "Done"))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
138
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 (fset 'delete-non-matching-lines 'keep-lines)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 (defun keep-lines (regexp)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 "Delete all lines except those containing matches for REGEXP.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 A match split across lines preserves all the lines it lies in.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 Applies to all lines after point."
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 (interactive "sKeep lines (containing match for regexp): ")
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 (save-excursion
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 (or (bolp) (forward-line 1))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 (let ((start (point)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 (while (not (eobp))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 ;; Start is first char not preserved by previous match.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 (if (not (re-search-forward regexp nil 'move))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 (delete-region start (point-max))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 (let ((end (save-excursion (goto-char (match-beginning 0))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 (beginning-of-line)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 (point))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 ;; Now end is first char preserved by the new match.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 (if (< start end)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 (delete-region start end))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 (setq start (save-excursion (forward-line 1)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159 (point)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 ;; If the match was empty, avoid matching again at same place.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 (and (not (eobp)) (= (match-beginning 0) (match-end 0))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 (forward-char 1))))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 (fset 'delete-matching-lines 'flush-lines)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 (defun flush-lines (regexp)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 "Delete lines containing matches for REGEXP.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 If a match is split across lines, all the lines it lies in are deleted.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 Applies to lines after point."
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 (interactive "sFlush lines (containing match for regexp): ")
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 (save-excursion
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 (while (and (not (eobp))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 (re-search-forward regexp nil t))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 (delete-region (save-excursion (goto-char (match-beginning 0))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 (beginning-of-line)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 (point))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 (progn (forward-line 1) (point))))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 (fset 'count-matches 'how-many)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 (defun how-many (regexp)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 "Print number of matches for REGEXP following point."
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 (interactive "sHow many matches for (regexp): ")
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 (let ((count 0) opoint)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 (save-excursion
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 (while (and (not (eobp))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 (progn (setq opoint (point))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 (re-search-forward regexp nil t)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 (if (= opoint (point))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 (forward-char 1)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 (setq count (1+ count))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 (message "%d occurrences" count))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 (defvar occur-mode-map ())
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 (if occur-mode-map
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 ()
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 (setq occur-mode-map (make-sparse-keymap))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 (define-key occur-mode-map "\C-c\C-c" 'occur-mode-goto-occurrence))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 (defvar occur-buffer nil)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 (defvar occur-nlines nil)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 (defvar occur-pos-list nil)
73
ada1c5de3968 *** empty log message ***
root <root>
parents: 61
diff changeset
201 (defvar occur-last-string "")
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 (defun occur-mode ()
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 "Major mode for output from \\[occur].
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 Move point to one of the occurrences in this buffer,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 then use \\[occur-mode-goto-occurrence] to go to the same occurrence
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 in the buffer that the occurrences were found in.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 \\{occur-mode-map}"
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 (kill-all-local-variables)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 (use-local-map occur-mode-map)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 (setq major-mode 'occur-mode)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 (setq mode-name "Occur")
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 (make-local-variable 'occur-buffer)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 (make-local-variable 'occur-nlines)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 (make-local-variable 'occur-pos-list))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 (defun occur-mode-goto-occurrence ()
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 "Go to the line this occurrence was found in, in the buffer it was found in."
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 (interactive)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 (if (or (null occur-buffer)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221 (null (buffer-name occur-buffer)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 (progn
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 (setq occur-buffer nil
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 occur-pos-list nil)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 (error "Buffer in which occurrences were found is deleted")))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 (let* ((occur-number (save-excursion
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 (beginning-of-line)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 (/ (1- (count-lines (point-min)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 (save-excursion
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230 (beginning-of-line)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 (point))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 (cond ((< occur-nlines 0)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 (- 2 occur-nlines))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 ((> occur-nlines 0)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 (+ 2 (* 2 occur-nlines)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 (t 1)))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 (pos (nth occur-number occur-pos-list)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 (pop-to-buffer occur-buffer)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 (goto-char (marker-position pos))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 (defvar list-matching-lines-default-context-lines 0
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
242 "*Default number of context lines to include around a `list-matching-lines'
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 match. A negative number means to include that many lines before the match.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 A positive number means to include that many lines both before and after.")
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 (fset 'list-matching-lines 'occur)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 (defun occur (regexp &optional nlines)
1427
c49077849583 (occur): Always search entire buffer.
Richard M. Stallman <rms@gnu.org>
parents: 866
diff changeset
249 "Show all lines in the current buffer containing a match for REGEXP.
c49077849583 (occur): Always search entire buffer.
Richard M. Stallman <rms@gnu.org>
parents: 866
diff changeset
250 Interactively, REGEXP defaults to the last REGEXP
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
251 used interactively with \\[occur].
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
253 If a match spreads across multiple lines, all those lines are shown.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
254
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
255 Each line is displayed with NLINES lines before and after, or -NLINES
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
256 before if NLINES is negative.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
257 NLINES defaults to `list-matching-lines-default-context-lines'.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 Interactively it is the prefix arg.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 The lines are shown in a buffer named *Occur*.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 It serves as a menu to find any of the occurrences in this buffer.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 \\[describe-mode] in that buffer will explain how."
73
ada1c5de3968 *** empty log message ***
root <root>
parents: 61
diff changeset
263 (interactive (list (setq occur-last-string
ada1c5de3968 *** empty log message ***
root <root>
parents: 61
diff changeset
264 (read-string "List lines matching regexp: "
ada1c5de3968 *** empty log message ***
root <root>
parents: 61
diff changeset
265 occur-last-string))
ada1c5de3968 *** empty log message ***
root <root>
parents: 61
diff changeset
266 current-prefix-arg))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 (setq nlines (if nlines (prefix-numeric-value nlines)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 list-matching-lines-default-context-lines))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 (let ((first t)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 (buffer (current-buffer))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 (linenum 1)
324
133f1a8cc567 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 268
diff changeset
272 (prevpos (point-min))
133f1a8cc567 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 268
diff changeset
273 (final-context-start (make-marker)))
1427
c49077849583 (occur): Always search entire buffer.
Richard M. Stallman <rms@gnu.org>
parents: 866
diff changeset
274 ;;; (save-excursion
c49077849583 (occur): Always search entire buffer.
Richard M. Stallman <rms@gnu.org>
parents: 866
diff changeset
275 ;;; (beginning-of-line)
c49077849583 (occur): Always search entire buffer.
Richard M. Stallman <rms@gnu.org>
parents: 866
diff changeset
276 ;;; (setq linenum (1+ (count-lines (point-min) (point))))
c49077849583 (occur): Always search entire buffer.
Richard M. Stallman <rms@gnu.org>
parents: 866
diff changeset
277 ;;; (setq prevpos (point)))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 (with-output-to-temp-buffer "*Occur*"
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 (save-excursion
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 (set-buffer standard-output)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 (insert "Lines matching ")
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 (prin1 regexp)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 (insert " in buffer " (buffer-name buffer) ?. ?\n)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 (occur-mode)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 (setq occur-buffer buffer)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 (setq occur-nlines nlines)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 (setq occur-pos-list ()))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 (if (eq buffer standard-output)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 (goto-char (point-max)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 (save-excursion
1427
c49077849583 (occur): Always search entire buffer.
Richard M. Stallman <rms@gnu.org>
parents: 866
diff changeset
291 (beginning-of-buffer)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 ;; Find next match, but give up if prev match was at end of buffer.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 (while (and (not (= prevpos (point-max)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 (re-search-forward regexp nil t))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
295 (goto-char (match-beginning 0))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 (beginning-of-line)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 (setq linenum (+ linenum (count-lines prevpos (point))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 (setq prevpos (point))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
299 (goto-char (match-end 0))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 (let* ((start (save-excursion
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
301 (goto-char (match-beginning 0))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 (forward-line (if (< nlines 0) nlines (- nlines)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 (point)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 (end (save-excursion
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
305 (goto-char (match-end 0))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 (if (> nlines 0)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 (forward-line (1+ nlines))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 (forward-line 1))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 (point)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 (tag (format "%3d" linenum))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 (empty (make-string (length tag) ?\ ))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 tem)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 (save-excursion
324
133f1a8cc567 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 268
diff changeset
314 (setq tem (make-marker))
133f1a8cc567 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 268
diff changeset
315 (set-marker tem (point))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 (set-buffer standard-output)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 (setq occur-pos-list (cons tem occur-pos-list))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 (or first (zerop nlines)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 (insert "--------\n"))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 (setq first nil)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 (insert-buffer-substring buffer start end)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 (backward-char (- end start))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
323 (setq tem nlines)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 (while (> tem 0)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 (insert empty ?:)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 (forward-line 1)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 (setq tem (1- tem)))
324
133f1a8cc567 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 268
diff changeset
328 (let ((this-linenum linenum))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
329 (set-marker final-context-start
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
330 (+ (point) (- (match-end 0) (match-beginning 0))))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
331 (while (< (point) final-context-start)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
332 (if (null tag)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
333 (setq tag (format "%3d" this-linenum)))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
334 (insert tag ?:)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
335 (setq tag nil)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
336 (forward-line 1)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
337 (setq this-linenum (1+ this-linenum))))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 (while (< tem nlines)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 (insert empty ?:)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 (forward-line 1)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 (setq tem (1+ tem))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 (forward-line 1)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 (set-buffer standard-output)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 ;; Put positions in increasing order to go with buffer.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 (setq occur-pos-list (nreverse occur-pos-list))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 (if (interactive-p)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 (message "%d matching lines." (length occur-pos-list)))))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 (defconst query-replace-help
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 "Type Space or `y' to replace one match, Delete or `n' to skip to next,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 ESC or `q' to exit, Period to replace one match and exit,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 Comma to replace but not move point immediately,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 C-r to enter recursive edit (\\[exit-recursive-edit] to get out again),
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 C-w to delete match and recursive edit,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 C-l to clear the screen, redisplay, and offer same replacement again,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 ! to replace all remaining matches with no more questions,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 ^ to move point back to previous match."
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 "Help message while in query-replace")
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 (defun perform-replace (from-string replacements
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 query-flag regexp-flag delimited-flag
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 &optional repeat-count)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 "Subroutine of `query-replace'. Its complexity handles interactive queries.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 Don't use this in your own program unless you want to query and set the mark
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 just as `query-replace' does. Instead, write a simple loop like this:
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 (while (re-search-forward \"foo[ \t]+bar\" nil t)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 (replace-match \"foobar\" nil nil))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 which will run faster and do exactly what you probably want."
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 (let ((nocasify (not (and case-fold-search case-replace
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 (string-equal from-string
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 (downcase from-string)))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 (literal (not regexp-flag))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 (search-function (if regexp-flag 're-search-forward 'search-forward))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 (search-string from-string)
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
375 (real-match-data nil) ; the match data for the current match
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 (next-replacement nil)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 (replacement-index 0)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 (keep-going t)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 (stack nil)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 (next-rotate-count 0)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 (replace-count 0)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
382 (lastrepl nil) ;Position after last match considered.
862
46630543d659 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
383 (match-again t))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 (if (stringp replacements)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 (setq next-replacement replacements)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 (or repeat-count (setq repeat-count 1)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 (if delimited-flag
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 (setq search-function 're-search-forward
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 search-string (concat "\\b"
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 (if regexp-flag from-string
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 (regexp-quote from-string))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 "\\b")))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 (push-mark)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 (undo-boundary)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 (while (and keep-going
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 (not (eobp))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 (funcall search-function search-string nil t)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
398 ;; If the search string matches immediately after
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
399 ;; the previous match, but it did not match there
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
400 ;; before the replacement was done, ignore the match.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
401 (if (or (eq lastrepl (point))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
402 (and regexp-flag
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
403 (eq lastrepl (match-beginning 0))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
404 (not match-again)))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
405 (if (eobp)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
406 nil
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 ;; Don't replace the null string
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 ;; right after end of previous replacement.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 (forward-char 1)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 (funcall search-function search-string nil t))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 t))
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
412
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
413 ;; Save the data associated with the real match.
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
414 (setq real-match-data (match-data))
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
415
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
416 ;; Before we make the replacement, decide whether the search string
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
417 ;; can match again just after this match.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
418 (if regexp-flag
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
419 (setq match-again (looking-at search-string)))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 ;; If time for a change, advance to next replacement string.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 (if (and (listp replacements)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 (= next-rotate-count replace-count))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 (progn
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 (setq next-rotate-count
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 (+ next-rotate-count repeat-count))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 (setq next-replacement (nth replacement-index replacements))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 (setq replacement-index (% (1+ replacement-index) (length replacements)))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 (if (not query-flag)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429 (progn
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
430 (store-match-data real-match-data)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 (replace-match next-replacement nocasify literal)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 (setq replace-count (1+ replace-count)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433 (undo-boundary)
866
ae5c412a32ec entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 864
diff changeset
434 (let (done replaced char)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 (while (not done)
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
436 (let ((help-form
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 '(concat "Query replacing "
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 (if regexp-flag "regexp " "")
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 from-string " with " next-replacement ".\n\n"
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 (substitute-command-keys query-replace-help))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 (setq char help-char)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 (while (or (not (numberp char)) (= char help-char))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 (message "Query replacing %s with %s: " from-string next-replacement)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 (setq char (read-event))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 (if (and (numberp char) (= char ??))
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
446 (setq unread-command-char help-char char help-char))))
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
447 ;; Restore the match data while we process the command.
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
448 (store-match-data real-match-data)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449 (cond ((or (= char ?\e)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 (= char ?q))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 (setq keep-going nil)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 (setq done t))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 ((= char ?^)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 (let ((elt (car stack)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 (goto-char (car elt))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 (setq replaced (eq t (cdr elt)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 (or replaced
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 (store-match-data (cdr elt)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 (setq stack (cdr stack))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460 ((or (= char ?\ )
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461 (= char ?y))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 (or replaced
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 (replace-match next-replacement nocasify literal))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 (setq done t replaced t))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 ((= char ?\.)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 (or replaced
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 (replace-match next-replacement nocasify literal))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 (setq keep-going nil)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 (setq done t replaced t))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470 ((= char ?\,)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 (if (not replaced)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 (progn
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 (replace-match next-replacement nocasify literal)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 (setq replaced t))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 ((= char ?!)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 (or replaced
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477 (replace-match next-replacement nocasify literal))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 (setq done t query-flag nil replaced t))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 ((or (= char ?\177)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480 (= char ?n))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 (setq done t))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 ((= char ?\C-l)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 (recenter nil))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 ((= char ?\C-r)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 (store-match-data
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 (prog1 (match-data)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
487 (save-excursion (recursive-edit))))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
488 ;; Before we make the replacement,
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
489 ;; decide whether the search string
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
490 ;; can match again just after this match.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
491 (if regexp-flag
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
492 (setq match-again (looking-at search-string))))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 ((= char ?\C-w)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 (delete-region (match-beginning 0) (match-end 0))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 (store-match-data
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 (prog1 (match-data)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 (save-excursion (recursive-edit))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 (setq replaced t))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 (t
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 (setq keep-going nil)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 (setq unread-command-char char)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 (setq done t))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 ;; Record previous position for ^ when we move on.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 ;; Change markers to numbers in the match data
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 ;; since lots of markers slow down editing.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 (setq stack
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507 (cons (cons (point)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 (or replaced
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 (mapcar
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510 (function (lambda (elt)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 (and elt
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 (marker-position elt))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 (match-data))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 stack))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 (if replaced (setq replace-count (1+ replace-count)))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 (setq lastrepl (point)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 (and keep-going stack)))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 324
diff changeset
519 ;;; replace.el ends here