annotate lisp/replace.el @ 62149:e64f1e2ecec2

(easy-mmode-pretty-mode-name): Explain more about the LIGHTER arg's usage in the doc string. Add commentary to clarify what the code does. Fix the regexp that strips whitespace from LIGHTER. Quote LIGHTER before using it, since it could have characters special to regular expressions.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 07 May 2005 15:05:00 +0000
parents 94214f10d9c4
children 2c228409c44d 62afea0771d8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38414
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 38080
diff changeset
1 ;;; replace.el --- replace commands for Emacs
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 324
diff changeset
2
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
3 ;; Copyright (C) 1985, 1986, 1987, 1992, 1994, 1996, 1997, 2000, 2001, 2002,
60240
4d79094ee455 (query-replace-read-from): Fix 2005-02-19 change.
Lute Kamstra <lute@gnu.org>
parents: 60174
diff changeset
4 ;; 2003, 2004, 2005 Free Software Foundation, Inc.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5
45078
829beb9a6a4b Follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 44924
diff changeset
6 ;; Maintainer: FSF
829beb9a6a4b Follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 44924
diff changeset
7
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 ;; 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
12 ;; the Free Software Foundation; either version 2, or (at your option)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; any later version.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; GNU General Public License for more details.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13069
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13069
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13069
diff changeset
23 ;; Boston, MA 02111-1307, USA.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
2315
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2156
diff changeset
25 ;;; Commentary:
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2156
diff changeset
26
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2156
diff changeset
27 ;; This package supplies the string and regular-expression replace functions
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2156
diff changeset
28 ;; documented in the Emacs user's manual.
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2156
diff changeset
29
788
c8d4eb38ebfc *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 732
diff changeset
30 ;;; Code:
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31
17664
d8cb277f0ce8 Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents: 17655
diff changeset
32 (defcustom case-replace t
38036
018637678f29 (case-replace, query-replace-from-history-variable)
Eli Zaretskii <eliz@gnu.org>
parents: 37832
diff changeset
33 "*Non-nil means `query-replace' should preserve case in replacements."
17664
d8cb277f0ce8 Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents: 17655
diff changeset
34 :type 'boolean
d8cb277f0ce8 Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents: 17655
diff changeset
35 :group 'matching)
264
7db4ff4204a5 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 260
diff changeset
36
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
37 (defvar query-replace-history nil)
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
38
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
39 (defvar query-replace-interactive nil
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
40 "Non-nil means `query-replace' uses the last search string.
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
41 That becomes the \"string to replace\".")
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
42
20806
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
43 (defcustom query-replace-from-history-variable 'query-replace-history
38036
018637678f29 (case-replace, query-replace-from-history-variable)
Eli Zaretskii <eliz@gnu.org>
parents: 37832
diff changeset
44 "History list to use for the FROM argument of `query-replace' commands.
20806
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
45 The value of this variable should be a symbol; that symbol
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
46 is used as a variable to hold a history list for the strings
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
47 or patterns to be replaced."
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
48 :group 'matching
21669
9861518505cb *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 21294
diff changeset
49 :type 'symbol
9861518505cb *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 21294
diff changeset
50 :version "20.3")
20806
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
51
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
52 (defcustom query-replace-to-history-variable 'query-replace-history
38036
018637678f29 (case-replace, query-replace-from-history-variable)
Eli Zaretskii <eliz@gnu.org>
parents: 37832
diff changeset
53 "History list to use for the TO argument of `query-replace' commands.
20806
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
54 The value of this variable should be a symbol; that symbol
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
55 is used as a variable to hold a history list for replacement
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
56 strings or patterns."
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
57 :group 'matching
21669
9861518505cb *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 21294
diff changeset
58 :type 'symbol
9861518505cb *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 21294
diff changeset
59 :version "20.3")
20806
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
60
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
61 (defcustom query-replace-skip-read-only nil
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
62 "*Non-nil means `query-replace' and friends ignore read-only matches."
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
63 :type 'boolean
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
64 :group 'matching
59996
aac0a33f5772 Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents: 59570
diff changeset
65 :version "22.1")
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
66
59479
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
67 (defcustom query-replace-highlight t
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
68 "*Non-nil means to highlight matches during query replacement."
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
69 :type 'boolean
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
70 :group 'matching)
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
71
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
72 (defcustom query-replace-lazy-highlight t
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
73 "*Controls the lazy-highlighting during query replacements.
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
74 When non-nil, all text in the buffer matching the current match
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
75 is highlighted lazily using isearch lazy highlighting (see
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
76 `lazy-highlight-initial-delay' and `lazy-highlight-interval')."
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
77 :type 'boolean
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
78 :group 'lazy-highlight
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
79 :group 'matching
59996
aac0a33f5772 Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents: 59570
diff changeset
80 :version "22.1")
59479
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
81
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
82 (defface query-replace
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
83 '((t (:inherit isearch)))
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
84 "Face for highlighting query replacement matches."
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
85 :group 'matching
59996
aac0a33f5772 Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents: 59570
diff changeset
86 :version "22.1")
59479
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
87
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
88 (defun query-replace-descr (string)
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
89 (mapconcat 'isearch-text-char-description string ""))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
90
56351
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
91 (defun query-replace-read-from (string regexp-flag)
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
92 "Query and return the `from' argument of a query-replace operation.
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
93 The return value can also be a pair (FROM . TO) indicating that the user
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
94 wants to replace FROM with TO."
56351
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
95 (if query-replace-interactive
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
96 (car (if regexp-flag regexp-search-ring search-ring))
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
97 (let* ((lastfrom (car (symbol-value query-replace-from-history-variable)))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
98 (lastto (car (symbol-value query-replace-to-history-variable)))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
99 (from
56351
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
100 ;; The save-excursion here is in case the user marks and copies
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
101 ;; a region in order to specify the minibuffer input.
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
102 ;; That should not clobber the region for the query-replace itself.
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
103 (save-excursion
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
104 (when (equal lastfrom lastto)
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
105 ;; Typically, this is because the two histlists are shared.
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
106 (setq lastfrom (cadr (symbol-value
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
107 query-replace-from-history-variable))))
56351
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
108 (read-from-minibuffer
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
109 (if (and lastto lastfrom)
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
110 (format "%s (default %s -> %s): " string
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
111 (query-replace-descr lastfrom)
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
112 (query-replace-descr lastto))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
113 (format "%s: " string))
56351
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
114 nil nil nil
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
115 query-replace-from-history-variable
58362
0301caf145d2 (query-replace-read-to, query-replace-read-from):
Richard M. Stallman <rms@gnu.org>
parents: 57023
diff changeset
116 nil t t))))
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
117 (if (and (zerop (length from)) lastto lastfrom)
60159
0527991ebdf0 (query-replace-read-from): Set the value of
Eli Zaretskii <eliz@gnu.org>
parents: 60101
diff changeset
118 (progn
60240
4d79094ee455 (query-replace-read-from): Fix 2005-02-19 change.
Lute Kamstra <lute@gnu.org>
parents: 60174
diff changeset
119 (set query-replace-from-history-variable
4d79094ee455 (query-replace-read-from): Fix 2005-02-19 change.
Lute Kamstra <lute@gnu.org>
parents: 60174
diff changeset
120 (cdr (symbol-value query-replace-from-history-variable)))
60159
0527991ebdf0 (query-replace-read-from): Set the value of
Eli Zaretskii <eliz@gnu.org>
parents: 60101
diff changeset
121 (cons lastfrom
60240
4d79094ee455 (query-replace-read-from): Fix 2005-02-19 change.
Lute Kamstra <lute@gnu.org>
parents: 60174
diff changeset
122 (query-replace-compile-replacement lastto regexp-flag)))
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
123 ;; Warn if user types \n or \t, but don't reject the input.
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
124 (and regexp-flag
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
125 (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\(\\\\[nt]\\)" from)
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
126 (let ((match (match-string 3 from)))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
127 (cond
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
128 ((string= match "\\n")
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
129 (message "Note: `\\n' here doesn't match a newline; to do that, type C-q C-j instead"))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
130 ((string= match "\\t")
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
131 (message "Note: `\\t' here doesn't match a tab; to do that, just type TAB")))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
132 (sit-for 2)))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
133 from))))
41761
878a3e2e7cfa (query-replace-read-args): Display message if FROM contains `\n' or `\t'.
Richard M. Stallman <rms@gnu.org>
parents: 41329
diff changeset
134
56581
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
135 (defun query-replace-compile-replacement (to regexp-flag)
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
136 "Maybe convert a regexp replacement TO to Lisp.
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
137 Returns a list suitable for `perform-replace' if necessary,
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
138 the original string if not."
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
139 (if (and regexp-flag
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
140 (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\\\[,#]" to))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
141 (let (pos list char)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
142 (while
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
143 (progn
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
144 (setq pos (match-end 0))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
145 (push (substring to 0 (- pos 2)) list)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
146 (setq char (aref to (1- pos))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
147 to (substring to pos))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
148 (cond ((eq char ?\#)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
149 (push '(number-to-string replace-count) list))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
150 ((eq char ?\,)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
151 (setq pos (read-from-string to))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
152 (push `(replace-quote ,(car pos)) list)
56325
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
153 (let ((end
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
154 ;; Swallow a space after a symbol
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
155 ;; if there is a space.
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
156 (if (and (or (symbolp (car pos))
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
157 ;; Swallow a space after 'foo
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
158 ;; but not after (quote foo).
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
159 (and (eq (car-safe (car pos)) 'quote)
56328
cc1deb864ed6 (query-replace-read-args): Swallow space after 'foo,
Juri Linkov <juri@jurta.org>
parents: 56325
diff changeset
160 (not (= ?\( (aref to 0)))))
cc1deb864ed6 (query-replace-read-args): Swallow space after 'foo,
Juri Linkov <juri@jurta.org>
parents: 56325
diff changeset
161 (eq (string-match " " to (cdr pos))
cc1deb864ed6 (query-replace-read-args): Swallow space after 'foo,
Juri Linkov <juri@jurta.org>
parents: 56325
diff changeset
162 (cdr pos)))
56325
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
163 (1+ (cdr pos))
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
164 (cdr pos))))
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
165 (setq to (substring to end)))))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
166 (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\\\[,#]" to)))
56581
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
167 (setq to (nreverse (delete "" (cons to list))))
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
168 (replace-match-string-symbols to)
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
169 (cons 'replace-eval-replacement
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
170 (if (cdr to)
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
171 (cons 'concat to)
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
172 (car to))))
56351
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
173 to))
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
174
56581
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
175
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
176 (defun query-replace-read-to (from string regexp-flag)
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
177 "Query and return the `to' argument of a query-replace operation."
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
178 (query-replace-compile-replacement
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
179 (save-excursion
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
180 (read-from-minibuffer
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
181 (format "%s %s with: " string (query-replace-descr from))
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
182 nil nil nil
58362
0301caf145d2 (query-replace-read-to, query-replace-read-from):
Richard M. Stallman <rms@gnu.org>
parents: 57023
diff changeset
183 query-replace-to-history-variable from t t))
56581
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
184 regexp-flag))
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
185
56351
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
186 (defun query-replace-read-args (string regexp-flag &optional noerror)
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
187 (unless noerror
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
188 (barf-if-buffer-read-only))
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
189 (let* ((from (query-replace-read-from string regexp-flag))
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
190 (to (if (consp from) (prog1 (cdr from) (setq from (car from)))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
191 (query-replace-read-to from string regexp-flag))))
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
192 (list from to current-prefix-arg)))
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
193
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
194 (defun query-replace (from-string to-string &optional delimited start end)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
195 "Replace some occurrences of FROM-STRING with TO-STRING.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
196 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
197 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
198
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
199 In Transient Mark mode, if the mark is active, operate on the contents
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
200 of the region. Otherwise, operate from point to the end of the buffer.
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
201
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
202 If `query-replace-interactive' is non-nil, the last incremental search
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
203 string is used as FROM-STRING--you don't have to specify it with the
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
204 minibuffer.
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
205
48173
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
206 Matching is independent of case if `case-fold-search' is non-nil and
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
207 FROM-STRING has no uppercase letters. Replacement transfers the case
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
208 pattern of the old text to the new text, if `case-replace' and
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
209 `case-fold-search' are non-nil and FROM-STRING has no uppercase
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
210 letters. \(Transferring the case pattern means that if the old text
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
211 matched is all caps, or capitalized, then its replacement is upcased
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
212 or capitalized.)
10104
8a04af3511c1 (replace-string, query-replace): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 10069
diff changeset
213
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
214 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
215 only matches surrounded by word boundaries.
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
216 Fourth and fifth arg START and END specify the region to operate on.
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
217
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
218 To customize possible responses, change the \"bindings\" in `query-replace-map'."
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
219 (interactive (let ((common
60174
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
220 (query-replace-read-args
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
221 (if (and transient-mark-mode mark-active)
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
222 "Query replace in region"
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
223 "Query replace")
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
224 nil)))
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
225 (list (nth 0 common) (nth 1 common) (nth 2 common)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
226 ;; These are done separately here
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
227 ;; so that command-history will record these expressions
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
228 ;; rather than the values they had this time.
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
229 (if (and transient-mark-mode mark-active)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
230 (region-beginning))
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
231 (if (and transient-mark-mode mark-active)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
232 (region-end)))))
40254
51c9985454e3 (perform-replace): Move START and END parameters
Gerd Moellmann <gerd@gnu.org>
parents: 38986
diff changeset
233 (perform-replace from-string to-string t nil delimited nil nil start end))
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
234
268
2dd411fe2f72 *** empty log message ***
Brian Preble <rassilon@gnu.org>
parents: 264
diff changeset
235 (define-key esc-map "%" 'query-replace)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
236
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
237 (defun query-replace-regexp (regexp to-string &optional delimited start end)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
238 "Replace some things after point matching REGEXP with TO-STRING.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
239 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
240 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
241
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
242 In Transient Mark mode, if the mark is active, operate on the contents
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
243 of the region. Otherwise, operate from point to the end of the buffer.
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
244
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
245 If `query-replace-interactive' is non-nil, the last incremental search
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
246 regexp is used as REGEXP--you don't have to specify it with the
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
247 minibuffer.
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
248
48173
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
249 Matching is independent of case if `case-fold-search' is non-nil and
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
250 REGEXP has no uppercase letters. Replacement transfers the case
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
251 pattern of the old text to the new text, if `case-replace' and
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
252 `case-fold-search' are non-nil and REGEXP has no uppercase letters.
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
253 \(Transferring the case pattern means that if the old text matched is
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
254 all caps, or capitalized, then its replacement is upcased or
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
255 capitalized.)
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
256
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
257 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
258 only matches surrounded by word boundaries.
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
259 Fourth and fifth arg START and END specify the region to operate on.
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
260
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
261 In TO-STRING, `\\&' stands for whatever matched the whole of REGEXP,
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
262 and `\\=\\N' (where N is a digit) stands for
56148
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
263 whatever what matched the Nth `\\(...\\)' in REGEXP.
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
264 `\\?' lets you edit the replacement text in the minibuffer
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
265 at the given position for each replacement.
56148
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
266
56245
93e88c0fb51c (query-replace-read-args): Swallow space after \,SYMBOL.
Richard M. Stallman <rms@gnu.org>
parents: 56228
diff changeset
267 In interactive calls, the replacement text can contain `\\,'
93e88c0fb51c (query-replace-read-args): Swallow space after \,SYMBOL.
Richard M. Stallman <rms@gnu.org>
parents: 56228
diff changeset
268 followed by a Lisp expression. Each
93e88c0fb51c (query-replace-read-args): Swallow space after \,SYMBOL.
Richard M. Stallman <rms@gnu.org>
parents: 56228
diff changeset
269 replacement evaluates that expression to compute the replacement
93e88c0fb51c (query-replace-read-args): Swallow space after \,SYMBOL.
Richard M. Stallman <rms@gnu.org>
parents: 56228
diff changeset
270 string. Inside of that expression, `\\&' is a string denoting the
56328
cc1deb864ed6 (query-replace-read-args): Swallow space after 'foo,
Juri Linkov <juri@jurta.org>
parents: 56325
diff changeset
271 whole match as a string, `\\N' for a partial match, `\\#&' and `\\#N'
56245
93e88c0fb51c (query-replace-read-args): Swallow space after \,SYMBOL.
Richard M. Stallman <rms@gnu.org>
parents: 56228
diff changeset
272 for the whole or a partial match converted to a number with
93e88c0fb51c (query-replace-read-args): Swallow space after \,SYMBOL.
Richard M. Stallman <rms@gnu.org>
parents: 56228
diff changeset
273 `string-to-number', and `\\#' itself for the number of replacements
93e88c0fb51c (query-replace-read-args): Swallow space after \,SYMBOL.
Richard M. Stallman <rms@gnu.org>
parents: 56228
diff changeset
274 done so far (starting with zero).
56148
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
275
56245
93e88c0fb51c (query-replace-read-args): Swallow space after \,SYMBOL.
Richard M. Stallman <rms@gnu.org>
parents: 56228
diff changeset
276 If the replacement expression is a symbol, write a space after it
93e88c0fb51c (query-replace-read-args): Swallow space after \,SYMBOL.
Richard M. Stallman <rms@gnu.org>
parents: 56228
diff changeset
277 to terminate it. One space there, if any, will be discarded.
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
278
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
279 When using those Lisp features interactively in the replacement
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
280 text, TO-STRING is actually made a list instead of a string.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
281 Use \\[repeat-complex-command] after this command for details."
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
282 (interactive
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
283 (let ((common
60174
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
284 (query-replace-read-args
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
285 (if (and transient-mark-mode mark-active)
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
286 "Query replace regexp in region"
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
287 "Query replace regexp")
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
288 t)))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
289 (list (nth 0 common) (nth 1 common) (nth 2 common)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
290 ;; These are done separately here
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
291 ;; so that command-history will record these expressions
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
292 ;; rather than the values they had this time.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
293 (if (and transient-mark-mode mark-active)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
294 (region-beginning))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
295 (if (and transient-mark-mode mark-active)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
296 (region-end)))))
56148
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
297 (perform-replace regexp to-string t t delimited nil nil start end))
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
298
22353
402ebb81ae84 (esc-map): Bind C-M-% to query-replace-regexp.
Karl Heuer <kwzh@gnu.org>
parents: 21669
diff changeset
299 (define-key esc-map [?\C-%] 'query-replace-regexp)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
300
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
301 (defun query-replace-regexp-eval (regexp to-expr &optional delimited start end)
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
302 "Replace some things after point matching REGEXP with the result of TO-EXPR.
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
303 As each match is found, the user must type a character saying
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
304 what to do with it. For directions, type \\[help-command] at that time.
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
305
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
306 TO-EXPR is a Lisp expression evaluated to compute each replacement. It may
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
307 reference `replace-count' to get the number of replacements already made.
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
308 If the result of TO-EXPR is not a string, it is converted to one using
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
309 `prin1-to-string' with the NOESCAPE argument (which see).
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
310
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
311 For convenience, when entering TO-EXPR interactively, you can use `\\&' or
43406
f39dfc11dc58 (query-replace-regexp-eval): Doc fix.
Andreas Schwab <schwab@suse.de>
parents: 43405
diff changeset
312 `\\0' to stand for whatever matched the whole of REGEXP, and `\\N' (where
f39dfc11dc58 (query-replace-regexp-eval): Doc fix.
Andreas Schwab <schwab@suse.de>
parents: 43405
diff changeset
313 N is a digit) to stand for whatever matched the Nth `\\(...\\)' in REGEXP.
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
314 Use `\\#&' or `\\#N' if you want a number instead of a string.
56148
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
315 In interactive use, `\\#' in itself stands for `replace-count'.
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
316
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
317 In Transient Mark mode, if the mark is active, operate on the contents
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
318 of the region. Otherwise, operate from point to the end of the buffer.
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
319
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
320 If `query-replace-interactive' is non-nil, the last incremental search
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
321 regexp is used as REGEXP--you don't have to specify it with the
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
322 minibuffer.
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
323
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
324 Preserves case in each replacement if `case-replace' and `case-fold-search'
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
325 are non-nil and REGEXP has no uppercase letters.
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
326
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
327 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
37536
0e883854b9fc (query-replace-regexp-eval): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents: 36076
diff changeset
328 only matches that are surrounded by word boundaries.
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
329 Fourth and fifth arg START and END specify the region to operate on."
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
330 (interactive
56360
a9b695d281d4 (query-replace-regexp-eval): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56355
diff changeset
331 (progn
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
332 (barf-if-buffer-read-only)
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
333 (let* ((from
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
334 ;; Let-bind the history var to disable the "foo -> bar" default.
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
335 ;; Maybe we shouldn't disable this default, but for now I'll
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
336 ;; leave it off. --Stef
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
337 (let ((query-replace-to-history-variable nil))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
338 (query-replace-read-from "Query replace regexp" t)))
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
339 (to (list (read-from-minibuffer
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
340 (format "Query replace regexp %s with eval: "
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
341 (query-replace-descr from))
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
342 nil nil t query-replace-to-history-variable from t))))
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
343 ;; We make TO a list because replace-match-string-symbols requires one,
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
344 ;; and the user might enter a single token.
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
345 (replace-match-string-symbols to)
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
346 (list from (car to) current-prefix-arg
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
347 (if (and transient-mark-mode mark-active)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
348 (region-beginning))
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
349 (if (and transient-mark-mode mark-active)
56360
a9b695d281d4 (query-replace-regexp-eval): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56355
diff changeset
350 (region-end))))))
27391
abaa4ac29f51 (query-replace): Rename last arg to DELIMITED.
Richard M. Stallman <rms@gnu.org>
parents: 25167
diff changeset
351 (perform-replace regexp (cons 'replace-eval-replacement to-expr)
53778
7898852aa054 (perform-replace): Allow 'literal argument in
David Kastrup <dak@gnu.org>
parents: 52401
diff changeset
352 t 'literal delimited nil nil start end))
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
353
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
354 (defun map-query-replace-regexp (regexp to-strings &optional n start end)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
355 "Replace some matches for REGEXP with various strings, in rotation.
29051
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
356 The second argument TO-STRINGS contains the replacement strings,
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
357 separated by spaces. Third arg DELIMITED (prefix arg if interactive),
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
358 if non-nil, means replace only matches surrounded by word boundaries.
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
359 This command works like `query-replace-regexp' except that each
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
360 successive replacement uses the next successive replacement string,
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
361 wrapping around from the last such string to the first.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
362
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
363 In Transient Mark mode, if the mark is active, operate on the contents
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
364 of the region. Otherwise, operate from point to the end of the buffer.
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
365
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
366 Non-interactively, TO-STRINGS may be a list of replacement strings.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
367
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
368 If `query-replace-interactive' is non-nil, the last incremental search
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
369 regexp is used as REGEXP--you don't have to specify it with the minibuffer.
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
370
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
371 A prefix argument N says to use each replacement string N times
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
372 before rotating to the next.
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
373 Fourth and fifth arg START and END specify the region to operate on."
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
374 (interactive
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
375 (let* ((from (if query-replace-interactive
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
376 (car regexp-search-ring)
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
377 (read-from-minibuffer "Map query replace (regexp): "
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
378 nil nil nil
19551
256843b0f804 (query-replace-read-args): Locally bind
Kenichi Handa <handa@m17n.org>
parents: 18991
diff changeset
379 'query-replace-history nil t)))
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
380 (to (read-from-minibuffer
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
381 (format "Query replace %s with (space-separated strings): "
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
382 (query-replace-descr from))
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
383 nil nil nil
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
384 'query-replace-history from t)))
50030
1ec92786c9eb (query-replace-read-args): Use save-excursion.
Richard M. Stallman <rms@gnu.org>
parents: 49958
diff changeset
385 (list from to
1ec92786c9eb (query-replace-read-args): Use save-excursion.
Richard M. Stallman <rms@gnu.org>
parents: 49958
diff changeset
386 (and current-prefix-arg
1ec92786c9eb (query-replace-read-args): Use save-excursion.
Richard M. Stallman <rms@gnu.org>
parents: 49958
diff changeset
387 (prefix-numeric-value current-prefix-arg))
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
388 (if (and transient-mark-mode mark-active)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
389 (region-beginning))
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
390 (if (and transient-mark-mode mark-active)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
391 (region-end)))))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
392 (let (replacements)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
393 (if (listp to-strings)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
394 (setq replacements to-strings)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
395 (while (/= (length to-strings) 0)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
396 (if (string-match " " to-strings)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
397 (setq replacements
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
398 (append replacements
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
399 (list (substring to-strings 0
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
400 (string-match " " to-strings))))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
401 to-strings (substring to-strings
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
402 (1+ (string-match " " to-strings))))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
403 (setq replacements (append replacements (list to-strings))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
404 to-strings ""))))
40254
51c9985454e3 (perform-replace): Move START and END parameters
Gerd Moellmann <gerd@gnu.org>
parents: 38986
diff changeset
405 (perform-replace regexp replacements t t nil n nil start end)))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
406
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
407 (defun replace-string (from-string to-string &optional delimited start end)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
408 "Replace occurrences of FROM-STRING with TO-STRING.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
409 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
410 are non-nil and FROM-STRING has no uppercase letters.
10104
8a04af3511c1 (replace-string, query-replace): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 10069
diff changeset
411 \(Preserving case means that if the string matched is all caps, or capitalized,
8a04af3511c1 (replace-string, query-replace): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 10069
diff changeset
412 then its replacement is upcased or capitalized.)
8a04af3511c1 (replace-string, query-replace): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 10069
diff changeset
413
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
414 In Transient Mark mode, if the mark is active, operate on the contents
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
415 of the region. Otherwise, operate from point to the end of the buffer.
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
416
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
417 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
418 only matches surrounded by word boundaries.
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
419 Fourth and fifth arg START and END specify the region to operate on.
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
420
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
421 If `query-replace-interactive' is non-nil, the last incremental search
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
422 string is used as FROM-STRING--you don't have to specify it with the
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
423 minibuffer.
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
424
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
425 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
426 What you probably want is a loop like this:
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
427 (while (search-forward FROM-STRING nil t)
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
428 (replace-match TO-STRING nil t))
17211
ecf78b4eb138 (replace-string): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 17010
diff changeset
429 which will run faster and will not set the mark or print anything.
ecf78b4eb138 (replace-string): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 17010
diff changeset
430 \(You may need a more complex loop if FROM-STRING can match the null string
ecf78b4eb138 (replace-string): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 17010
diff changeset
431 and TO-STRING is also null.)"
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
432 (interactive
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
433 (let ((common
60174
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
434 (query-replace-read-args
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
435 (if (and transient-mark-mode mark-active)
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
436 "Replace string in region"
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
437 "Replace string")
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
438 nil)))
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
439 (list (nth 0 common) (nth 1 common) (nth 2 common)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
440 (if (and transient-mark-mode mark-active)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
441 (region-beginning))
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
442 (if (and transient-mark-mode mark-active)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
443 (region-end)))))
40254
51c9985454e3 (perform-replace): Move START and END parameters
Gerd Moellmann <gerd@gnu.org>
parents: 38986
diff changeset
444 (perform-replace from-string to-string nil nil delimited nil nil start end))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
445
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
446 (defun replace-regexp (regexp to-string &optional delimited start end)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
447 "Replace things after point matching REGEXP with TO-STRING.
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
448 Preserve case in each match if `case-replace' and `case-fold-search'
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
449 are non-nil and REGEXP has no uppercase letters.
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
450
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
451 In Transient Mark mode, if the mark is active, operate on the contents
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
452 of the region. Otherwise, operate from point to the end of the buffer.
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
453
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
454 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
455 only matches surrounded by word boundaries.
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
456 Fourth and fifth arg START and END specify the region to operate on.
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
457
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
458 In TO-STRING, `\\&' stands for whatever matched the whole of REGEXP,
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
459 and `\\=\\N' (where N is a digit) stands for
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
460 whatever what matched the Nth `\\(...\\)' in REGEXP.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
461 `\\?' lets you edit the replacement text in the minibuffer
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
462 at the given position for each replacement.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
463
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
464 In interactive calls, the replacement text may contain `\\,'
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
465 followed by a Lisp expression used as part of the replacement
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
466 text. Inside of that expression, `\\&' is a string denoting the
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
467 whole match, `\\N' a partial matches, `\\#&' and `\\#N' the
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
468 respective numeric values from `string-to-number', and `\\#'
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
469 itself for `replace-count', the number of replacements occured so
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
470 far.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
471
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
472 If your Lisp expression is an identifier and the next letter in
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
473 the replacement string would be interpreted as part of it, you
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
474 can wrap it with an expression like `\\,(or \\#)'. Incidentally,
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
475 for this particular case you may also enter `\\#' in the
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
476 replacement text directly.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
477
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
478 When using those Lisp features interactively in the replacement
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
479 text, TO-STRING is actually made a list instead of a string.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
480 Use \\[repeat-complex-command] after this command for details.
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
481
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
482 If `query-replace-interactive' is non-nil, the last incremental search
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
483 regexp is used as REGEXP--you don't have to specify it with the minibuffer.
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
484
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
485 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
486 What you probably want is a loop like this:
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
487 (while (re-search-forward REGEXP nil t)
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
488 (replace-match TO-STRING nil nil))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
489 which will run faster and will not set the mark or print anything."
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
490 (interactive
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
491 (let ((common
60174
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
492 (query-replace-read-args
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
493 (if (and transient-mark-mode mark-active)
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
494 "Replace regexp in region"
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
495 "Replace regexp")
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
496 t)))
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
497 (list (nth 0 common) (nth 1 common) (nth 2 common)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
498 (if (and transient-mark-mode mark-active)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
499 (region-beginning))
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
500 (if (and transient-mark-mode mark-active)
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
501 (region-end)))))
40254
51c9985454e3 (perform-replace): Move START and END parameters
Gerd Moellmann <gerd@gnu.org>
parents: 38986
diff changeset
502 (perform-replace regexp to-string nil t delimited nil nil start end))
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
503
2408
a9c05a12b615 (regexp-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 2327
diff changeset
504
a9c05a12b615 (regexp-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 2327
diff changeset
505 (defvar regexp-history nil
a9c05a12b615 (regexp-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 2327
diff changeset
506 "History list for some commands that read regular expressions.")
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
507
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
508
2571
b65cf676a09b All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2408
diff changeset
509 (defalias 'delete-non-matching-lines 'keep-lines)
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
510 (defalias 'delete-matching-lines 'flush-lines)
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
511 (defalias 'count-matches 'how-many)
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
512
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
513
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
514 (defun keep-lines-read-args (prompt)
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
515 "Read arguments for `keep-lines' and friends.
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
516 Prompt for a regexp with PROMPT.
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
517 Value is a list, (REGEXP)."
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
518 (list (read-from-minibuffer prompt nil nil nil
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
519 'regexp-history nil t)))
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
520
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
521 (defun keep-lines (regexp &optional rstart rend)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522 "Delete all lines except those containing matches for REGEXP.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 A match split across lines preserves all the lines it lies in.
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
524 Applies to all lines after point.
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
525
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
526 If REGEXP contains upper case characters (excluding those preceded by `\\'),
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
527 the matching is case-sensitive.
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
528
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
529 Second and third arg RSTART and REND specify the region to operate on.
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
530
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
531 Interactively, in Transient Mark mode when the mark is active, operate
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
532 on the contents of the region. Otherwise, operate from point to the
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
533 end of the buffer."
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
534
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
535 (interactive
46519
6de9114ee49a (keep-lines, flush-lines): Interactively report
Richard M. Stallman <rms@gnu.org>
parents: 46335
diff changeset
536 (progn
6de9114ee49a (keep-lines, flush-lines): Interactively report
Richard M. Stallman <rms@gnu.org>
parents: 46335
diff changeset
537 (barf-if-buffer-read-only)
6de9114ee49a (keep-lines, flush-lines): Interactively report
Richard M. Stallman <rms@gnu.org>
parents: 46335
diff changeset
538 (keep-lines-read-args "Keep lines (containing match for regexp): ")))
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
539 (if rstart
46335
b4e553fa1fa8 (flush-lines, keep-lines): Convert REND to a marker.
Richard M. Stallman <rms@gnu.org>
parents: 46004
diff changeset
540 (progn
b4e553fa1fa8 (flush-lines, keep-lines): Convert REND to a marker.
Richard M. Stallman <rms@gnu.org>
parents: 46004
diff changeset
541 (goto-char (min rstart rend))
b4e553fa1fa8 (flush-lines, keep-lines): Convert REND to a marker.
Richard M. Stallman <rms@gnu.org>
parents: 46004
diff changeset
542 (setq rend (copy-marker (max rstart rend))))
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
543 (if (and transient-mark-mode mark-active)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
544 (setq rstart (region-beginning)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
545 rend (copy-marker (region-end)))
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
546 (setq rstart (point)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
547 rend (point-max-marker)))
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
548 (goto-char rstart))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
549 (save-excursion
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
550 (or (bolp) (forward-line 1))
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
551 (let ((start (point))
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
552 (case-fold-search (and case-fold-search
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
553 (isearch-no-upper-case-p regexp t))))
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
554 (while (< (point) rend)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
555 ;; Start is first char not preserved by previous match.
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
556 (if (not (re-search-forward regexp rend 'move))
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
557 (delete-region start rend)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558 (let ((end (save-excursion (goto-char (match-beginning 0))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559 (beginning-of-line)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
560 (point))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
561 ;; Now end is first char preserved by the new match.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 (if (< start end)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563 (delete-region start end))))
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
564
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
565 (setq start (save-excursion (forward-line 1) (point)))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566 ;; If the match was empty, avoid matching again at same place.
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
567 (and (< (point) rend)
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
568 (= (match-beginning 0) (match-end 0))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
569 (forward-char 1))))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
570
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
571
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
572 (defun flush-lines (regexp &optional rstart rend)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573 "Delete lines containing matches for REGEXP.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
574 If a match is split across lines, all the lines it lies in are deleted.
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
575 Applies to lines after point.
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
576
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
577 If REGEXP contains upper case characters (excluding those preceded by `\\'),
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
578 the matching is case-sensitive.
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
579
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
580 Second and third arg RSTART and REND specify the region to operate on.
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
581
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
582 Interactively, in Transient Mark mode when the mark is active, operate
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
583 on the contents of the region. Otherwise, operate from point to the
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
584 end of the buffer."
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
585
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
586 (interactive
46519
6de9114ee49a (keep-lines, flush-lines): Interactively report
Richard M. Stallman <rms@gnu.org>
parents: 46335
diff changeset
587 (progn
6de9114ee49a (keep-lines, flush-lines): Interactively report
Richard M. Stallman <rms@gnu.org>
parents: 46335
diff changeset
588 (barf-if-buffer-read-only)
6de9114ee49a (keep-lines, flush-lines): Interactively report
Richard M. Stallman <rms@gnu.org>
parents: 46335
diff changeset
589 (keep-lines-read-args "Flush lines (containing match for regexp): ")))
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
590 (if rstart
46335
b4e553fa1fa8 (flush-lines, keep-lines): Convert REND to a marker.
Richard M. Stallman <rms@gnu.org>
parents: 46004
diff changeset
591 (progn
b4e553fa1fa8 (flush-lines, keep-lines): Convert REND to a marker.
Richard M. Stallman <rms@gnu.org>
parents: 46004
diff changeset
592 (goto-char (min rstart rend))
b4e553fa1fa8 (flush-lines, keep-lines): Convert REND to a marker.
Richard M. Stallman <rms@gnu.org>
parents: 46004
diff changeset
593 (setq rend (copy-marker (max rstart rend))))
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
594 (if (and transient-mark-mode mark-active)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
595 (setq rstart (region-beginning)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
596 rend (copy-marker (region-end)))
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
597 (setq rstart (point)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
598 rend (point-max-marker)))
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
599 (goto-char rstart))
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
600 (let ((case-fold-search (and case-fold-search
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
601 (isearch-no-upper-case-p regexp t))))
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
602 (save-excursion
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
603 (while (and (< (point) rend)
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
604 (re-search-forward regexp rend t))
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
605 (delete-region (save-excursion (goto-char (match-beginning 0))
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
606 (beginning-of-line)
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
607 (point))
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
608 (progn (forward-line 1) (point)))))))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
609
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
610
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
611 (defun how-many (regexp &optional rstart rend)
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
612 "Print number of matches for REGEXP following point.
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
613
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
614 If REGEXP contains upper case characters (excluding those preceded by `\\'),
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
615 the matching is case-sensitive.
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
616
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
617 Second and third arg RSTART and REND specify the region to operate on.
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
618
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
619 Interactively, in Transient Mark mode when the mark is active, operate
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
620 on the contents of the region. Otherwise, operate from point to the
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
621 end of the buffer."
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
622
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
623 (interactive
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
624 (keep-lines-read-args "How many matches for (regexp): "))
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
625 (save-excursion
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
626 (if rstart
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
627 (goto-char (min rstart rend))
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
628 (if (and transient-mark-mode mark-active)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
629 (setq rstart (region-beginning)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
630 rend (copy-marker (region-end)))
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
631 (setq rstart (point)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
632 rend (point-max-marker)))
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
633 (goto-char rstart))
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
634 (let ((count 0)
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
635 opoint
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
636 (case-fold-search (and case-fold-search
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
637 (isearch-no-upper-case-p regexp t))))
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
638 (while (and (< (point) rend)
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
639 (progn (setq opoint (point))
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
640 (re-search-forward regexp rend t)))
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
641 (if (= opoint (point))
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
642 (forward-char 1)
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
643 (setq count (1+ count))))
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
644 (message "%d occurrences" count))))
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
645
2408
a9c05a12b615 (regexp-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 2327
diff changeset
646
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
647 (defvar occur-mode-map
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
648 (let ((map (make-sparse-keymap)))
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
649 (define-key map [mouse-2] 'occur-mode-mouse-goto)
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
650 (define-key map "\C-c\C-c" 'occur-mode-goto-occurrence)
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
651 (define-key map "\C-m" 'occur-mode-goto-occurrence)
45444
84e0e49bfb75 (occur-engine): Increment globalcount all at once after searching a buffer.
Colin Walters <walters@gnu.org>
parents: 45308
diff changeset
652 (define-key map "o" 'occur-mode-goto-occurrence-other-window)
42294
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
653 (define-key map "\C-o" 'occur-mode-display-occurrence)
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
654 (define-key map "\M-n" 'occur-next)
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
655 (define-key map "\M-p" 'occur-prev)
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
656 (define-key map "r" 'occur-rename-buffer)
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
657 (define-key map "c" 'clone-buffer)
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
658 (define-key map "g" 'revert-buffer)
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
659 (define-key map "q" 'quit-window)
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
660 (define-key map "z" 'kill-this-buffer)
57023
cf85be0f7afa (perform-replace): Use `query-replace-descr'.
Juri Linkov <juri@jurta.org>
parents: 56922
diff changeset
661 (define-key map "\C-c\C-f" 'next-error-follow-minor-mode)
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
662 map)
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
663 "Keymap for `occur-mode'.")
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
664
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
665 (defvar occur-revert-arguments nil
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
666 "Arguments to pass to `occur-1' to revert an Occur mode buffer.
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
667 See `occur-revert-function'.")
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
668
47111
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
669 (defcustom occur-mode-hook '(turn-on-font-lock)
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
670 "Hook run when entering Occur mode."
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
671 :type 'hook
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
672 :group 'matching)
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
673
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
674 (defcustom occur-hook nil
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
675 "Hook run when `occur' is called."
45444
84e0e49bfb75 (occur-engine): Increment globalcount all at once after searching a buffer.
Colin Walters <walters@gnu.org>
parents: 45308
diff changeset
676 :type 'hook
84e0e49bfb75 (occur-engine): Increment globalcount all at once after searching a buffer.
Colin Walters <walters@gnu.org>
parents: 45308
diff changeset
677 :group 'matching)
84e0e49bfb75 (occur-engine): Increment globalcount all at once after searching a buffer.
Colin Walters <walters@gnu.org>
parents: 45308
diff changeset
678
17655
8e35bb3ec2e2 (occur-mode): Add a mode-class property.
Richard M. Stallman <rms@gnu.org>
parents: 17638
diff changeset
679 (put 'occur-mode 'mode-class 'special)
41329
040cb763bd64 (occur-mode): Undo 2001-5-20 change.
Richard M. Stallman <rms@gnu.org>
parents: 40925
diff changeset
680 (defun occur-mode ()
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
681 "Major mode for output from \\[occur].
10266
a44beb55d3e1 (occur-mode-map): Bind C-m and `return' to occur-mode-goto-occurrence.
Richard M. Stallman <rms@gnu.org>
parents: 10157
diff changeset
682 \\<occur-mode-map>Move point to one of the items in this buffer, then use
a44beb55d3e1 (occur-mode-map): Bind C-m and `return' to occur-mode-goto-occurrence.
Richard M. Stallman <rms@gnu.org>
parents: 10157
diff changeset
683 \\[occur-mode-goto-occurrence] to go to the occurrence that the item refers to.
a44beb55d3e1 (occur-mode-map): Bind C-m and `return' to occur-mode-goto-occurrence.
Richard M. Stallman <rms@gnu.org>
parents: 10157
diff changeset
684 Alternatively, click \\[occur-mode-mouse-goto] on an item to go to it.
a44beb55d3e1 (occur-mode-map): Bind C-m and `return' to occur-mode-goto-occurrence.
Richard M. Stallman <rms@gnu.org>
parents: 10157
diff changeset
685
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
686 \\{occur-mode-map}"
47130
454f46344502 (occur-mode): Add interactive declaration.
Juanma Barranquero <lekktu@gmail.com>
parents: 47111
diff changeset
687 (interactive)
41329
040cb763bd64 (occur-mode): Undo 2001-5-20 change.
Richard M. Stallman <rms@gnu.org>
parents: 40925
diff changeset
688 (kill-all-local-variables)
040cb763bd64 (occur-mode): Undo 2001-5-20 change.
Richard M. Stallman <rms@gnu.org>
parents: 40925
diff changeset
689 (use-local-map occur-mode-map)
040cb763bd64 (occur-mode): Undo 2001-5-20 change.
Richard M. Stallman <rms@gnu.org>
parents: 40925
diff changeset
690 (setq major-mode 'occur-mode)
040cb763bd64 (occur-mode): Undo 2001-5-20 change.
Richard M. Stallman <rms@gnu.org>
parents: 40925
diff changeset
691 (setq mode-name "Occur")
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
692 (set (make-local-variable 'revert-buffer-function) 'occur-revert-function)
47111
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
693 (make-local-variable 'occur-revert-arguments)
47375
fe8ca2be9fde (occur-mode): Add font-lock-defontify to change-major-mode-hook.
Richard M. Stallman <rms@gnu.org>
parents: 47204
diff changeset
694 (add-hook 'change-major-mode-hook 'font-lock-defontify nil t)
55067
b335edb455ad From: Teodor Zlatanov <tzz@lifelogs.com>
Kim F. Storm <storm@cua.dk>
parents: 54778
diff changeset
695 (setq next-error-function 'occur-next-error)
47111
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
696 (run-hooks 'occur-mode-hook))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
697
16864
59ed508195a4 (occur-mode-map): Bind g to revert-buffer.
Richard M. Stallman <rms@gnu.org>
parents: 16819
diff changeset
698 (defun occur-revert-function (ignore1 ignore2)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
699 "Handle `revert-buffer' for Occur mode buffers."
45265
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
700 (apply 'occur-1 (append occur-revert-arguments (list (buffer-name)))))
16864
59ed508195a4 (occur-mode-map): Bind g to revert-buffer.
Richard M. Stallman <rms@gnu.org>
parents: 16819
diff changeset
701
6596
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
702 (defun occur-mode-mouse-goto (event)
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
703 "In Occur mode, go to the occurrence whose line you click on."
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
704 (interactive "e")
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
705 (let (pos)
6596
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
706 (save-excursion
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
707 (set-buffer (window-buffer (posn-window (event-end event))))
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
708 (save-excursion
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
709 (goto-char (posn-point (event-end event)))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
710 (setq pos (occur-mode-find-occurrence))))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
711 (pop-to-buffer (marker-buffer pos))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
712 (goto-char pos)))
6596
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
713
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
714 (defun occur-mode-find-occurrence ()
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
715 (let ((pos (get-text-property (point) 'occur-target)))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
716 (unless pos
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
717 (error "No occurrence on this line"))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
718 (unless (buffer-live-p (marker-buffer pos))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
719 (error "Buffer for this occurrence was killed"))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
720 pos))
6596
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
721
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
722 (defun occur-mode-goto-occurrence ()
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
723 "Go to the occurrence the current line describes."
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
724 (interactive)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
725 (let ((pos (occur-mode-find-occurrence)))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
726 (pop-to-buffer (marker-buffer pos))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
727 (goto-char pos)))
18918
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
728
42604
a49b37e22b38 (occur-mode-goto-occurrence-other-window): New command.
Richard M. Stallman <rms@gnu.org>
parents: 42430
diff changeset
729 (defun occur-mode-goto-occurrence-other-window ()
a49b37e22b38 (occur-mode-goto-occurrence-other-window): New command.
Richard M. Stallman <rms@gnu.org>
parents: 42430
diff changeset
730 "Go to the occurrence the current line describes, in another window."
a49b37e22b38 (occur-mode-goto-occurrence-other-window): New command.
Richard M. Stallman <rms@gnu.org>
parents: 42430
diff changeset
731 (interactive)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
732 (let ((pos (occur-mode-find-occurrence)))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
733 (switch-to-buffer-other-window (marker-buffer pos))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
734 (goto-char pos)))
42604
a49b37e22b38 (occur-mode-goto-occurrence-other-window): New command.
Richard M. Stallman <rms@gnu.org>
parents: 42430
diff changeset
735
42294
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
736 (defun occur-mode-display-occurrence ()
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
737 "Display in another window the occurrence the current line describes."
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
738 (interactive)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
739 (let ((pos (occur-mode-find-occurrence))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
740 window
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
741 ;; Bind these to ensure `display-buffer' puts it in another window.
42294
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
742 same-window-buffer-names
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
743 same-window-regexps)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
744 (setq window (display-buffer (marker-buffer pos)))
42294
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
745 ;; This is the way to set point in the proper window.
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
746 (save-selected-window
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
747 (select-window window)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
748 (goto-char pos))))
42294
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
749
47593
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
750 (defun occur-find-match (n search message)
18918
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
751 (if (not n) (setq n 1))
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
752 (let ((r))
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
753 (while (> n 0)
47593
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
754 (setq r (funcall search (point) 'occur-match))
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
755 (and r
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
756 (get-text-property r 'occur-match)
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
757 (setq r (funcall search r 'occur-match)))
18918
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
758 (if r
47593
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
759 (goto-char r)
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
760 (error message))
18918
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
761 (setq n (1- n)))))
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
762
47593
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
763 (defun occur-next (&optional n)
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
764 "Move to the Nth (default 1) next match in an Occur mode buffer."
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
765 (interactive "p")
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
766 (occur-find-match n #'next-single-property-change "No more matches"))
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
767
18918
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
768 (defun occur-prev (&optional n)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
769 "Move to the Nth (default 1) previous match in an Occur mode buffer."
18918
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
770 (interactive "p")
47593
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
771 (occur-find-match n #'previous-single-property-change "No earlier matches"))
55067
b335edb455ad From: Teodor Zlatanov <tzz@lifelogs.com>
Kim F. Storm <storm@cua.dk>
parents: 54778
diff changeset
772
b335edb455ad From: Teodor Zlatanov <tzz@lifelogs.com>
Kim F. Storm <storm@cua.dk>
parents: 54778
diff changeset
773 (defun occur-next-error (&optional argp reset)
b335edb455ad From: Teodor Zlatanov <tzz@lifelogs.com>
Kim F. Storm <storm@cua.dk>
parents: 54778
diff changeset
774 "Move to the Nth (default 1) next match in an Occur mode buffer.
b335edb455ad From: Teodor Zlatanov <tzz@lifelogs.com>
Kim F. Storm <storm@cua.dk>
parents: 54778
diff changeset
775 Compatibility function for \\[next-error] invocations."
b335edb455ad From: Teodor Zlatanov <tzz@lifelogs.com>
Kim F. Storm <storm@cua.dk>
parents: 54778
diff changeset
776 (interactive "p")
58625
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
777 ;; we need to run occur-find-match from within the Occur buffer
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
778 (with-current-buffer
59290
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
779 ;; Choose the buffer and make it current.
58625
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
780 (if (next-error-buffer-p (current-buffer))
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
781 (current-buffer)
59290
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
782 (next-error-find-buffer nil nil
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
783 (lambda ()
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
784 (eq major-mode 'occur-mode))))
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
785
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
786 (goto-char (cond (reset (point-min))
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
787 ((< argp 0) (line-beginning-position))
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
788 ((line-end-position))))
58625
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
789 (occur-find-match
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
790 (abs argp)
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
791 (if (> 0 argp)
58625
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
792 #'previous-single-property-change
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
793 #'next-single-property-change)
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
794 "No more matches")
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
795 ;; In case the *Occur* buffer is visible in a nonselected window.
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
796 (set-window-point (get-buffer-window (current-buffer)) (point))
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
797 (occur-mode-goto-occurrence)))
2408
a9c05a12b615 (regexp-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 2327
diff changeset
798
58987
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
799 (defface match
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
800 '((((class color) (min-colors 88) (background light))
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
801 :background "Tan")
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
802 (((class color) (min-colors 88) (background dark))
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
803 :background "RoyalBlue4")
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
804 (((class color) (min-colors 8))
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
805 :background "blue" :foreground "white")
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
806 (((type tty) (class mono))
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
807 :inverse-video t)
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
808 (t :background "gray"))
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
809 "Face used to highlight matches permanently."
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
810 :group 'matching
59996
aac0a33f5772 Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents: 59570
diff changeset
811 :version "22.1")
58987
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
812
17664
d8cb277f0ce8 Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents: 17655
diff changeset
813 (defcustom list-matching-lines-default-context-lines 0
29051
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
814 "*Default number of context lines included around `list-matching-lines' matches.
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
815 A negative number means to include that many lines before the match.
17664
d8cb277f0ce8 Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents: 17655
diff changeset
816 A positive number means to include that many lines both before and after."
d8cb277f0ce8 Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents: 17655
diff changeset
817 :type 'integer
d8cb277f0ce8 Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents: 17655
diff changeset
818 :group 'matching)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
819
2571
b65cf676a09b All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2408
diff changeset
820 (defalias 'list-matching-lines 'occur)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
821
58987
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
822 (defcustom list-matching-lines-face 'match
29051
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
823 "*Face used by \\[list-matching-lines] to show the text that matches.
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
824 If the value is nil, don't highlight the matching portions specially."
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
825 :type 'face
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
826 :group 'matching)
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
827
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
828 (defcustom list-matching-lines-buffer-name-face 'underline
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
829 "*Face used by \\[list-matching-lines] to show the names of buffers.
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
830 If the value is nil, don't highlight the buffer names specially."
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
831 :type 'face
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
832 :group 'matching)
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
833
58741
5ffd11b70941 (occur-1): Specify t for KEEP-PROPS to occur-engine.
Richard M. Stallman <rms@gnu.org>
parents: 58625
diff changeset
834 (defun occur-accumulate-lines (count &optional keep-props)
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
835 (save-excursion
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
836 (let ((forwardp (> count 0))
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
837 result beg end)
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
838 (while (not (or (zerop count)
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
839 (if forwardp
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
840 (eobp)
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
841 (bobp))))
45176
2a245e4bdf59 (occur-unfontify-region-function): Delete.
Colin Walters <walters@gnu.org>
parents: 45079
diff changeset
842 (setq count (+ count (if forwardp -1 1)))
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
843 (setq beg (line-beginning-position)
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
844 end (line-end-position))
59570
3d6f4d8e0b8b (occur-accumulate-lines, occur-engine): Avoid warnings.
Richard M. Stallman <rms@gnu.org>
parents: 59479
diff changeset
845 (if (and keep-props (if (boundp 'jit-lock-mode) jit-lock-mode)
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
846 (text-property-not-all beg end 'fontified t))
59570
3d6f4d8e0b8b (occur-accumulate-lines, occur-engine): Avoid warnings.
Richard M. Stallman <rms@gnu.org>
parents: 59479
diff changeset
847 (if (fboundp 'jit-lock-fontify-now)
3d6f4d8e0b8b (occur-accumulate-lines, occur-engine): Avoid warnings.
Richard M. Stallman <rms@gnu.org>
parents: 59479
diff changeset
848 (jit-lock-fontify-now beg end)))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
849 (push
58741
5ffd11b70941 (occur-1): Specify t for KEEP-PROPS to occur-engine.
Richard M. Stallman <rms@gnu.org>
parents: 58625
diff changeset
850 (funcall (if keep-props
5ffd11b70941 (occur-1): Specify t for KEEP-PROPS to occur-engine.
Richard M. Stallman <rms@gnu.org>
parents: 58625
diff changeset
851 #'buffer-substring
5ffd11b70941 (occur-1): Specify t for KEEP-PROPS to occur-engine.
Richard M. Stallman <rms@gnu.org>
parents: 58625
diff changeset
852 #'buffer-substring-no-properties)
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
853 beg end)
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
854 result)
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
855 (forward-line (if forwardp 1 -1)))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
856 (nreverse result))))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
857
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
858 (defun occur-read-primary-args ()
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
859 (list (let* ((default (car regexp-history))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
860 (input
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
861 (read-from-minibuffer
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
862 (if default
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
863 (format "List lines matching regexp (default `%s'): "
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
864 (query-replace-descr default))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
865 "List lines matching regexp: ")
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
866 nil
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
867 nil
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
868 nil
56449
84df5471b01e (occur-read-primary-args): Pass default to read-from-minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 56360
diff changeset
869 'regexp-history
84df5471b01e (occur-read-primary-args): Pass default to read-from-minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 56360
diff changeset
870 default)))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
871 (if (equal input "")
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
872 default
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
873 input))
45308
abd8a68f87a7 (occur-read-primary-args): Handle a bare 'C-u' correctly.
Colin Walters <walters@gnu.org>
parents: 45265
diff changeset
874 (when current-prefix-arg
abd8a68f87a7 (occur-read-primary-args): Handle a bare 'C-u' correctly.
Colin Walters <walters@gnu.org>
parents: 45265
diff changeset
875 (prefix-numeric-value current-prefix-arg))))
16818
6de559d0b20f (list-matching-lines-face): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 16758
diff changeset
876
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
877 (defun occur-rename-buffer (&optional unique-p)
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
878 "Rename the current *Occur* buffer to *Occur: original-buffer-name*.
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
879 Here `original-buffer-name' is the buffer name were occur was originally run.
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
880 When given the prefix argument, the renaming will not clobber the existing
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
881 buffer(s) of that name, but use `generate-new-buffer-name' instead.
47087
756de7be303c (occur-hook): Renamed from `occur-mode-hook'.
Juanma Barranquero <lekktu@gmail.com>
parents: 46693
diff changeset
882 You can add this to `occur-hook' if you always want a separate *Occur*
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
883 buffer for each buffer where you invoke `occur'."
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
884 (interactive "P")
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
885 (with-current-buffer
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
886 (if (eq major-mode 'occur-mode) (current-buffer) (get-buffer "*Occur*"))
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
887 (rename-buffer (concat "*Occur: "
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
888 (mapconcat #'buffer-name
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
889 (car (cddr occur-revert-arguments)) "/")
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
890 "*")
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
891 unique-p)))
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
892
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
893 (defun occur (regexp &optional nlines)
1427
c49077849583 (occur): Always search entire buffer.
Richard M. Stallman <rms@gnu.org>
parents: 866
diff changeset
894 "Show all lines in the current buffer containing a match for REGEXP.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
895
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
896 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
897
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
898 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
899 before if NLINES is negative.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
900 NLINES defaults to `list-matching-lines-default-context-lines'.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
901 Interactively it is the prefix arg.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
902
2408
a9c05a12b615 (regexp-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 2327
diff changeset
903 The lines are shown in a buffer named `*Occur*'.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
904 It serves as a menu to find any of the occurrences in this buffer.
17655
8e35bb3ec2e2 (occur-mode): Add a mode-class property.
Richard M. Stallman <rms@gnu.org>
parents: 17638
diff changeset
905 \\<occur-mode-map>\\[describe-mode] in that buffer will explain how.
17638
9ece72836276 (occur): If regexp has uppercase in it, match it case-sensitively.
Richard M. Stallman <rms@gnu.org>
parents: 17211
diff changeset
906
17655
8e35bb3ec2e2 (occur-mode): Add a mode-class property.
Richard M. Stallman <rms@gnu.org>
parents: 17638
diff changeset
907 If REGEXP contains upper case characters (excluding those preceded by `\\'),
8e35bb3ec2e2 (occur-mode): Add a mode-class property.
Richard M. Stallman <rms@gnu.org>
parents: 17638
diff changeset
908 the matching is case-sensitive."
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
909 (interactive (occur-read-primary-args))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
910 (occur-1 regexp nlines (list (current-buffer))))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
911
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
912 (defun multi-occur (bufs regexp &optional nlines)
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
913 "Show all lines in buffers BUFS containing a match for REGEXP.
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
914 This function acts on multiple buffers; otherwise, it is exactly like
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
915 `occur'."
15040
04f81516b6e0 (occur): Fix up interactive code.
Richard M. Stallman <rms@gnu.org>
parents: 14819
diff changeset
916 (interactive
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
917 (cons
47204
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
918 (let* ((bufs (list (read-buffer "First buffer to search: "
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
919 (current-buffer) t)))
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
920 (buf nil)
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
921 (ido-ignore-item-temp-list bufs))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
922 (while (not (string-equal
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48276
diff changeset
923 (setq buf (read-buffer
47204
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
924 (if (eq read-buffer-function 'ido-read-buffer)
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
925 "Next buffer to search (C-j to end): "
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
926 "Next buffer to search (RET to end): ")
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
927 nil t))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
928 ""))
47204
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
929 (add-to-list 'bufs buf)
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
930 (setq ido-ignore-item-temp-list bufs))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
931 (nreverse (mapcar #'get-buffer bufs)))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
932 (occur-read-primary-args)))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
933 (occur-1 regexp nlines bufs))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
934
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
935 (defun multi-occur-by-filename-regexp (bufregexp regexp &optional nlines)
44853
ca887baefc80 (multi-occur-by-filename-regexp): Doc fix.
Colin Walters <walters@gnu.org>
parents: 44832
diff changeset
936 "Show all lines matching REGEXP in buffers named by BUFREGEXP.
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
937 See also `multi-occur'."
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
938 (interactive
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
939 (cons
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
940 (let* ((default (car regexp-history))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
941 (input
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
942 (read-from-minibuffer
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
943 "List lines in buffers whose filename matches regexp: "
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
944 nil
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
945 nil
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
946 nil
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
947 'regexp-history)))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
948 (if (equal input "")
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
949 default
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
950 input))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
951 (occur-read-primary-args)))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
952 (when bufregexp
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
953 (occur-1 regexp nlines
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
954 (delq nil
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
955 (mapcar (lambda (buf)
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
956 (when (and (buffer-file-name buf)
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
957 (string-match bufregexp
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
958 (buffer-file-name buf)))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
959 buf))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
960 (buffer-list))))))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
961
45265
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
962 (defun occur-1 (regexp nlines bufs &optional buf-name)
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
963 (unless buf-name
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
964 (setq buf-name "*Occur*"))
59290
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
965 (let (occur-buf
45079
bf76420e3297 (occur-mode-map): Bind "q" to `delete-window'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
966 (active-bufs (delq nil (mapcar #'(lambda (buf)
bf76420e3297 (occur-mode-map): Bind "q" to `delete-window'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
967 (when (buffer-live-p buf) buf))
bf76420e3297 (occur-mode-map): Bind "q" to `delete-window'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
968 bufs))))
bf76420e3297 (occur-mode-map): Bind "q" to `delete-window'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
969 ;; Handle the case where one of the buffers we're searching is the
59290
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
970 ;; output buffer. Just rename it.
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
971 (when (member buf-name (mapcar 'buffer-name active-bufs))
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
972 (with-current-buffer (get-buffer buf-name)
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
973 (rename-uniquely)))
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
974
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
975 ;; Now find or create the output buffer.
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
976 ;; If we just renamed that buffer, we will make a new one here.
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
977 (setq occur-buf (get-buffer-create buf-name))
285e069cecd2 (occur-1): If the output buffer is also an input, don't kill it, rename it.
Richard M. Stallman <rms@gnu.org>
parents: 59029
diff changeset
978
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
979 (with-current-buffer occur-buf
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
980 (occur-mode)
62147
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
981 (let ((inhibit-read-only t))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
982 (erase-buffer)
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
983 (let ((count (occur-engine
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
984 regexp active-bufs occur-buf
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
985 (or nlines list-matching-lines-default-context-lines)
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
986 (and case-fold-search
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
987 (isearch-no-upper-case-p regexp t))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
988 list-matching-lines-buffer-name-face
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
989 nil list-matching-lines-face t)))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
990 (let* ((bufcount (length active-bufs))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
991 (diff (- (length bufs) bufcount)))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
992 (message "Searched %d buffer%s%s; %s match%s for `%s'"
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
993 bufcount (if (= bufcount 1) "" "s")
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
994 (if (zerop diff) "" (format " (%d killed)" diff))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
995 (if (zerop count) "no" (format "%d" count))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
996 (if (= count 1) "" "es")
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
997 regexp))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
998 (setq occur-revert-arguments (list regexp nlines bufs))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
999 (if (> count 0)
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1000 (progn
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1001 (display-buffer occur-buf)
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1002 (setq next-error-last-buffer occur-buf))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1003 (kill-buffer occur-buf)))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1004 (run-hooks 'occur-hook))
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1005 (setq buffer-read-only t)
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1006 (set-buffer-modified-p nil))))
18991
2cf48aa123b8 (occur): Local variable line-start redundant.
Richard M. Stallman <rms@gnu.org>
parents: 18918
diff changeset
1007
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1008 (defun occur-engine-add-prefix (lines)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1009 (mapcar
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1010 #'(lambda (line)
47532
e5d8cf249294 (occur-engine-add-prefix): Use 7 spaces.
Richard M. Stallman <rms@gnu.org>
parents: 47375
diff changeset
1011 (concat " :" line "\n"))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1012 lines))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1013
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1014 (defun occur-engine (regexp buffers out-buf nlines case-fold-search
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1015 title-face prefix-face match-face keep-props)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1016 (with-current-buffer out-buf
48276
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1017 (let ((globalcount 0)
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1018 (coding nil))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1019 ;; Map over all the buffers
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1020 (dolist (buf buffers)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1021 (when (buffer-live-p buf)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1022 (let ((matches 0) ;; count of matched lines
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1023 (lines 1) ;; line count
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1024 (matchbeg 0)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1025 (origpt nil)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1026 (begpt nil)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1027 (endpt nil)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1028 (marker nil)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1029 (curstring "")
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1030 (headerpt (with-current-buffer out-buf (point))))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1031 (save-excursion
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1032 (set-buffer buf)
48276
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1033 (or coding
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1034 ;; Set CODING only if the current buffer locally
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1035 ;; binds buffer-file-coding-system.
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1036 (not (local-variable-p 'buffer-file-coding-system))
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1037 (setq coding buffer-file-coding-system))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1038 (save-excursion
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1039 (goto-char (point-min)) ;; begin searching in the buffer
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1040 (while (not (eobp))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1041 (setq origpt (point))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1042 (when (setq endpt (re-search-forward regexp nil t))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1043 (setq matches (1+ matches)) ;; increment match count
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
1044 (setq matchbeg (match-beginning 0))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1045 (setq lines (+ lines (1- (count-lines origpt endpt))))
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1046 (save-excursion
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1047 (goto-char matchbeg)
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1048 (setq begpt (line-beginning-position)
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1049 endpt (line-end-position)))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1050 (setq marker (make-marker))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1051 (set-marker marker matchbeg)
59570
3d6f4d8e0b8b (occur-accumulate-lines, occur-engine): Avoid warnings.
Richard M. Stallman <rms@gnu.org>
parents: 59479
diff changeset
1052 (if (and keep-props
3d6f4d8e0b8b (occur-accumulate-lines, occur-engine): Avoid warnings.
Richard M. Stallman <rms@gnu.org>
parents: 59479
diff changeset
1053 (if (boundp 'jit-lock-mode) jit-lock-mode)
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1054 (text-property-not-all begpt endpt 'fontified t))
59570
3d6f4d8e0b8b (occur-accumulate-lines, occur-engine): Avoid warnings.
Richard M. Stallman <rms@gnu.org>
parents: 59479
diff changeset
1055 (if (fboundp 'jit-lock-fontify-now)
3d6f4d8e0b8b (occur-accumulate-lines, occur-engine): Avoid warnings.
Richard M. Stallman <rms@gnu.org>
parents: 59479
diff changeset
1056 (jit-lock-fontify-now begpt endpt)))
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1057 (setq curstring (buffer-substring begpt endpt))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1058 ;; Depropertize the string, and maybe
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1059 ;; highlight the matches
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1060 (let ((len (length curstring))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1061 (start 0))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1062 (unless keep-props
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1063 (set-text-properties 0 len nil curstring))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1064 (while (and (< start len)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1065 (string-match regexp curstring start))
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1066 (add-text-properties
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1067 (match-beginning 0) (match-end 0)
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1068 (append
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1069 `(occur-match t)
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1070 (when match-face
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1071 ;; Use `face' rather than `font-lock-face' here
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1072 ;; so as to override faces copied from the buffer.
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1073 `(face ,match-face)))
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1074 curstring)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1075 (setq start (match-end 0))))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1076 ;; Generate the string to insert for this match
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1077 (let* ((out-line
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1078 (concat
47532
e5d8cf249294 (occur-engine-add-prefix): Use 7 spaces.
Richard M. Stallman <rms@gnu.org>
parents: 47375
diff changeset
1079 ;; Using 7 digits aligns tabs properly.
e5d8cf249294 (occur-engine-add-prefix): Use 7 spaces.
Richard M. Stallman <rms@gnu.org>
parents: 47375
diff changeset
1080 (apply #'propertize (format "%7d:" lines)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1081 (append
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1082 (when prefix-face
45689
01fbc1331841 (occur-mode): Don't set up categories.
Colin Walters <walters@gnu.org>
parents: 45529
diff changeset
1083 `(font-lock-face prefix-face))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1084 '(occur-prefix t)))
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1085 ;; We don't put `mouse-face' on the newline,
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1086 ;; because that loses. And don't put it
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1087 ;; on context lines to reduce flicker.
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1088 (propertize curstring 'mouse-face 'highlight)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1089 "\n"))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1090 (data
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1091 (if (= nlines 0)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1092 ;; The simple display style
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1093 out-line
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1094 ;; The complex multi-line display
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1095 ;; style. Generate a list of lines,
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1096 ;; concatenate them all together.
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1097 (apply #'concat
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1098 (nconc
56520
feaa69f279aa (occur-next-error): Call set-window-point.
Richard M. Stallman <rms@gnu.org>
parents: 56449
diff changeset
1099 (occur-engine-add-prefix (nreverse (cdr (occur-accumulate-lines (- (1+ (abs nlines))) keep-props))))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1100 (list out-line)
56520
feaa69f279aa (occur-next-error): Call set-window-point.
Richard M. Stallman <rms@gnu.org>
parents: 56449
diff changeset
1101 (if (> nlines 0)
feaa69f279aa (occur-next-error): Call set-window-point.
Richard M. Stallman <rms@gnu.org>
parents: 56449
diff changeset
1102 (occur-engine-add-prefix
feaa69f279aa (occur-next-error): Call set-window-point.
Richard M. Stallman <rms@gnu.org>
parents: 56449
diff changeset
1103 (cdr (occur-accumulate-lines (1+ nlines) keep-props)))))))))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1104 ;; Actually insert the match display data
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1105 (with-current-buffer out-buf
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1106 (let ((beg (point))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1107 (end (progn (insert data) (point))))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1108 (unless (= nlines 0)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1109 (insert "-------\n"))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1110 (add-text-properties
45490
177f92e9f497 (occur-engine): Include all text properties except mouse-face on the
Colin Walters <walters@gnu.org>
parents: 45444
diff changeset
1111 beg end
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1112 `(occur-target ,marker help-echo "mouse-2: go to this occurrence")))))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1113 (goto-char endpt))
45265
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1114 (if endpt
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1115 (progn
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1116 (setq lines (1+ lines))
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1117 ;; On to the next match...
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1118 (forward-line 1))
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1119 (goto-char (point-max))))))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1120 (when (not (zerop matches)) ;; is the count zero?
45444
84e0e49bfb75 (occur-engine): Increment globalcount all at once after searching a buffer.
Colin Walters <walters@gnu.org>
parents: 45308
diff changeset
1121 (setq globalcount (+ globalcount matches))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1122 (with-current-buffer out-buf
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1123 (goto-char headerpt)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1124 (let ((beg (point))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1125 end)
54778
edec41928fc8 * replace.el (occur-engine): Distinguish between one and several
John Paul Wallington <jpw@pobox.com>
parents: 54375
diff changeset
1126 (insert (format "%d match%s for \"%s\" in buffer: %s\n"
edec41928fc8 * replace.el (occur-engine): Distinguish between one and several
John Paul Wallington <jpw@pobox.com>
parents: 54375
diff changeset
1127 matches (if (= matches 1) "" "es")
edec41928fc8 * replace.el (occur-engine): Distinguish between one and several
John Paul Wallington <jpw@pobox.com>
parents: 54375
diff changeset
1128 regexp (buffer-name buf)))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1129 (setq end (point))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1130 (add-text-properties beg end
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1131 (append
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1132 (when title-face
45689
01fbc1331841 (occur-mode): Don't set up categories.
Colin Walters <walters@gnu.org>
parents: 45529
diff changeset
1133 `(font-lock-face ,title-face))
01fbc1331841 (occur-mode): Don't set up categories.
Colin Walters <walters@gnu.org>
parents: 45529
diff changeset
1134 `(occur-title ,buf))))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1135 (goto-char (point-min)))))))
48276
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1136 (if coding
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1137 ;; CODING is buffer-file-coding-system of the first buffer
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1138 ;; that locally binds it. Let's use it also for the output
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1139 ;; buffer.
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1140 (set-buffer-file-coding-system coding))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1141 ;; Return the number of matches
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1142 globalcount)))
18991
2cf48aa123b8 (occur): Local variable line-start redundant.
Richard M. Stallman <rms@gnu.org>
parents: 18918
diff changeset
1143
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1144
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1145 ;; It would be nice to use \\[...], but there is no reasonable way
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1146 ;; to make that display both SPC and Y.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1147 (defconst query-replace-help
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1148 "Type Space or `y' to replace one match, Delete or `n' to skip to next,
5337
0740b2a454d9 (query-replace-map): Don't bind ESC.
Richard M. Stallman <rms@gnu.org>
parents: 5298
diff changeset
1149 RET or `q' to exit, Period to replace one match and exit,
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1150 Comma to replace but not move point immediately,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1151 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
1152 C-w to delete match and recursive edit,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1153 C-l to clear the screen, redisplay, and offer same replacement again,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1154 ! to replace all remaining matches with no more questions,
28801
be3f5fa41e90 (query-replace-map): Add binding for `E'.
Gerd Moellmann <gerd@gnu.org>
parents: 28706
diff changeset
1155 ^ to move point back to previous match,
be3f5fa41e90 (query-replace-map): Add binding for `E'.
Gerd Moellmann <gerd@gnu.org>
parents: 28706
diff changeset
1156 E to edit the replacement string"
38036
018637678f29 (case-replace, query-replace-from-history-variable)
Eli Zaretskii <eliz@gnu.org>
parents: 37832
diff changeset
1157 "Help message while in `query-replace'.")
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1158
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1159 (defvar query-replace-map (make-sparse-keymap)
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1160 "Keymap that defines the responses to questions in `query-replace'.
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1161 The \"bindings\" in this map are not commands; they are answers.
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1162 The valid answers include `act', `skip', `act-and-show',
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1163 `exit', `act-and-exit', `edit', `delete-and-edit', `recenter',
10057
460fecc93446 (query-replace-map): Define \e and escape as exit-prefix.
Richard M. Stallman <rms@gnu.org>
parents: 9908
diff changeset
1164 `automatic', `backup', `exit-prefix', and `help'.")
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1165
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1166 (define-key query-replace-map " " 'act)
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1167 (define-key query-replace-map "\d" 'skip)
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1168 (define-key query-replace-map [delete] 'skip)
2327
61b35714d880 (query-replace-map): Define backspace like delete.
Richard M. Stallman <rms@gnu.org>
parents: 2315
diff changeset
1169 (define-key query-replace-map [backspace] 'skip)
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1170 (define-key query-replace-map "y" 'act)
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1171 (define-key query-replace-map "n" 'skip)
9908
32d20ec5ed51 (query-replace-map): Bind Y and N like y and n.
Richard M. Stallman <rms@gnu.org>
parents: 9847
diff changeset
1172 (define-key query-replace-map "Y" 'act)
32d20ec5ed51 (query-replace-map): Bind Y and N like y and n.
Richard M. Stallman <rms@gnu.org>
parents: 9847
diff changeset
1173 (define-key query-replace-map "N" 'skip)
29971
939e6ca411e9 (query-replace-map): Bind `e' like `E'.
Gerd Moellmann <gerd@gnu.org>
parents: 29952
diff changeset
1174 (define-key query-replace-map "e" 'edit-replacement)
28801
be3f5fa41e90 (query-replace-map): Add binding for `E'.
Gerd Moellmann <gerd@gnu.org>
parents: 28706
diff changeset
1175 (define-key query-replace-map "E" 'edit-replacement)
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1176 (define-key query-replace-map "," 'act-and-show)
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1177 (define-key query-replace-map "q" 'exit)
3852
e365900ca7e7 * replace.el (query-replace-map): Make return exit query-replace,
Jim Blandy <jimb@redhat.com>
parents: 2709
diff changeset
1178 (define-key query-replace-map "\r" 'exit)
3885
d89645572b0f * replace.el (query-replace-map): Fix typo in binding for [return].
Jim Blandy <jimb@redhat.com>
parents: 3852
diff changeset
1179 (define-key query-replace-map [return] 'exit)
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1180 (define-key query-replace-map "." 'act-and-exit)
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1181 (define-key query-replace-map "\C-r" 'edit)
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1182 (define-key query-replace-map "\C-w" 'delete-and-edit)
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1183 (define-key query-replace-map "\C-l" 'recenter)
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1184 (define-key query-replace-map "!" 'automatic)
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1185 (define-key query-replace-map "^" 'backup)
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1186 (define-key query-replace-map "\C-h" 'help)
12109
6be53feb3323 (query-replace-map): Bind f1 and help.
Karl Heuer <kwzh@gnu.org>
parents: 11314
diff changeset
1187 (define-key query-replace-map [f1] 'help)
6be53feb3323 (query-replace-map): Bind f1 and help.
Karl Heuer <kwzh@gnu.org>
parents: 11314
diff changeset
1188 (define-key query-replace-map [help] 'help)
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1189 (define-key query-replace-map "?" 'help)
2083
ff782069e797 (query-replace-map): Add `quit' bindings. Delete default binding.
Richard M. Stallman <rms@gnu.org>
parents: 2080
diff changeset
1190 (define-key query-replace-map "\C-g" 'quit)
ff782069e797 (query-replace-map): Add `quit' bindings. Delete default binding.
Richard M. Stallman <rms@gnu.org>
parents: 2080
diff changeset
1191 (define-key query-replace-map "\C-]" 'quit)
10057
460fecc93446 (query-replace-map): Define \e and escape as exit-prefix.
Richard M. Stallman <rms@gnu.org>
parents: 9908
diff changeset
1192 (define-key query-replace-map "\e" 'exit-prefix)
460fecc93446 (query-replace-map): Define \e and escape as exit-prefix.
Richard M. Stallman <rms@gnu.org>
parents: 9908
diff changeset
1193 (define-key query-replace-map [escape] 'exit-prefix)
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1194
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1195 (defun replace-match-string-symbols (n)
29051
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1196 "Process a list (and any sub-lists), expanding certain symbols.
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1197 Symbol Expands To
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1198 N (match-string N) (where N is a string of digits)
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1199 #N (string-to-number (match-string N))
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1200 & (match-string 0)
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1201 #& (string-to-number (match-string 0))
56148
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1202 # replace-count
29051
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1203
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1204 Note that these symbols must be preceeded by a backslash in order to
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1205 type them."
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1206 (while n
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1207 (cond
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1208 ((consp (car n))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1209 (replace-match-string-symbols (car n))) ;Process sub-list
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1210 ((symbolp (car n))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1211 (let ((name (symbol-name (car n))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1212 (cond
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1213 ((string-match "^[0-9]+$" name)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1214 (setcar n (list 'match-string (string-to-number name))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1215 ((string-match "^#[0-9]+$" name)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1216 (setcar n (list 'string-to-number
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1217 (list 'match-string
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1218 (string-to-number (substring name 1))))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1219 ((string= "&" name)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1220 (setcar n '(match-string 0)))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1221 ((string= "#&" name)
56148
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1222 (setcar n '(string-to-number (match-string 0))))
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1223 ((string= "#" name)
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1224 (setcar n 'replace-count))))))
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1225 (setq n (cdr n))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1226
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1227 (defun replace-eval-replacement (expression replace-count)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1228 (let ((replacement (eval expression)))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1229 (if (stringp replacement)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1230 replacement
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1231 (prin1-to-string replacement t))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1232
56148
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1233 (defun replace-quote (replacement)
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1234 "Quote a replacement string.
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1235 This just doubles all backslashes in REPLACEMENT and
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1236 returns the resulting string. If REPLACEMENT is not
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1237 a string, it is first passed through `prin1-to-string'
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1238 with the `noescape' argument set.
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1239
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1240 `match-data' is preserved across the call."
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1241 (save-match-data
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1242 (replace-regexp-in-string "\\\\" "\\\\"
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1243 (if (stringp replacement)
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1244 replacement
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1245 (prin1-to-string replacement t))
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1246 t t)))
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1247
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1248 (defun replace-loop-through-replacements (data replace-count)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1249 ;; DATA is a vector contaning the following values:
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1250 ;; 0 next-rotate-count
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1251 ;; 1 repeat-count
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1252 ;; 2 next-replacement
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1253 ;; 3 replacements
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1254 (if (= (aref data 0) replace-count)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1255 (progn
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1256 (aset data 0 (+ replace-count (aref data 1)))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1257 (let ((next (cdr (aref data 2))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1258 (aset data 2 (if (consp next) next (aref data 3))))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1259 (car (aref data 2)))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1260
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1261 (defun replace-match-data (integers reuse &optional new)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1262 "Like `match-data', but markers in REUSE get invalidated.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1263 If NEW is non-NIL, it is set and returned instead of fresh data,
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1264 but coerced to the correct value of INTEGERS."
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1265 (or (and new
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1266 (progn
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1267 (set-match-data new)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1268 (and (eq new reuse)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1269 (eq (null integers) (markerp (car reuse)))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1270 new)))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1271 (match-data integers
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1272 (prog1 reuse
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1273 (while reuse
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1274 (if (markerp (car reuse))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1275 (set-marker (car reuse) nil))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1276 (setq reuse (cdr reuse)))))))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1277
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1278 (defun replace-match-maybe-edit (newtext fixedcase literal noedit match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1279 "Make a replacement with `replace-match', editing `\\?'.
58913
0b183affb969 (replace-match-maybe-edit): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 58741
diff changeset
1280 NEWTEXT, FIXEDCASE, LITERAL are just passed on. If NOEDIT is true, no
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1281 check for `\\?' is made to save time. MATCH-DATA is used for the
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1282 replacement. In case editing is done, it is changed to use markers.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1283
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1284 The return value is non-NIL if there has been no `\\?' or NOEDIT was
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1285 passed in. If LITERAL is set, no checking is done, anyway."
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1286 (unless (or literal noedit)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1287 (setq noedit t)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1288 (while (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\(\\\\\\?\\)"
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1289 newtext)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1290 (setq newtext
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1291 (read-input "Edit replacement string: "
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1292 (prog1
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1293 (cons
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1294 (replace-match "" t t newtext 3)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1295 (1+ (match-beginning 3)))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1296 (setq match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1297 (replace-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1298 nil match-data match-data))))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1299 noedit nil)))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1300 (set-match-data match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1301 (replace-match newtext fixedcase literal)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1302 noedit)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1303
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1304 (defun perform-replace (from-string replacements
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1305 query-flag regexp-flag delimited-flag
40254
51c9985454e3 (perform-replace): Move START and END parameters
Gerd Moellmann <gerd@gnu.org>
parents: 38986
diff changeset
1306 &optional repeat-count map start end)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1307 "Subroutine of `query-replace'. Its complexity handles interactive queries.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1308 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
1309 just as `query-replace' does. Instead, write a simple loop like this:
38675
a7b1d283fe97 (perform-replace): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents: 38414
diff changeset
1310
a7b1d283fe97 (perform-replace): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents: 38414
diff changeset
1311 (while (re-search-forward \"foo[ \\t]+bar\" nil t)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1312 (replace-match \"foobar\" nil nil))
38675
a7b1d283fe97 (perform-replace): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents: 38414
diff changeset
1313
a7b1d283fe97 (perform-replace): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents: 38414
diff changeset
1314 which will run faster and probably do exactly what you want. Please
a7b1d283fe97 (perform-replace): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents: 38414
diff changeset
1315 see the documentation of `replace-match' to find out how to simulate
45529
45014630aeb2 (perform-replace): Document return value. Use `pop'.
Colin Walters <walters@gnu.org>
parents: 45490
diff changeset
1316 `case-replace'.
45014630aeb2 (perform-replace): Document return value. Use `pop'.
Colin Walters <walters@gnu.org>
parents: 45490
diff changeset
1317
45014630aeb2 (perform-replace): Document return value. Use `pop'.
Colin Walters <walters@gnu.org>
parents: 45490
diff changeset
1318 This function returns nil if and only if there were no matches to
45014630aeb2 (perform-replace): Document return value. Use `pop'.
Colin Walters <walters@gnu.org>
parents: 45490
diff changeset
1319 make, or the user didn't cancel the call."
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1320 (or map (setq map query-replace-map))
16631
024d3847af99 (perform-replace): Obey minibuffer-auto-raise.
Richard M. Stallman <rms@gnu.org>
parents: 16129
diff changeset
1321 (and query-flag minibuffer-auto-raise
024d3847af99 (perform-replace): Obey minibuffer-auto-raise.
Richard M. Stallman <rms@gnu.org>
parents: 16129
diff changeset
1322 (raise-frame (window-frame (minibuffer-window))))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1323 (let ((nocasify (not (and case-fold-search case-replace
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1324 (string-equal from-string
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1325 (downcase from-string)))))
25039
7a53fe8294bf (perform-replace): Turn off case-fold-search
Karl Heuer <kwzh@gnu.org>
parents: 23457
diff changeset
1326 (case-fold-search (and case-fold-search
7a53fe8294bf (perform-replace): Turn off case-fold-search
Karl Heuer <kwzh@gnu.org>
parents: 23457
diff changeset
1327 (string-equal from-string
7a53fe8294bf (perform-replace): Turn off case-fold-search
Karl Heuer <kwzh@gnu.org>
parents: 23457
diff changeset
1328 (downcase from-string))))
53778
7898852aa054 (perform-replace): Allow 'literal argument in
David Kastrup <dak@gnu.org>
parents: 52401
diff changeset
1329 (literal (or (not regexp-flag) (eq regexp-flag 'literal)))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1330 (search-function (if regexp-flag 're-search-forward 'search-forward))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1331 (search-string from-string)
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
1332 (real-match-data nil) ; the match data for the current match
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1333 (next-replacement nil)
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1334 (noedit nil)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1335 (keep-going t)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1336 (stack nil)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1337 (replace-count 0)
18433
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1338 (nonempty-match nil)
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1339
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
1340 ;; If non-nil, it is marker saying where in the buffer to stop.
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
1341 (limit nil)
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
1342
18433
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1343 ;; Data for the next match. If a cons, it has the same format as
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1344 ;; (match-data); otherwise it is t if a match is possible at point.
16725
cdc897a9054f (perform-replace): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents: 16713
diff changeset
1345 (match-again t)
18433
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1346
7258
68c7b93914fe (perform-replace): Call substitute-command-keys just once
Richard M. Stallman <rms@gnu.org>
parents: 6722
diff changeset
1347 (message
68c7b93914fe (perform-replace): Call substitute-command-keys just once
Richard M. Stallman <rms@gnu.org>
parents: 6722
diff changeset
1348 (if query-flag
68c7b93914fe (perform-replace): Call substitute-command-keys just once
Richard M. Stallman <rms@gnu.org>
parents: 6722
diff changeset
1349 (substitute-command-keys
68c7b93914fe (perform-replace): Call substitute-command-keys just once
Richard M. Stallman <rms@gnu.org>
parents: 6722
diff changeset
1350 "Query replacing %s with %s: (\\<query-replace-map>\\[help] for help) "))))
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
1351
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
1352 ;; If region is active, in Transient Mark mode, operate on region.
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
1353 (when start
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
1354 (setq limit (copy-marker (max start end)))
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
1355 (goto-char (min start end))
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
1356 (deactivate-mark))
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1357
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1358 ;; REPLACEMENTS is either a string, a list of strings, or a cons cell
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1359 ;; containing a function and its first argument. The function is
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1360 ;; called to generate each replacement like this:
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1361 ;; (funcall (car replacements) (cdr replacements) replace-count)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1362 ;; It must return a string.
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1363 (cond
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1364 ((stringp replacements)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1365 (setq next-replacement replacements
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1366 replacements nil))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1367 ((stringp (car replacements)) ; If it isn't a string, it must be a cons
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1368 (or repeat-count (setq repeat-count 1))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1369 (setq replacements (cons 'replace-loop-through-replacements
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1370 (vector repeat-count repeat-count
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1371 replacements replacements)))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1372
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1373 (if delimited-flag
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1374 (setq search-function 're-search-forward
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1375 search-string (concat "\\b"
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1376 (if regexp-flag from-string
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1377 (regexp-quote from-string))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1378 "\\b")))
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1379 (when query-replace-lazy-highlight
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1380 (setq isearch-lazy-highlight-last-string nil))
58914
f55019d052ed * replace.el (query-replace-highlight): Add new value `isearch'
Juri Linkov <juri@jurta.org>
parents: 58913
diff changeset
1381
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1382 (push-mark)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1383 (undo-boundary)
5393
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1384 (unwind-protect
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1385 ;; Loop finding occurrences that perhaps should be replaced.
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1386 (while (and keep-going
56006
21eb4b5cef9a (perform-replace): Use `limit' to terminate the while-loop explicitly.
Juri Linkov <juri@jurta.org>
parents: 55868
diff changeset
1387 (not (or (eobp) (and limit (>= (point) limit))))
18433
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1388 ;; Use the next match if it is already known;
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1389 ;; otherwise, search for a match after moving forward
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1390 ;; one char if progress is required.
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1391 (setq real-match-data
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1392 (if (consp match-again)
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1393 (progn (goto-char (nth 1 match-again))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1394 (replace-match-data t
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1395 real-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1396 match-again))
18433
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1397 (and (or match-again
29952
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1398 ;; MATCH-AGAIN non-nil means we
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1399 ;; accept an adjacent match. If
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1400 ;; we don't, move one char to the
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1401 ;; right. This takes us a
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1402 ;; character too far at the end,
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1403 ;; but this is undone after the
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1404 ;; while-loop.
56006
21eb4b5cef9a (perform-replace): Use `limit' to terminate the while-loop explicitly.
Juri Linkov <juri@jurta.org>
parents: 55868
diff changeset
1405 (progn
21eb4b5cef9a (perform-replace): Use `limit' to terminate the while-loop explicitly.
Juri Linkov <juri@jurta.org>
parents: 55868
diff changeset
1406 (forward-char 1)
21eb4b5cef9a (perform-replace): Use `limit' to terminate the while-loop explicitly.
Juri Linkov <juri@jurta.org>
parents: 55868
diff changeset
1407 (not (or (eobp)
21eb4b5cef9a (perform-replace): Use `limit' to terminate the while-loop explicitly.
Juri Linkov <juri@jurta.org>
parents: 55868
diff changeset
1408 (and limit (>= (point) limit))))))
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
1409 (funcall search-function search-string limit t)
18433
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1410 ;; For speed, use only integers and
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1411 ;; reuse the list used last time.
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1412 (replace-match-data t real-match-data)))))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1413 ;; Optionally ignore matches that have a read-only property.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1414 (unless (and query-replace-skip-read-only
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1415 (text-property-not-all
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1416 (match-beginning 0) (match-end 0)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1417 'read-only nil))
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
1418
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1419 ;; Record whether the match is nonempty, to avoid an infinite loop
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1420 ;; repeatedly matching the same empty string.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1421 (setq nonempty-match
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1422 (/= (nth 0 real-match-data) (nth 1 real-match-data)))
34480
816fa0390935 (perform-replace): Don't use an empty match adjacent
Gerd Moellmann <gerd@gnu.org>
parents: 34290
diff changeset
1423
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1424 ;; If the match is empty, record that the next one can't be
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1425 ;; adjacent.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1426
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1427 ;; Otherwise, if matching a regular expression, do the next
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1428 ;; match now, since the replacement for this match may
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1429 ;; affect whether the next match is adjacent to this one.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1430 ;; If that match is empty, don't use it.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1431 (setq match-again
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1432 (and nonempty-match
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1433 (or (not regexp-flag)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1434 (and (looking-at search-string)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1435 (let ((match (match-data)))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1436 (and (/= (nth 0 match) (nth 1 match))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1437 match))))))
18433
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1438
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1439 ;; Calculate the replacement string, if necessary.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1440 (when replacements
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1441 (set-match-data real-match-data)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1442 (setq next-replacement
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1443 (funcall (car replacements) (cdr replacements)
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1444 replace-count)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1445 noedit nil))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1446 (if (not query-flag)
56262
29d03615f533 (perform-replace): Highlight the match even in
David Kastrup <dak@gnu.org>
parents: 56245
diff changeset
1447 (let ((inhibit-read-only
29d03615f533 (perform-replace): Highlight the match even in
David Kastrup <dak@gnu.org>
parents: 56245
diff changeset
1448 query-replace-skip-read-only))
58913
0b183affb969 (replace-match-maybe-edit): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 58741
diff changeset
1449 (unless (or literal noedit)
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1450 (replace-highlight
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1451 (nth 0 real-match-data) (nth 1 real-match-data)
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1452 start end search-string
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1453 (or delimited-flag regexp-flag) case-fold-search))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1454 (setq noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1455 (replace-match-maybe-edit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1456 next-replacement nocasify literal
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1457 noedit real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1458 replace-count (1+ replace-count)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1459 (undo-boundary)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1460 (let (done replaced key def)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1461 ;; Loop reading commands until one of them sets done,
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1462 ;; which means it has finished handling this
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1463 ;; occurrence. Any command that sets `done' should
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1464 ;; leave behind proper match data for the stack.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1465 ;; Commands not setting `done' need to adjust
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1466 ;; `real-match-data'.
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1467 (while (not done)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1468 (set-match-data real-match-data)
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1469 (replace-highlight
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1470 (match-beginning 0) (match-end 0)
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1471 start end search-string
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1472 (or delimited-flag regexp-flag) case-fold-search)
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1473 ;; Bind message-log-max so we don't fill up the message log
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1474 ;; with a bunch of identical messages.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1475 (let ((message-log-max nil))
57023
cf85be0f7afa (perform-replace): Use `query-replace-descr'.
Juri Linkov <juri@jurta.org>
parents: 56922
diff changeset
1476 (message message
cf85be0f7afa (perform-replace): Use `query-replace-descr'.
Juri Linkov <juri@jurta.org>
parents: 56922
diff changeset
1477 (query-replace-descr from-string)
cf85be0f7afa (perform-replace): Use `query-replace-descr'.
Juri Linkov <juri@jurta.org>
parents: 56922
diff changeset
1478 (query-replace-descr next-replacement)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1479 (setq key (read-event))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1480 ;; Necessary in case something happens during read-event
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1481 ;; that clobbers the match data.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1482 (set-match-data real-match-data)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1483 (setq key (vector key))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1484 (setq def (lookup-key map key))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1485 ;; Restore the match data while we process the command.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1486 (cond ((eq def 'help)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1487 (with-output-to-temp-buffer "*Help*"
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1488 (princ
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1489 (concat "Query replacing "
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1490 (if regexp-flag "regexp " "")
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1491 from-string " with "
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1492 next-replacement ".\n\n"
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1493 (substitute-command-keys
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1494 query-replace-help)))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1495 (with-current-buffer standard-output
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1496 (help-mode))))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1497 ((eq def 'exit)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1498 (setq keep-going nil)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1499 (setq done t))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1500 ((eq def 'backup)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1501 (if stack
45529
45014630aeb2 (perform-replace): Document return value. Use `pop'.
Colin Walters <walters@gnu.org>
parents: 45490
diff changeset
1502 (let ((elt (pop stack)))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1503 (goto-char (nth 0 elt))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1504 (setq replaced (nth 1 elt)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1505 real-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1506 (replace-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1507 t real-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1508 (nth 2 elt))))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1509 (message "No previous match")
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1510 (ding 'no-terminate)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1511 (sit-for 1)))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1512 ((eq def 'act)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1513 (or replaced
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1514 (setq noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1515 (replace-match-maybe-edit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1516 next-replacement nocasify literal
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1517 noedit real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1518 replace-count (1+ replace-count)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1519 (setq done t replaced t))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1520 ((eq def 'act-and-exit)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1521 (or replaced
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1522 (setq noedit
56273
610a9a9c39d0 (query-replace-read-args): Swallow a space after
Juri Linkov <juri@jurta.org>
parents: 56262
diff changeset
1523 (replace-match-maybe-edit
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1524 next-replacement nocasify literal
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1525 noedit real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1526 replace-count (1+ replace-count)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1527 (setq keep-going nil)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1528 (setq done t replaced t))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1529 ((eq def 'act-and-show)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1530 (if (not replaced)
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1531 (setq noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1532 (replace-match-maybe-edit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1533 next-replacement nocasify literal
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1534 noedit real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1535 replace-count (1+ replace-count)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1536 real-match-data (replace-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1537 t real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1538 replaced t)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1539 ((eq def 'automatic)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1540 (or replaced
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1541 (setq noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1542 (replace-match-maybe-edit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1543 next-replacement nocasify literal
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1544 noedit real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1545 replace-count (1+ replace-count)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1546 (setq done t query-flag nil replaced t))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1547 ((eq def 'skip)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1548 (setq done t))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1549 ((eq def 'recenter)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1550 (recenter nil))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1551 ((eq def 'edit)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1552 (let ((opos (point-marker)))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1553 (setq real-match-data (replace-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1554 nil real-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1555 real-match-data))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1556 (goto-char (match-beginning 0))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1557 (save-excursion
44138
f1d7c706f7f7 (query-replace-read-args): New optional arg NOERROR.
Richard M. Stallman <rms@gnu.org>
parents: 43406
diff changeset
1558 (save-window-excursion
f1d7c706f7f7 (query-replace-read-args): New optional arg NOERROR.
Richard M. Stallman <rms@gnu.org>
parents: 43406
diff changeset
1559 (recursive-edit)))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1560 (goto-char opos)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1561 (set-marker opos nil))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1562 ;; Before we make the replacement,
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1563 ;; decide whether the search string
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1564 ;; can match again just after this match.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1565 (if (and regexp-flag nonempty-match)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1566 (setq match-again (and (looking-at search-string)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1567 (match-data)))))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1568 ;; Edit replacement.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1569 ((eq def 'edit-replacement)
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1570 (setq real-match-data (replace-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1571 nil real-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1572 real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1573 next-replacement
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1574 (read-input "Edit replacement string: "
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1575 next-replacement)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1576 noedit nil)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1577 (if replaced
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1578 (set-match-data real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1579 (setq noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1580 (replace-match-maybe-edit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1581 next-replacement nocasify literal noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1582 real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1583 replaced t))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1584 (setq done t))
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1585
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1586 ((eq def 'delete-and-edit)
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1587 (replace-match "" t t)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1588 (setq real-match-data (replace-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1589 nil real-match-data))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1590 (replace-dehighlight)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1591 (save-excursion (recursive-edit))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1592 (setq replaced t))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1593 ;; Note: we do not need to treat `exit-prefix'
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1594 ;; specially here, since we reread
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1595 ;; any unrecognized character.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1596 (t
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1597 (setq this-command 'mode-exited)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1598 (setq keep-going nil)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1599 (setq unread-command-events
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1600 (append (listify-key-sequence key)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1601 unread-command-events))
58914
f55019d052ed * replace.el (query-replace-highlight): Add new value `isearch'
Juri Linkov <juri@jurta.org>
parents: 58913
diff changeset
1602 (setq done t)))
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1603 (when query-replace-lazy-highlight
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1604 ;; Force lazy rehighlighting only after replacements
58914
f55019d052ed * replace.el (query-replace-highlight): Add new value `isearch'
Juri Linkov <juri@jurta.org>
parents: 58913
diff changeset
1605 (if (not (memq def '(skip backup)))
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1606 (setq isearch-lazy-highlight-last-string nil))))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1607 ;; Record previous position for ^ when we move on.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1608 ;; Change markers to numbers in the match data
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1609 ;; since lots of markers slow down editing.
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1610 (push (list (point) replaced
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1611 ;;; If the replacement has already happened, all we need is the
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1612 ;;; current match start and end. We could get this with a trivial
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1613 ;;; match like
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1614 ;;; (save-excursion (goto-char (match-beginning 0))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1615 ;;; (search-forward (match-string 0))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1616 ;;; (match-data t))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1617 ;;; if we really wanted to avoid manually constructing match data.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1618 ;;; Adding current-buffer is necessary so that match-data calls can
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1619 ;;; return markers which are appropriate for editing.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1620 (if replaced
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1621 (list
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1622 (match-beginning 0)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1623 (match-end 0)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1624 (current-buffer))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1625 (match-data t)))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1626 stack)))))
29952
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1627
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1628 ;; The code preventing adjacent regexp matches in the condition
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1629 ;; of the while-loop above will haven taken us one character
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1630 ;; beyond the last replacement. Undo that.
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1631 (when (and regexp-flag (not match-again) (> replace-count 0))
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1632 (backward-char 1))
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1633
5393
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1634 (replace-dehighlight))
10157
7953cde9d951 (perform-replace): Report number of replacements when done.
Richard M. Stallman <rms@gnu.org>
parents: 10155
diff changeset
1635 (or unread-command-events
7953cde9d951 (perform-replace): Report number of replacements when done.
Richard M. Stallman <rms@gnu.org>
parents: 10155
diff changeset
1636 (message "Replaced %d occurrence%s"
7953cde9d951 (perform-replace): Report number of replacements when done.
Richard M. Stallman <rms@gnu.org>
parents: 10155
diff changeset
1637 replace-count
7953cde9d951 (perform-replace): Report number of replacements when done.
Richard M. Stallman <rms@gnu.org>
parents: 10155
diff changeset
1638 (if (= replace-count 1) "" "s")))
7953cde9d951 (perform-replace): Report number of replacements when done.
Richard M. Stallman <rms@gnu.org>
parents: 10155
diff changeset
1639 (and keep-going stack)))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1640
5393
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1641 (defvar replace-overlay nil)
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1642
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1643 (defun replace-highlight (match-beg match-end range-beg range-end
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1644 string regexp case-fold)
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1645 (if query-replace-highlight
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1646 (if replace-overlay
60101
aa148fbcec2e (perform-replace): Pass new args to replace-highlight.
Richard M. Stallman <rms@gnu.org>
parents: 59996
diff changeset
1647 (move-overlay replace-overlay match-beg match-end (current-buffer))
aa148fbcec2e (perform-replace): Pass new args to replace-highlight.
Richard M. Stallman <rms@gnu.org>
parents: 59996
diff changeset
1648 (setq replace-overlay (make-overlay match-beg match-end))
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1649 (overlay-put replace-overlay 'priority 1) ;higher than lazy overlays
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1650 (overlay-put replace-overlay 'face 'query-replace)))
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1651 (if query-replace-lazy-highlight
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1652 (let ((isearch-string string)
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1653 (isearch-regexp regexp)
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1654 (isearch-case-fold-search case-fold))
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1655 (isearch-lazy-highlight-new-loop range-beg range-end))))
5393
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1656
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1657 (defun replace-dehighlight ()
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1658 (when replace-overlay
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1659 (delete-overlay replace-overlay))
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1660 (when query-replace-lazy-highlight
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1661 (lazy-highlight-cleanup lazy-highlight-cleanup)
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1662 (setq isearch-lazy-highlight-last-string nil)))
5393
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1663
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
1664 ;; arch-tag: 16b4cd61-fd40-497b-b86f-b667c4cf88e4
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 324
diff changeset
1665 ;;; replace.el ends here