annotate lisp/replace.el @ 110410:f2e111723c3a

Merge changes made in Gnus trunk. Reimplement nnimap, and do tweaks to the rest of the code to support that. * gnus-int.el (gnus-finish-retrieve-group-infos) (gnus-retrieve-group-data-early): New functions. * gnus-range.el (gnus-range-nconcat): New function. * gnus-start.el (gnus-get-unread-articles): Support early retrieval of data. (gnus-read-active-for-groups): Support finishing the early retrieval of data. * gnus-sum.el (gnus-summary-move-article): Pass the move-to group name if the move is internal, so that nnimap can do fast internal moves. * gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for nnimap usage. * nnimap.el: Rewritten. * nnmail.el (nnmail-inhibit-default-split-group): New internal variable to allow the mail splitting to not return a default group. This is useful for nnimap, which will leave unmatched mail in the inbox. * utf7.el (utf7-encode): Autoload. Implement shell connection. * nnimap.el (nnimap-open-shell-stream): New function. (nnimap-open-connection): Use it. Get the number of lines by using BODYSTRUCTURE. (nnimap-transform-headers): Get the number of lines in each message. (nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the number of lines. Not all servers return UIDNEXT. Work past this problem. Remove junk from end of file. Fix typo in "bogus" section. Make capabilties be case-insensitive. Require cl when compiling. Don't bug out if the LIST command doesn't have any parameters. 2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change) * nnimap.el (nnimap-get-groups): Don't bug out if the LIST command doesn't have any parameters. (mm-text-html-renderer): Document gnus-article-html. 2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix) * mm-decode.el (mm-text-html-renderer): Document gnus-article-html. * dgnushack.el: Define netrc-credentials. If the user doesn't have a /etc/services, supply some sensible port defaults. Have `unseen-or-unread' select an unread unseen article first. (nntp-open-server): Return whether the open was successful or not. Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ). Save result so that it doesn't say "failed" all the time. Add ~/.authinfo to the default, since that's probably most useful for users. Don't use the "finish" method when we're reading from the agent. Add some more nnimap-relevant agent stuff to nnagent.el. * nnimap.el (nnimap-with-process-buffer): Removed. Revert one line that was changed by mistake in the last checkin. (nnimap-open-connection): Don't error out when we can't make a connection nnimap-related changes to avoid bugging out if we can't contact a server. * gnus-start.el (gnus-get-unread-articles): Don't try to scan groups from methods that are denied. * nnimap.el (nnimap-possibly-change-group): Return nil if we can't log in. (nnimap-finish-retrieve-group-infos): Make sure we're not waiting for nothing. * gnus-sum.el (gnus-select-newsgroup): Indent.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sat, 18 Sep 2010 10:02:19 +0000
parents 280c8ae2476d
children 88e55e239ecc
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
64762
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64503
diff changeset
3 ;; Copyright (C) 1985, 1986, 1987, 1992, 1994, 1996, 1997, 2000, 2001,
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 106325
diff changeset
4 ;; 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
101013
dbe70c3aa01d Replace last-input-char with last-input-event.
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
5 ;; Free Software Foundation, Inc.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6
45078
829beb9a6a4b Follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 44924
diff changeset
7 ;; Maintainer: FSF
110015
280c8ae2476d Add "Package:" file headers to denote built-in packages.
Chong Yidong <cyd@stupidchicken.com>
parents: 109716
diff changeset
8 ;; Package: emacs
45078
829beb9a6a4b Follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 44924
diff changeset
9
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94525
diff changeset
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94525
diff changeset
14 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94525
diff changeset
15 ;; (at your option) any later version.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94525
diff changeset
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
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
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
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
107417
a24389e7f686 Use query-replace-{from,to}-history-variable in more places.
Glenn Morris <rgm@gnu.org>
parents: 106815
diff changeset
37 (defvar query-replace-history nil
a24389e7f686 Use query-replace-{from,to}-history-variable in more places.
Glenn Morris <rgm@gnu.org>
parents: 106815
diff changeset
38 "Default history list for query-replace commands.
a24389e7f686 Use query-replace-{from,to}-history-variable in more places.
Glenn Morris <rgm@gnu.org>
parents: 106815
diff changeset
39 See `query-replace-from-history-variable' and
a24389e7f686 Use query-replace-{from,to}-history-variable in more places.
Glenn Morris <rgm@gnu.org>
parents: 106815
diff changeset
40 `query-replace-to-history-variable'.")
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
41
71025
82d1f472baee * replace.el (query-replace-defaults): New variable.
Chong Yidong <cyd@stupidchicken.com>
parents: 70936
diff changeset
42 (defvar query-replace-defaults nil
82d1f472baee * replace.el (query-replace-defaults): New variable.
Chong Yidong <cyd@stupidchicken.com>
parents: 70936
diff changeset
43 "Default values of FROM-STRING and TO-STRING for `query-replace'.
82d1f472baee * replace.el (query-replace-defaults): New variable.
Chong Yidong <cyd@stupidchicken.com>
parents: 70936
diff changeset
44 This is a cons cell (FROM-STRING . TO-STRING), or nil if there is
82d1f472baee * replace.el (query-replace-defaults): New variable.
Chong Yidong <cyd@stupidchicken.com>
parents: 70936
diff changeset
45 no default value.")
82d1f472baee * replace.el (query-replace-defaults): New variable.
Chong Yidong <cyd@stupidchicken.com>
parents: 70936
diff changeset
46
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
47 (defvar query-replace-interactive nil
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
48 "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
49 That becomes the \"string to replace\".")
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
50
20806
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
51 (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
52 "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
53 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
54 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
55 or patterns to be replaced."
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
56 :group 'matching
21669
9861518505cb *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 21294
diff changeset
57 :type 'symbol
9861518505cb *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 21294
diff changeset
58 :version "20.3")
20806
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
59
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
60 (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
61 "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
62 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
63 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
64 strings or patterns."
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
65 :group 'matching
21669
9861518505cb *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 21294
diff changeset
66 :type 'symbol
9861518505cb *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 21294
diff changeset
67 :version "20.3")
20806
24a1fcdc31d7 (query-replace-from-history-variable): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20658
diff changeset
68
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
69 (defcustom query-replace-skip-read-only nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
70 "Non-nil means `query-replace' and friends ignore read-only matches."
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
71 :type 'boolean
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
72 :group 'matching
59996
aac0a33f5772 Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents: 59570
diff changeset
73 :version "22.1")
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
74
86018
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
75 (defcustom query-replace-show-replacement t
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
76 "Non-nil means to show what actual replacement text will be."
86018
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
77 :type 'boolean
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
78 :group 'matching
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
79 :version "23.1")
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
80
59479
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
81 (defcustom query-replace-highlight t
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
82 "Non-nil means to highlight matches during query replacement."
59479
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
83 :type 'boolean
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
84 :group 'matching)
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
85
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
86 (defcustom query-replace-lazy-highlight t
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
87 "Controls the lazy-highlighting during query replacements.
59479
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
88 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
89 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
90 `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
91 :type 'boolean
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
92 :group 'lazy-highlight
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
93 :group 'matching
59996
aac0a33f5772 Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents: 59570
diff changeset
94 :version "22.1")
59479
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
95
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
96 (defface query-replace
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
97 '((t (:inherit isearch)))
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
98 "Face for highlighting query replacement matches."
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
99 :group 'matching
59996
aac0a33f5772 Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents: 59570
diff changeset
100 :version "22.1")
59479
fea2bcedb7bf (query-replace-lazy-highlight): Add lazy-highlight group.
Juri Linkov <juri@jurta.org>
parents: 59341
diff changeset
101
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
102 (defun query-replace-descr (string)
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
103 (mapconcat 'isearch-text-char-description string ""))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
104
64866
6f20cb2a3b72 (query-replace-read-from, query-replace-read-to)
Juri Linkov <juri@jurta.org>
parents: 64823
diff changeset
105 (defun query-replace-read-from (prompt regexp-flag)
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
106 "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
107 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
108 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
109 (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
110 (car (if regexp-flag regexp-search-ring search-ring))
71125
21306dd42b3c (query-replace-read-from, query-replace-read-to):
Juri Linkov <juri@jurta.org>
parents: 71026
diff changeset
111 (let* ((history-add-new-input nil)
21306dd42b3c (query-replace-read-from, query-replace-read-to):
Juri Linkov <juri@jurta.org>
parents: 71026
diff changeset
112 (from
56351
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
113 ;; 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
114 ;; 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
115 ;; 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
116 (save-excursion
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
117 (read-from-minibuffer
71025
82d1f472baee * replace.el (query-replace-defaults): New variable.
Chong Yidong <cyd@stupidchicken.com>
parents: 70936
diff changeset
118 (if query-replace-defaults
64866
6f20cb2a3b72 (query-replace-read-from, query-replace-read-to)
Juri Linkov <juri@jurta.org>
parents: 64823
diff changeset
119 (format "%s (default %s -> %s): " prompt
71025
82d1f472baee * replace.el (query-replace-defaults): New variable.
Chong Yidong <cyd@stupidchicken.com>
parents: 70936
diff changeset
120 (query-replace-descr (car query-replace-defaults))
82d1f472baee * replace.el (query-replace-defaults): New variable.
Chong Yidong <cyd@stupidchicken.com>
parents: 70936
diff changeset
121 (query-replace-descr (cdr query-replace-defaults)))
64866
6f20cb2a3b72 (query-replace-read-from, query-replace-read-to)
Juri Linkov <juri@jurta.org>
parents: 64823
diff changeset
122 (format "%s: " prompt))
56351
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
123 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
124 query-replace-from-history-variable
70936
83ce2ddffd16 (query-replace-read-from, query-replace-read-to):
Juri Linkov <juri@jurta.org>
parents: 70349
diff changeset
125 nil t))))
71025
82d1f472baee * replace.el (query-replace-defaults): New variable.
Chong Yidong <cyd@stupidchicken.com>
parents: 70936
diff changeset
126 (if (and (zerop (length from)) query-replace-defaults)
71026
b5294b4387c4 Fix last change.
Chong Yidong <cyd@stupidchicken.com>
parents: 71025
diff changeset
127 (cons (car query-replace-defaults)
b5294b4387c4 Fix last change.
Chong Yidong <cyd@stupidchicken.com>
parents: 71025
diff changeset
128 (query-replace-compile-replacement
b5294b4387c4 Fix last change.
Chong Yidong <cyd@stupidchicken.com>
parents: 71025
diff changeset
129 (cdr query-replace-defaults) regexp-flag))
71125
21306dd42b3c (query-replace-read-from, query-replace-read-to):
Juri Linkov <juri@jurta.org>
parents: 71026
diff changeset
130 (add-to-history query-replace-from-history-variable from nil t)
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
131 ;; 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
132 (and regexp-flag
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
133 (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\(\\\\[nt]\\)" from)
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
134 (let ((match (match-string 3 from)))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
135 (cond
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
136 ((string= match "\\n")
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
137 (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
138 ((string= match "\\t")
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
139 (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
140 (sit-for 2)))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
141 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
142
56581
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
143 (defun query-replace-compile-replacement (to regexp-flag)
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
144 "Maybe convert a regexp replacement TO to Lisp.
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
145 Returns a list suitable for `perform-replace' if necessary,
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
146 the original string if not."
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
147 (if (and regexp-flag
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
148 (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\\\[,#]" to))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
149 (let (pos list char)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
150 (while
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
151 (progn
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
152 (setq pos (match-end 0))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
153 (push (substring to 0 (- pos 2)) list)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
154 (setq char (aref to (1- pos))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
155 to (substring to pos))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
156 (cond ((eq char ?\#)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
157 (push '(number-to-string replace-count) list))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
158 ((eq char ?\,)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
159 (setq pos (read-from-string to))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
160 (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
161 (let ((end
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
162 ;; 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
163 ;; 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
164 (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
165 ;; 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
166 ;; 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
167 (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
168 (not (= ?\( (aref to 0)))))
cc1deb864ed6 (query-replace-read-args): Swallow space after 'foo,
Juri Linkov <juri@jurta.org>
parents: 56325
diff changeset
169 (eq (string-match " " to (cdr pos))
cc1deb864ed6 (query-replace-read-args): Swallow space after 'foo,
Juri Linkov <juri@jurta.org>
parents: 56325
diff changeset
170 (cdr pos)))
56325
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
171 (1+ (cdr pos))
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
172 (cdr pos))))
06c785c5e655 (query-replace-read-args): Swallow space after symbols, not after
Richard M. Stallman <rms@gnu.org>
parents: 56304
diff changeset
173 (setq to (substring to end)))))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
174 (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\\\[,#]" to)))
56581
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
175 (setq to (nreverse (delete "" (cons to list))))
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
176 (replace-match-string-symbols to)
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
177 (cons 'replace-eval-replacement
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
178 (if (cdr to)
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
179 (cons 'concat to)
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
180 (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
181 to))
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
182
56581
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
183
64866
6f20cb2a3b72 (query-replace-read-from, query-replace-read-to)
Juri Linkov <juri@jurta.org>
parents: 64823
diff changeset
184 (defun query-replace-read-to (from prompt regexp-flag)
56581
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
185 "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
186 (query-replace-compile-replacement
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
187 (save-excursion
71125
21306dd42b3c (query-replace-read-from, query-replace-read-to):
Juri Linkov <juri@jurta.org>
parents: 71026
diff changeset
188 (let* ((history-add-new-input nil)
21306dd42b3c (query-replace-read-from, query-replace-read-to):
Juri Linkov <juri@jurta.org>
parents: 71026
diff changeset
189 (to (read-from-minibuffer
21306dd42b3c (query-replace-read-from, query-replace-read-to):
Juri Linkov <juri@jurta.org>
parents: 71026
diff changeset
190 (format "%s %s with: " prompt (query-replace-descr from))
21306dd42b3c (query-replace-read-from, query-replace-read-to):
Juri Linkov <juri@jurta.org>
parents: 71026
diff changeset
191 nil nil nil
21306dd42b3c (query-replace-read-from, query-replace-read-to):
Juri Linkov <juri@jurta.org>
parents: 71026
diff changeset
192 query-replace-to-history-variable from t)))
21306dd42b3c (query-replace-read-from, query-replace-read-to):
Juri Linkov <juri@jurta.org>
parents: 71026
diff changeset
193 (add-to-history query-replace-to-history-variable to nil t)
71025
82d1f472baee * replace.el (query-replace-defaults): New variable.
Chong Yidong <cyd@stupidchicken.com>
parents: 70936
diff changeset
194 (setq query-replace-defaults (cons from to))
82d1f472baee * replace.el (query-replace-defaults): New variable.
Chong Yidong <cyd@stupidchicken.com>
parents: 70936
diff changeset
195 to))
56581
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
196 regexp-flag))
6cfb1ef9200f (query-replace-read-from): Use
David Kastrup <dak@gnu.org>
parents: 56520
diff changeset
197
64866
6f20cb2a3b72 (query-replace-read-from, query-replace-read-to)
Juri Linkov <juri@jurta.org>
parents: 64823
diff changeset
198 (defun query-replace-read-args (prompt regexp-flag &optional noerror)
56351
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
199 (unless noerror
d073da76f0a5 (query-replace-read-from, query-replace-read-to): New funs extracted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56350
diff changeset
200 (barf-if-buffer-read-only))
64866
6f20cb2a3b72 (query-replace-read-from, query-replace-read-to)
Juri Linkov <juri@jurta.org>
parents: 64823
diff changeset
201 (let* ((from (query-replace-read-from prompt regexp-flag))
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
202 (to (if (consp from) (prog1 (cdr from) (setq from (car from)))
64866
6f20cb2a3b72 (query-replace-read-from, query-replace-read-to)
Juri Linkov <juri@jurta.org>
parents: 64823
diff changeset
203 (query-replace-read-to from prompt regexp-flag))))
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
204 (list from to current-prefix-arg)))
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
205
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
206 (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
207 "Replace some occurrences of FROM-STRING with TO-STRING.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
208 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
209 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
210
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
211 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
212 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
213
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
214 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
215 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
216 minibuffer.
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
217
48173
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
218 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
219 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
220 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
221 `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
222 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
223 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
224 or capitalized.)
10104
8a04af3511c1 (replace-string, query-replace): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 10069
diff changeset
225
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
226 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
227 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
228 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
229
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
230 To customize possible responses, change the \"bindings\" in `query-replace-map'."
98913
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
231 (interactive
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
232 (let ((common
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
233 (query-replace-read-args
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
234 (concat "Query replace"
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
235 (if current-prefix-arg " word" "")
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
236 (if (and transient-mark-mode mark-active) " in region" ""))
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
237 nil)))
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
238 (list (nth 0 common) (nth 1 common) (nth 2 common)
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
239 ;; These are done separately here
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
240 ;; so that command-history will record these expressions
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
241 ;; rather than the values they had this time.
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
242 (if (and transient-mark-mode mark-active)
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
243 (region-beginning))
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
244 (if (and transient-mark-mode mark-active)
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
245 (region-end)))))
40254
51c9985454e3 (perform-replace): Move START and END parameters
Gerd Moellmann <gerd@gnu.org>
parents: 38986
diff changeset
246 (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
247
268
2dd411fe2f72 *** empty log message ***
Brian Preble <rassilon@gnu.org>
parents: 264
diff changeset
248 (define-key esc-map "%" 'query-replace)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
249
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
250 (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
251 "Replace some things after point matching REGEXP with TO-STRING.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
252 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
253 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
254
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
255 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
256 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
257
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
258 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
259 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
260 minibuffer.
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
261
48173
b0db4f794e73 (query-replace, query-replace-regexp): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 47593
diff changeset
262 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
263 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
264 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
265 `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
266 \(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
267 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
268 capitalized.)
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
269
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
270 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
271 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
272 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
273
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
274 In TO-STRING, `\\&' stands for whatever matched the whole of REGEXP,
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
275 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
276 whatever what matched the Nth `\\(...\\)' in REGEXP.
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
277 `\\?' 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
278 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
279
56245
93e88c0fb51c (query-replace-read-args): Swallow space after \,SYMBOL.
Richard M. Stallman <rms@gnu.org>
parents: 56228
diff changeset
280 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
281 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
282 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
283 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
284 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
285 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
286 `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
287 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
288
56245
93e88c0fb51c (query-replace-read-args): Swallow space after \,SYMBOL.
Richard M. Stallman <rms@gnu.org>
parents: 56228
diff changeset
289 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
290 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
291
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
292 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
293 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
294 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
295 (interactive
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
296 (let ((common
63150
571afd8b238a (replace-match-data): Pass RESEAT arg `t' to
Kim F. Storm <storm@cua.dk>
parents: 62737
diff changeset
297 (query-replace-read-args
98913
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
298 (concat "Query replace"
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
299 (if current-prefix-arg " word" "")
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
300 " regexp"
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
301 (if (and transient-mark-mode mark-active) " in region" ""))
60174
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
302 t)))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
303 (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
304 ;; These are done separately here
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
305 ;; so that command-history will record these expressions
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
306 ;; rather than the values they had this time.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
307 (if (and transient-mark-mode mark-active)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
308 (region-beginning))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
309 (if (and transient-mark-mode mark-active)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
310 (region-end)))))
56148
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
311 (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
312
22353
402ebb81ae84 (esc-map): Bind C-M-% to query-replace-regexp.
Karl Heuer <kwzh@gnu.org>
parents: 21669
diff changeset
313 (define-key esc-map [?\C-%] 'query-replace-regexp)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
314
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
315 (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
316 "Replace some things after point matching REGEXP with the result of TO-EXPR.
77286
0f67bcedb447 * NEWS: Mention `query-replace-regexp-eval' being deprecated.
David Kastrup <dak@gnu.org>
parents: 76749
diff changeset
317
0f67bcedb447 * NEWS: Mention `query-replace-regexp-eval' being deprecated.
David Kastrup <dak@gnu.org>
parents: 76749
diff changeset
318 Interactive use of this function is deprecated in favor of the
0f67bcedb447 * NEWS: Mention `query-replace-regexp-eval' being deprecated.
David Kastrup <dak@gnu.org>
parents: 76749
diff changeset
319 `\\,' feature of `query-replace-regexp'. For non-interactive use, a loop
0f67bcedb447 * NEWS: Mention `query-replace-regexp-eval' being deprecated.
David Kastrup <dak@gnu.org>
parents: 76749
diff changeset
320 using `search-forward-regexp' and `replace-match' is preferred.
0f67bcedb447 * NEWS: Mention `query-replace-regexp-eval' being deprecated.
David Kastrup <dak@gnu.org>
parents: 76749
diff changeset
321
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
322 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
323 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
324
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
325 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
326 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
327 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
328 `prin1-to-string' with the NOESCAPE argument (which see).
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
329
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
330 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
331 `\\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
332 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
333 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
334 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
335
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
336 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
337 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
338
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
339 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
340 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
341 minibuffer.
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
342
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
343 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
344 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
345
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
346 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
347 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
348 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
349 (interactive
56360
a9b695d281d4 (query-replace-regexp-eval): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56355
diff changeset
350 (progn
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
351 (barf-if-buffer-read-only)
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
352 (let* ((from
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
353 ;; 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
354 ;; 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
355 ;; leave it off. --Stef
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
356 (let ((query-replace-to-history-variable nil))
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
357 (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
358 (to (list (read-from-minibuffer
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
359 (format "Query replace regexp %s with eval: "
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
360 (query-replace-descr from))
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
361 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
362 ;; 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
363 ;; and the user might enter a single token.
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
364 (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
365 (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
366 (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
367 (region-beginning))
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
368 (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
369 (region-end))))))
27391
abaa4ac29f51 (query-replace): Rename last arg to DELIMITED.
Richard M. Stallman <rms@gnu.org>
parents: 25167
diff changeset
370 (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
371 t 'literal delimited nil nil start end))
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
372
77286
0f67bcedb447 * NEWS: Mention `query-replace-regexp-eval' being deprecated.
David Kastrup <dak@gnu.org>
parents: 76749
diff changeset
373 (make-obsolete 'query-replace-regexp-eval
0f67bcedb447 * NEWS: Mention `query-replace-regexp-eval' being deprecated.
David Kastrup <dak@gnu.org>
parents: 76749
diff changeset
374 "for interactive use, use the special `\\,' feature of
0f67bcedb447 * NEWS: Mention `query-replace-regexp-eval' being deprecated.
David Kastrup <dak@gnu.org>
parents: 76749
diff changeset
375 `query-replace-regexp' instead. Non-interactively, a loop
0f67bcedb447 * NEWS: Mention `query-replace-regexp-eval' being deprecated.
David Kastrup <dak@gnu.org>
parents: 76749
diff changeset
376 using `search-forward-regexp' and `replace-match' is preferred." "22.1")
0f67bcedb447 * NEWS: Mention `query-replace-regexp-eval' being deprecated.
David Kastrup <dak@gnu.org>
parents: 76749
diff changeset
377
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
378 (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
379 "Replace some matches for REGEXP with various strings, in rotation.
79449
d326128c6b13 (map-query-replace-regexp): Doc fix (revert part of revision 1.104,
Juanma Barranquero <lekktu@gmail.com>
parents: 78236
diff changeset
380 The second argument TO-STRINGS contains the replacement strings, separated
d326128c6b13 (map-query-replace-regexp): Doc fix (revert part of revision 1.104,
Juanma Barranquero <lekktu@gmail.com>
parents: 78236
diff changeset
381 by spaces. This command works like `query-replace-regexp' except that
d326128c6b13 (map-query-replace-regexp): Doc fix (revert part of revision 1.104,
Juanma Barranquero <lekktu@gmail.com>
parents: 78236
diff changeset
382 each successive replacement uses the next successive replacement string,
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
383 wrapping around from the last such string to the first.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
384
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
385 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
386 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
387
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
388 Non-interactively, TO-STRINGS may be a list of replacement strings.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
389
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
390 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
391 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
392
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
393 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
394 before rotating to the next.
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
395 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
396 (interactive
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
397 (let* ((from (if query-replace-interactive
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
398 (car regexp-search-ring)
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
399 (read-from-minibuffer "Map query replace (regexp): "
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
400 nil nil nil
107417
a24389e7f686 Use query-replace-{from,to}-history-variable in more places.
Glenn Morris <rgm@gnu.org>
parents: 106815
diff changeset
401 query-replace-from-history-variable
a24389e7f686 Use query-replace-{from,to}-history-variable in more places.
Glenn Morris <rgm@gnu.org>
parents: 106815
diff changeset
402 nil t)))
56350
cae4ae1c68a9 (query-replace-interactive, query-replace-read-args):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56328
diff changeset
403 (to (read-from-minibuffer
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
404 (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
405 (query-replace-descr from))
864
fe5f6b7c9727 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 862
diff changeset
406 nil nil nil
107417
a24389e7f686 Use query-replace-{from,to}-history-variable in more places.
Glenn Morris <rgm@gnu.org>
parents: 106815
diff changeset
407 query-replace-to-history-variable from t)))
50030
1ec92786c9eb (query-replace-read-args): Use save-excursion.
Richard M. Stallman <rms@gnu.org>
parents: 49958
diff changeset
408 (list from to
1ec92786c9eb (query-replace-read-args): Use save-excursion.
Richard M. Stallman <rms@gnu.org>
parents: 49958
diff changeset
409 (and current-prefix-arg
1ec92786c9eb (query-replace-read-args): Use save-excursion.
Richard M. Stallman <rms@gnu.org>
parents: 49958
diff changeset
410 (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
411 (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
412 (region-beginning))
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
413 (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
414 (region-end)))))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
415 (let (replacements)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
416 (if (listp to-strings)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
417 (setq replacements to-strings)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
418 (while (/= (length to-strings) 0)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
419 (if (string-match " " to-strings)
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
420 (setq replacements
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
421 (append replacements
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
422 (list (substring to-strings 0
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
423 (string-match " " to-strings))))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
424 to-strings (substring to-strings
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
425 (1+ (string-match " " to-strings))))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
426 (setq replacements (append replacements (list to-strings))
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
427 to-strings ""))))
40254
51c9985454e3 (perform-replace): Move START and END parameters
Gerd Moellmann <gerd@gnu.org>
parents: 38986
diff changeset
428 (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
429
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
430 (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
431 "Replace occurrences of FROM-STRING with TO-STRING.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
432 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
433 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
434 \(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
435 then its replacement is upcased or capitalized.)
8a04af3511c1 (replace-string, query-replace): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 10069
diff changeset
436
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
437 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
438 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
439
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
440 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
441 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
442 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
443
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
444 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
445 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
446 minibuffer.
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
447
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
448 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
449 What you probably want is a loop like this:
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
450 (while (search-forward FROM-STRING nil t)
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
451 (replace-match TO-STRING nil t))
17211
ecf78b4eb138 (replace-string): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 17010
diff changeset
452 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
453 \(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
454 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
455 (interactive
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
456 (let ((common
63150
571afd8b238a (replace-match-data): Pass RESEAT arg `t' to
Kim F. Storm <storm@cua.dk>
parents: 62737
diff changeset
457 (query-replace-read-args
98913
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
458 (concat "Replace"
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
459 (if current-prefix-arg " word" "")
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
460 " string"
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
461 (if (and transient-mark-mode mark-active) " in region" ""))
60174
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
462 nil)))
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
463 (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
464 (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
465 (region-beginning))
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
466 (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
467 (region-end)))))
40254
51c9985454e3 (perform-replace): Move START and END parameters
Gerd Moellmann <gerd@gnu.org>
parents: 38986
diff changeset
468 (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
469
28706
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
470 (defun replace-regexp (regexp to-string &optional delimited start end)
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
471 "Replace things after point matching REGEXP with TO-STRING.
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
472 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
473 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
474
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
475 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
476 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
477
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
478 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
479 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
480 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
481
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
482 In TO-STRING, `\\&' stands for whatever matched the whole of REGEXP,
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
483 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
484 whatever what matched the Nth `\\(...\\)' in REGEXP.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
485 `\\?' 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
486 at the given position for each replacement.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
487
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
488 In interactive calls, the replacement text may contain `\\,'
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
489 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
490 text. Inside of that expression, `\\&' is a string denoting the
75131
61dcb71f259c (replace-regexp): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 74578
diff changeset
491 whole match, `\\N' a partial match, `\\#&' and `\\#N' the respective
61dcb71f259c (replace-regexp): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 74578
diff changeset
492 numeric values from `string-to-number', and `\\#' itself for
61dcb71f259c (replace-regexp): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 74578
diff changeset
493 `replace-count', the number of replacements occurred so far.
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
494
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
495 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
496 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
497 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
498 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
499 replacement text directly.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
500
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
501 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
502 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
503 Use \\[repeat-complex-command] after this command for details.
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
504
8935
0e9e6ff083e8 (query-replace-interactive): New user option.
Richard M. Stallman <rms@gnu.org>
parents: 8664
diff changeset
505 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
506 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
507
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
508 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
509 What you probably want is a loop like this:
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
510 (while (re-search-forward REGEXP nil t)
6707
31fce442168a Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 6635
diff changeset
511 (replace-match TO-STRING nil nil))
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
512 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
513 (interactive
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
514 (let ((common
63150
571afd8b238a (replace-match-data): Pass RESEAT arg `t' to
Kim F. Storm <storm@cua.dk>
parents: 62737
diff changeset
515 (query-replace-read-args
98913
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
516 (concat "Replace"
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
517 (if current-prefix-arg " word" "")
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
518 " regexp"
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
519 (if (and transient-mark-mode mark-active) " in region" ""))
60174
85f04f438e03 (query-replace, query-replace-regexp)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 60159
diff changeset
520 t)))
49958
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
521 (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
522 (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
523 (region-beginning))
4b86a185b11d (query-replace-read-args): Return just 3 values.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
524 (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
525 (region-end)))))
40254
51c9985454e3 (perform-replace): Move START and END parameters
Gerd Moellmann <gerd@gnu.org>
parents: 38986
diff changeset
526 (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
527
2408
a9c05a12b615 (regexp-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 2327
diff changeset
528
a9c05a12b615 (regexp-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 2327
diff changeset
529 (defvar regexp-history nil
79596
b55facd69022 (regexp-history): Add reference to `history-length' in the doc string.
Eli Zaretskii <eliz@gnu.org>
parents: 79449
diff changeset
530 "History list for some commands that read regular expressions.
b55facd69022 (regexp-history): Add reference to `history-length' in the doc string.
Eli Zaretskii <eliz@gnu.org>
parents: 79449
diff changeset
531
b55facd69022 (regexp-history): Add reference to `history-length' in the doc string.
Eli Zaretskii <eliz@gnu.org>
parents: 79449
diff changeset
532 Maximum length of the history list is determined by the value
b55facd69022 (regexp-history): Add reference to `history-length' in the doc string.
Eli Zaretskii <eliz@gnu.org>
parents: 79449
diff changeset
533 of `history-length', which see.")
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
534
98909
5574362352ff (read-regexp): Rename arg `default' to `default-value'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 98145
diff changeset
535 (defun read-regexp (prompt &optional default-value)
96419
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
536 "Read regexp as a string using the regexp history and some useful defaults.
97082
922b39c63813 (read-regexp): Add second arg `default'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 96908
diff changeset
537 Prompt for a regular expression with PROMPT (without a colon and
98909
5574362352ff (read-regexp): Rename arg `default' to `default-value'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 98145
diff changeset
538 space) in the minibuffer. The optional argument DEFAULT-VALUE
5574362352ff (read-regexp): Rename arg `default' to `default-value'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 98145
diff changeset
539 provides the value to display in the minibuffer prompt that is
5574362352ff (read-regexp): Rename arg `default' to `default-value'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 98145
diff changeset
540 returned if the user just types RET.
5574362352ff (read-regexp): Rename arg `default' to `default-value'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 98145
diff changeset
541 Values available via M-n are the string at point, the last isearch
5574362352ff (read-regexp): Rename arg `default' to `default-value'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 98145
diff changeset
542 regexp, the last isearch string, and the last replacement regexp."
97082
922b39c63813 (read-regexp): Add second arg `default'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 96908
diff changeset
543 (let* ((defaults
96419
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
544 (list (regexp-quote
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
545 (or (funcall (or find-tag-default-function
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
546 (get major-mode 'find-tag-default-function)
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
547 'find-tag-default))
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
548 ""))
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
549 (car regexp-search-ring)
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
550 (regexp-quote (or (car search-ring) ""))
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
551 (car (symbol-value
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
552 query-replace-from-history-variable))))
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
553 (defaults (delete-dups (delq nil (delete "" defaults))))
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
554 ;; Don't add automatically the car of defaults for empty input
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
555 (history-add-new-input nil)
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
556 (input
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
557 (read-from-minibuffer
98909
5574362352ff (read-regexp): Rename arg `default' to `default-value'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 98145
diff changeset
558 (if default-value
5574362352ff (read-regexp): Rename arg `default' to `default-value'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 98145
diff changeset
559 (format "%s (default %s): " prompt
5574362352ff (read-regexp): Rename arg `default' to `default-value'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 98145
diff changeset
560 (query-replace-descr default-value))
96419
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
561 (format "%s: " prompt))
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
562 nil nil nil 'regexp-history defaults t)))
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
563 (if (equal input "")
104244
97bc7c2be2d0 (read-regexp): Return empty string when `default-value' is nil.
Juri Linkov <juri@jurta.org>
parents: 102314
diff changeset
564 (or default-value input)
96419
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
565 (prog1 input
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
566 (add-to-history 'regexp-history input)))))
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
567
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
568
2571
b65cf676a09b All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2408
diff changeset
569 (defalias 'delete-non-matching-lines 'keep-lines)
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
570 (defalias 'delete-matching-lines 'flush-lines)
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
571 (defalias 'count-matches 'how-many)
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
572
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
573
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
574 (defun keep-lines-read-args (prompt)
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
575 "Read arguments for `keep-lines' and friends.
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
576 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
577 Value is a list, (REGEXP)."
104244
97bc7c2be2d0 (read-regexp): Return empty string when `default-value' is nil.
Juri Linkov <juri@jurta.org>
parents: 102314
diff changeset
578 (list (read-regexp prompt) nil nil t))
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
579
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
580 (defun keep-lines (regexp &optional rstart rend interactive)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
581 "Delete all lines except those containing matches for REGEXP.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
582 A match split across lines preserves all the lines it lies in.
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
583 When called from Lisp (and usually interactively as well, see below)
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
584 applies to all lines starting after point.
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
585
87211
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
586 If REGEXP contains upper case characters (excluding those preceded by `\\')
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
587 and `search-upper-case' is non-nil, the matching is case-sensitive.
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
588
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
589 Second and third arg RSTART and REND specify the region to operate on.
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
590 This command operates on (the accessible part of) all lines whose
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
591 accessible part is entirely contained in the region determined by RSTART
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
592 and REND. (A newline ending a line counts as part of that line.)
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
593
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
594 Interactively, in Transient Mark mode when the mark is active, operate
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
595 on all lines whose accessible part is entirely contained in the region.
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
596 Otherwise, the command applies to all lines starting after point.
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
597 When calling this function from Lisp, you can pretend that it was
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
598 called interactively by passing a non-nil INTERACTIVE argument.
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
599
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
600 This function starts looking for the next match from the end of
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
601 the previous match. Hence, it ignores matches that overlap
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
602 a previously found match."
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
603
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
604 (interactive
46519
6de9114ee49a (keep-lines, flush-lines): Interactively report
Richard M. Stallman <rms@gnu.org>
parents: 46335
diff changeset
605 (progn
6de9114ee49a (keep-lines, flush-lines): Interactively report
Richard M. Stallman <rms@gnu.org>
parents: 46335
diff changeset
606 (barf-if-buffer-read-only)
96419
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
607 (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
608 (if rstart
46335
b4e553fa1fa8 (flush-lines, keep-lines): Convert REND to a marker.
Richard M. Stallman <rms@gnu.org>
parents: 46004
diff changeset
609 (progn
b4e553fa1fa8 (flush-lines, keep-lines): Convert REND to a marker.
Richard M. Stallman <rms@gnu.org>
parents: 46004
diff changeset
610 (goto-char (min rstart rend))
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
611 (setq rend
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
612 (progn
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
613 (save-excursion
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
614 (goto-char (max rstart rend))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
615 (unless (or (bolp) (eobp))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
616 (forward-line 0))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
617 (point-marker)))))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
618 (if (and interactive transient-mark-mode mark-active)
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
619 (setq rstart (region-beginning)
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
620 rend (progn
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
621 (goto-char (region-end))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
622 (unless (or (bolp) (eobp))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
623 (forward-line 0))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
624 (point-marker)))
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
625 (setq rstart (point)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
626 rend (point-max-marker)))
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
627 (goto-char rstart))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
628 (save-excursion
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
629 (or (bolp) (forward-line 1))
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
630 (let ((start (point))
87211
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
631 (case-fold-search
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
632 (if (and case-fold-search search-upper-case)
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
633 (isearch-no-upper-case-p regexp t)
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
634 case-fold-search)))
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
635 (while (< (point) rend)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
636 ;; 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
637 (if (not (re-search-forward regexp rend 'move))
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
638 (delete-region start rend)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
639 (let ((end (save-excursion (goto-char (match-beginning 0))
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
640 (forward-line 0)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
641 (point))))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
642 ;; Now end is first char preserved by the new match.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
643 (if (< start end)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
644 (delete-region start end))))
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
645
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
646 (setq start (save-excursion (forward-line 1) (point)))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
647 ;; 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
648 (and (< (point) rend)
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
649 (= (match-beginning 0) (match-end 0))
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
650 (forward-char 1)))))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
651 (set-marker rend nil)
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
652 nil)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
653
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
654
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
655 (defun flush-lines (regexp &optional rstart rend interactive)
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
656 "Delete lines containing matches for REGEXP.
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
657 When called from Lisp (and usually when called interactively as
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
658 well, see below), applies to the part of the buffer after point.
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
659 The line point is in is deleted if and only if it contains a
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
660 match for regexp starting after point.
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
661
87211
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
662 If REGEXP contains upper case characters (excluding those preceded by `\\')
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
663 and `search-upper-case' is non-nil, the matching is case-sensitive.
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
664
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
665 Second and third arg RSTART and REND specify the region to operate on.
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
666 Lines partially contained in this region are deleted if and only if
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
667 they contain a match entirely contained in it.
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
668
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
669 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
670 on the contents of the region. Otherwise, operate from point to the
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
671 end of (the accessible portion of) the buffer. When calling this function
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
672 from Lisp, you can pretend that it was called interactively by passing
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
673 a non-nil INTERACTIVE argument.
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
674
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
675 If a match is split across lines, all the lines it lies in are deleted.
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
676 They are deleted _before_ looking for the next match. Hence, a match
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
677 starting on the same line at which another match ended is ignored."
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
678
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
679 (interactive
46519
6de9114ee49a (keep-lines, flush-lines): Interactively report
Richard M. Stallman <rms@gnu.org>
parents: 46335
diff changeset
680 (progn
6de9114ee49a (keep-lines, flush-lines): Interactively report
Richard M. Stallman <rms@gnu.org>
parents: 46335
diff changeset
681 (barf-if-buffer-read-only)
96419
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
682 (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
683 (if rstart
46335
b4e553fa1fa8 (flush-lines, keep-lines): Convert REND to a marker.
Richard M. Stallman <rms@gnu.org>
parents: 46004
diff changeset
684 (progn
b4e553fa1fa8 (flush-lines, keep-lines): Convert REND to a marker.
Richard M. Stallman <rms@gnu.org>
parents: 46004
diff changeset
685 (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
686 (setq rend (copy-marker (max rstart rend))))
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
687 (if (and interactive transient-mark-mode mark-active)
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
688 (setq rstart (region-beginning)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
689 rend (copy-marker (region-end)))
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
690 (setq rstart (point)
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
691 rend (point-max-marker)))
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
692 (goto-char rstart))
87211
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
693 (let ((case-fold-search
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
694 (if (and case-fold-search search-upper-case)
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
695 (isearch-no-upper-case-p regexp t)
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
696 case-fold-search)))
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
697 (save-excursion
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
698 (while (and (< (point) rend)
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
699 (re-search-forward regexp rend t))
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
700 (delete-region (save-excursion (goto-char (match-beginning 0))
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
701 (forward-line 0)
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
702 (point))
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
703 (progn (forward-line 1) (point))))))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
704 (set-marker rend nil)
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
705 nil)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
706
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
707
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
708 (defun how-many (regexp &optional rstart rend interactive)
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
709 "Print and return number of matches for REGEXP following point.
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
710 When called from Lisp and INTERACTIVE is omitted or nil, just return
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
711 the number, do not print it; if INTERACTIVE is t, the function behaves
99025
1a60a0445cab * replace.el (how-many): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 98913
diff changeset
712 in all respects as if it had been called interactively.
23457
3ca22a873859 (keep-lines, flush-lines, how-many):
Richard M. Stallman <rms@gnu.org>
parents: 23384
diff changeset
713
87211
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
714 If REGEXP contains upper case characters (excluding those preceded by `\\')
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
715 and `search-upper-case' is non-nil, the matching is case-sensitive.
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
716
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
717 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
718
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
719 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
720 on the contents of the region. Otherwise, operate from point to the
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
721 end of (the accessible portion of) the buffer.
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
722
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
723 This function starts looking for the next match from the end of
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
724 the previous match. Hence, it ignores matches that overlap
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
725 a previously found match."
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
726
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
727 (interactive
96419
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
728 (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
729 (save-excursion
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
730 (if rstart
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
731 (progn
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
732 (goto-char (min rstart rend))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
733 (setq rend (max rstart rend)))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
734 (if (and interactive transient-mark-mode mark-active)
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
735 (setq rstart (region-beginning)
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
736 rend (region-end))
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
737 (setq rstart (point)
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
738 rend (point-max)))
38040
79be85ef3a31 (keep-lines-read-args): Return just a regexp.
Richard M. Stallman <rms@gnu.org>
parents: 38036
diff changeset
739 (goto-char rstart))
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
740 (let ((count 0)
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
741 opoint
87211
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
742 (case-fold-search
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
743 (if (and case-fold-search search-upper-case)
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
744 (isearch-no-upper-case-p regexp t)
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
745 case-fold-search)))
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
746 (while (and (< (point) rend)
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
747 (progn (setq opoint (point))
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
748 (re-search-forward regexp rend t)))
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
749 (if (= opoint (point))
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
750 (forward-char 1)
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
751 (setq count (1+ count))))
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
752 (when interactive (message "%d occurrence%s"
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
753 count
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
754 (if (= count 1) "" "s")))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
755 count)))
32036
29b572780dea (keep-lines-read-args): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 30562
diff changeset
756
2408
a9c05a12b615 (regexp-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 2327
diff changeset
757
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
758 (defvar occur-mode-map
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
759 (let ((map (make-sparse-keymap)))
67187
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
760 ;; We use this alternative name, so we can use \\[occur-mode-mouse-goto].
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
761 (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
762 (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
763 (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
764 (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
765 (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
766 (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
767 (define-key map "\M-p" 'occur-prev)
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
768 (define-key map "r" 'occur-rename-buffer)
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
769 (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
770 (define-key map "g" 'revert-buffer)
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
771 (define-key map "q" 'quit-window)
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
772 (define-key map "z" 'kill-this-buffer)
57023
cf85be0f7afa (perform-replace): Use `query-replace-descr'.
Juri Linkov <juri@jurta.org>
parents: 56922
diff changeset
773 (define-key map "\C-c\C-f" 'next-error-follow-minor-mode)
86291
c92242b4fd11 (occur-mode-map): Add a major mode menu with entries
Dan Nicolaescu <dann@ics.uci.edu>
parents: 86238
diff changeset
774 (define-key map [menu-bar] (make-sparse-keymap))
c92242b4fd11 (occur-mode-map): Add a major mode menu with entries
Dan Nicolaescu <dann@ics.uci.edu>
parents: 86238
diff changeset
775 (define-key map [menu-bar occur]
105715
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
776 `(cons ,(purecopy "Occur") map))
86291
c92242b4fd11 (occur-mode-map): Add a major mode menu with entries
Dan Nicolaescu <dann@ics.uci.edu>
parents: 86238
diff changeset
777 (define-key map [next-error-follow-minor-mode]
c92242b4fd11 (occur-mode-map): Add a major mode menu with entries
Dan Nicolaescu <dann@ics.uci.edu>
parents: 86238
diff changeset
778 (menu-bar-make-mm-toggle next-error-follow-minor-mode
c92242b4fd11 (occur-mode-map): Add a major mode menu with entries
Dan Nicolaescu <dann@ics.uci.edu>
parents: 86238
diff changeset
779 "Auto Occurrence Display"
c92242b4fd11 (occur-mode-map): Add a major mode menu with entries
Dan Nicolaescu <dann@ics.uci.edu>
parents: 86238
diff changeset
780 "Display another occurrence when moving the cursor"))
105965
3f64b8380468 * textmodes/ispell.el (ispell-skip-region-alist):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105940
diff changeset
781 (define-key map [separator-1] menu-bar-separator)
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
782 (define-key map [kill-this-buffer]
105715
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
783 `(menu-item ,(purecopy "Kill occur buffer") kill-this-buffer
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
784 :help ,(purecopy "Kill the current *Occur* buffer")))
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
785 (define-key map [quit-window]
105715
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
786 `(menu-item ,(purecopy "Quit occur window") quit-window
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
787 :help ,(purecopy "Quit the current *Occur* buffer. Bury it, and maybe delete the selected frame")))
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
788 (define-key map [revert-buffer]
105715
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
789 `(menu-item ,(purecopy "Revert occur buffer") revert-buffer
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
790 :help ,(purecopy "Replace the text in the *Occur* buffer with the results of rerunning occur")))
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
791 (define-key map [clone-buffer]
105715
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
792 `(menu-item ,(purecopy "Clone occur buffer") clone-buffer
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
793 :help ,(purecopy "Create and return a twin copy of the current *Occur* buffer")))
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
794 (define-key map [occur-rename-buffer]
105715
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
795 `(menu-item ,(purecopy "Rename occur buffer") occur-rename-buffer
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
796 :help ,(purecopy "Rename the current *Occur* buffer to *Occur: original-buffer-name*.")))
105940
f7147d70f6ef * subr.el (menu-bar-separator): New defconst.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105715
diff changeset
797 (define-key map [separator-2] menu-bar-separator)
86291
c92242b4fd11 (occur-mode-map): Add a major mode menu with entries
Dan Nicolaescu <dann@ics.uci.edu>
parents: 86238
diff changeset
798 (define-key map [occur-mode-goto-occurrence-other-window]
105715
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
799 `(menu-item ,(purecopy "Go To Occurrence Other Window") occur-mode-goto-occurrence-other-window
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
800 :help ,(purecopy "Go to the occurrence the current line describes, in another window")))
86291
c92242b4fd11 (occur-mode-map): Add a major mode menu with entries
Dan Nicolaescu <dann@ics.uci.edu>
parents: 86238
diff changeset
801 (define-key map [occur-mode-goto-occurrence]
105715
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
802 `(menu-item ,(purecopy "Go To Occurrence") occur-mode-goto-occurrence
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
803 :help ,(purecopy "Go to the occurrence the current line describes")))
86291
c92242b4fd11 (occur-mode-map): Add a major mode menu with entries
Dan Nicolaescu <dann@ics.uci.edu>
parents: 86238
diff changeset
804 (define-key map [occur-mode-display-occurrence]
105715
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
805 `(menu-item ,(purecopy "Display Occurrence") occur-mode-display-occurrence
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
806 :help ,(purecopy "Display in another window the occurrence the current line describes")))
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
807 (define-key map [occur-next]
105715
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
808 `(menu-item ,(purecopy "Move to next match") occur-next
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
809 :help ,(purecopy "Move to the Nth (default 1) next match in an Occur mode buffer")))
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
810 (define-key map [occur-prev]
105715
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
811 `(menu-item ,(purecopy "Move to previous match") occur-prev
6b8dce5c4461 * puresize.h (BASE_PURESIZE): Increase to 1430000.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104244
diff changeset
812 :help ,(purecopy "Move to the Nth (default 1) previous match in an Occur mode buffer")))
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
813 map)
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
814 "Keymap for `occur-mode'.")
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
815
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
816 (defvar occur-revert-arguments nil
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
817 "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
818 See `occur-revert-function'.")
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
819
47111
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
820 (defcustom occur-mode-hook '(turn-on-font-lock)
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
821 "Hook run when entering Occur mode."
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
822 :type 'hook
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
823 :group 'matching)
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
824
356bbdda5f67 (occur-mode-hook): New hook.
Juanma Barranquero <lekktu@gmail.com>
parents: 47087
diff changeset
825 (defcustom occur-hook nil
63970
01120e702316 (occur-hook): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 63919
diff changeset
826 "Hook run by Occur when there are any matches."
45444
84e0e49bfb75 (occur-engine): Increment globalcount all at once after searching a buffer.
Colin Walters <walters@gnu.org>
parents: 45308
diff changeset
827 :type 'hook
84e0e49bfb75 (occur-engine): Increment globalcount all at once after searching a buffer.
Colin Walters <walters@gnu.org>
parents: 45308
diff changeset
828 :group 'matching)
84e0e49bfb75 (occur-engine): Increment globalcount all at once after searching a buffer.
Colin Walters <walters@gnu.org>
parents: 45308
diff changeset
829
87919
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
830 (defcustom occur-mode-find-occurrence-hook nil
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
831 "Hook run by Occur after locating an occurrence.
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
832 This will be called with the cursor position at the occurrence. An application
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
833 for this is to reveal context in an outline-mode when the occurrence is hidden."
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
834 :type 'hook
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
835 :group 'matching)
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
836
17655
8e35bb3ec2e2 (occur-mode): Add a mode-class property.
Richard M. Stallman <rms@gnu.org>
parents: 17638
diff changeset
837 (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
838 (defun occur-mode ()
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
839 "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
840 \\<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
841 \\[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
842 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
843
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
844 \\{occur-mode-map}"
47130
454f46344502 (occur-mode): Add interactive declaration.
Juanma Barranquero <lekktu@gmail.com>
parents: 47111
diff changeset
845 (interactive)
41329
040cb763bd64 (occur-mode): Undo 2001-5-20 change.
Richard M. Stallman <rms@gnu.org>
parents: 40925
diff changeset
846 (kill-all-local-variables)
040cb763bd64 (occur-mode): Undo 2001-5-20 change.
Richard M. Stallman <rms@gnu.org>
parents: 40925
diff changeset
847 (use-local-map occur-mode-map)
040cb763bd64 (occur-mode): Undo 2001-5-20 change.
Richard M. Stallman <rms@gnu.org>
parents: 40925
diff changeset
848 (setq major-mode 'occur-mode)
040cb763bd64 (occur-mode): Undo 2001-5-20 change.
Richard M. Stallman <rms@gnu.org>
parents: 40925
diff changeset
849 (setq mode-name "Occur")
37832
dd9ddcbf2b5f (keep-lines-read-args): Use `copy-marker'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37536
diff changeset
850 (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
851 (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
852 (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
853 (setq next-error-function 'occur-next-error)
62737
f5aef2123438 (occur-mode): Use run-mode-hooks.
Lute Kamstra <lute@gnu.org>
parents: 62458
diff changeset
854 (run-mode-hooks 'occur-mode-hook))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
855
16864
59ed508195a4 (occur-mode-map): Bind g to revert-buffer.
Richard M. Stallman <rms@gnu.org>
parents: 16819
diff changeset
856 (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
857 "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
858 (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
859
6596
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
860 (defun occur-mode-find-occurrence ()
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
861 (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
862 (unless pos
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
863 (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
864 (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
865 (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
866 pos))
6596
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
867
67187
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
868 (defalias 'occur-mode-mouse-goto 'occur-mode-goto-occurrence)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
869 (defun occur-mode-goto-occurrence (&optional event)
6596
80df3b456672 (occur-mode-find-occurrence): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 6410
diff changeset
870 "Go to the occurrence the current line describes."
67187
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
871 (interactive (list last-nonmenu-event))
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
872 (let ((pos
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
873 (if (null event)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
874 ;; Actually `event-end' works correctly with a nil argument as
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
875 ;; well, so we could dispense with this test, but let's not
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
876 ;; rely on this undocumented behavior.
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
877 (occur-mode-find-occurrence)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
878 (with-current-buffer (window-buffer (posn-window (event-end event)))
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
879 (save-excursion
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
880 (goto-char (posn-point (event-end event)))
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
881 (occur-mode-find-occurrence)))))
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
882 same-window-buffer-names
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
883 same-window-regexps)
67179
cfc0110bc143 * replace.el (occur-mode-goto-occurrence): Pop, don't switch.
Chong Yidong <cyd@stupidchicken.com>
parents: 66756
diff changeset
884 (pop-to-buffer (marker-buffer pos))
87919
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
885 (goto-char pos)
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
886 (run-hooks 'occur-mode-find-occurrence-hook)))
18918
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
887
42604
a49b37e22b38 (occur-mode-goto-occurrence-other-window): New command.
Richard M. Stallman <rms@gnu.org>
parents: 42430
diff changeset
888 (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
889 "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
890 (interactive)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
891 (let ((pos (occur-mode-find-occurrence)))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
892 (switch-to-buffer-other-window (marker-buffer pos))
87919
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
893 (goto-char pos)
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
894 (run-hooks 'occur-mode-find-occurrence-hook)))
42604
a49b37e22b38 (occur-mode-goto-occurrence-other-window): New command.
Richard M. Stallman <rms@gnu.org>
parents: 42430
diff changeset
895
42294
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
896 (defun occur-mode-display-occurrence ()
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
897 "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
898 (interactive)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
899 (let ((pos (occur-mode-find-occurrence))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
900 window
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
901 ;; 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
902 same-window-buffer-names
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
903 same-window-regexps)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
904 (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
905 ;; 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
906 (save-selected-window
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
907 (select-window window)
87919
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
908 (goto-char pos)
5e627a8698d8 * replace.el (occur-mode-find-occurrence-hook): New hook that can
Carsten Dominik <dominik@science.uva.nl>
parents: 87649
diff changeset
909 (run-hooks 'occur-mode-find-occurrence-hook))))
42294
d1c81a1250f2 (occur-mode-display-occurrence): New function.
Richard M. Stallman <rms@gnu.org>
parents: 41761
diff changeset
910
47593
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
911 (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
912 (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
913 (let ((r))
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
914 (while (> n 0)
47593
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
915 (setq r (funcall search (point) 'occur-match))
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
916 (and r
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
917 (get-text-property r 'occur-match)
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
918 (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
919 (if r
47593
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
920 (goto-char r)
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
921 (error message))
18918
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
922 (setq n (1- n)))))
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
923
47593
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
924 (defun occur-next (&optional n)
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
925 "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
926 (interactive "p")
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
927 (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
928
18918
0e0935f23d39 (occur): Use text property `occur' to store the
Richard M. Stallman <rms@gnu.org>
parents: 18443
diff changeset
929 (defun occur-prev (&optional n)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
930 "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
931 (interactive "p")
47593
b052c0d51fd4 (occur-find-match): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 47532
diff changeset
932 (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
933
b335edb455ad From: Teodor Zlatanov <tzz@lifelogs.com>
Kim F. Storm <storm@cua.dk>
parents: 54778
diff changeset
934 (defun occur-next-error (&optional argp reset)
b335edb455ad From: Teodor Zlatanov <tzz@lifelogs.com>
Kim F. Storm <storm@cua.dk>
parents: 54778
diff changeset
935 "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
936 Compatibility function for \\[next-error] invocations."
b335edb455ad From: Teodor Zlatanov <tzz@lifelogs.com>
Kim F. Storm <storm@cua.dk>
parents: 54778
diff changeset
937 (interactive "p")
58625
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
938 ;; 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
939 (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
940 ;; 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
941 (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
942 (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
943 (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
944 (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
945 (eq major-mode 'occur-mode))))
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
946
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
947 (goto-char (cond (reset (point-min))
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
948 ((< argp 0) (line-beginning-position))
67180
8d028f859146 (occur-mode-mouse-goto): Pop, don't switch.
Juri Linkov <juri@jurta.org>
parents: 67179
diff changeset
949 ((> argp 0) (line-end-position))
8d028f859146 (occur-mode-mouse-goto): Pop, don't switch.
Juri Linkov <juri@jurta.org>
parents: 67179
diff changeset
950 ((point))))
58625
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
951 (occur-find-match
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
952 (abs argp)
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
953 (if (> 0 argp)
58625
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
954 #'previous-single-property-change
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
955 #'next-single-property-change)
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
956 "No more matches")
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
957 ;; In case the *Occur* buffer is visible in a nonselected window.
76749
6a1a4e97079e (occur-next-error): *Occur* might not be displayed in the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 76466
diff changeset
958 (let ((win (get-buffer-window (current-buffer) t)))
6a1a4e97079e (occur-next-error): *Occur* might not be displayed in the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 76466
diff changeset
959 (if win (set-window-point win (point))))
58625
31d0b9422d7b simple.el (next-error-buffer-p): allow for inclusive and
Teodor Zlatanov <tzz@lifelogs.com>
parents: 58362
diff changeset
960 (occur-mode-goto-occurrence)))
2408
a9c05a12b615 (regexp-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 2327
diff changeset
961
58987
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
962 (defface match
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
963 '((((class color) (min-colors 88) (background light))
78112
6ad309ee5f4e * replace.el (match): Use yellow1 instead of yellow.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 77286
diff changeset
964 :background "yellow1")
58987
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
965 (((class color) (min-colors 88) (background dark))
64503
791fa2059b5e (match): Use slightly more light RoyalBlue3 instead of dark RoyalBlue4.
Juri Linkov <juri@jurta.org>
parents: 64135
diff changeset
966 :background "RoyalBlue3")
76466
08ea848cd1f3 (match): Use yellow background on light-bg terminals.
Richard M. Stallman <rms@gnu.org>
parents: 76392
diff changeset
967 (((class color) (min-colors 8) (background light))
08ea848cd1f3 (match): Use yellow background on light-bg terminals.
Richard M. Stallman <rms@gnu.org>
parents: 76392
diff changeset
968 :background "yellow" :foreground "black")
08ea848cd1f3 (match): Use yellow background on light-bg terminals.
Richard M. Stallman <rms@gnu.org>
parents: 76392
diff changeset
969 (((class color) (min-colors 8) (background dark))
58987
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
970 :background "blue" :foreground "white")
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
971 (((type tty) (class mono))
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
972 :inverse-video t)
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
973 (t :background "gray"))
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
974 "Face used to highlight matches permanently."
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
975 :group 'matching
59996
aac0a33f5772 Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents: 59570
diff changeset
976 :version "22.1")
58987
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
977
17664
d8cb277f0ce8 Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents: 17655
diff changeset
978 (defcustom list-matching-lines-default-context-lines 0
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
979 "Default number of context lines included around `list-matching-lines' matches.
29051
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
980 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
981 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
982 :type 'integer
d8cb277f0ce8 Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents: 17655
diff changeset
983 :group 'matching)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
984
2571
b65cf676a09b All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2408
diff changeset
985 (defalias 'list-matching-lines 'occur)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
986
58987
b24e485e88f7 (match): New face.
Juri Linkov <juri@jurta.org>
parents: 58973
diff changeset
987 (defcustom list-matching-lines-face 'match
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
988 "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
989 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
990 :type 'face
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
991 :group 'matching)
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
992
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
993 (defcustom list-matching-lines-buffer-name-face 'underline
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
994 "Face used by \\[list-matching-lines] to show the names of buffers.
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
995 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
996 :type 'face
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
997 :group 'matching)
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
998
66756
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
999 (defcustom occur-excluded-properties
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
1000 '(read-only invisible intangible field mouse-face help-echo local-map keymap
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
1001 yank-handler follow-link)
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99025
diff changeset
1002 "Text properties to discard when copying lines to the *Occur* buffer.
66756
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
1003 The value should be a list of text properties to discard or t,
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
1004 which means to discard all text properties."
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
1005 :type '(choice (const :tag "All" t) (repeat symbol))
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
1006 :group 'matching
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
1007 :version "22.1")
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
1008
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1009 (defun occur-read-primary-args ()
97082
922b39c63813 (read-regexp): Add second arg `default'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 96908
diff changeset
1010 (list (read-regexp "List lines matching regexp"
922b39c63813 (read-regexp): Add second arg `default'. Doc fix.
Juri Linkov <juri@jurta.org>
parents: 96908
diff changeset
1011 (car regexp-history))
96419
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
1012 (when current-prefix-arg
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
1013 (prefix-numeric-value current-prefix-arg))))
16818
6de559d0b20f (list-matching-lines-face): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 16758
diff changeset
1014
64135
fe83c61c82da (occur-rename-buffer): Use `generate-new-buffer' also when called
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
1015 (defun occur-rename-buffer (&optional unique-p interactive-p)
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1016 "Rename the current *Occur* buffer to *Occur: original-buffer-name*.
107652
861199fb7574 * replace.el (occur-accumulate-lines): Fix a bug where the first
Juri Linkov <juri@jurta.org>
parents: 107476
diff changeset
1017 Here `original-buffer-name' is the buffer name where Occur was originally run.
64135
fe83c61c82da (occur-rename-buffer): Use `generate-new-buffer' also when called
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
1018 When given the prefix argument, or called non-interactively, the renaming
fe83c61c82da (occur-rename-buffer): Use `generate-new-buffer' also when called
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
1019 will not clobber the existing buffer(s) of that name, but use
fe83c61c82da (occur-rename-buffer): Use `generate-new-buffer' also when called
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
1020 `generate-new-buffer-name' instead. You can add this to `occur-hook'
fe83c61c82da (occur-rename-buffer): Use `generate-new-buffer' also when called
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
1021 if you always want a separate *Occur* buffer for each buffer where you
fe83c61c82da (occur-rename-buffer): Use `generate-new-buffer' also when called
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
1022 invoke `occur'."
fe83c61c82da (occur-rename-buffer): Use `generate-new-buffer' also when called
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
1023 (interactive "P\np")
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1024 (with-current-buffer
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1025 (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
1026 (rename-buffer (concat "*Occur: "
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1027 (mapconcat #'buffer-name
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1028 (car (cddr occur-revert-arguments)) "/")
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1029 "*")
64135
fe83c61c82da (occur-rename-buffer): Use `generate-new-buffer' also when called
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
1030 (or unique-p (not interactive-p)))))
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1031
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1032 (defun occur (regexp &optional nlines)
1427
c49077849583 (occur): Always search entire buffer.
Richard M. Stallman <rms@gnu.org>
parents: 866
diff changeset
1033 "Show all lines in the current buffer containing a match for REGEXP.
107476
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1034 If a match spreads across multiple lines, all those lines are shown.
260
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
1035
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
1036 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
1037 before if NLINES is negative.
cbc9580b880f *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 73
diff changeset
1038 NLINES defaults to `list-matching-lines-default-context-lines'.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1039 Interactively it is the prefix arg.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1040
2408
a9c05a12b615 (regexp-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 2327
diff changeset
1041 The lines are shown in a buffer named `*Occur*'.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1042 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
1043 \\<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
1044
87211
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
1045 If REGEXP contains upper case characters (excluding those preceded by `\\')
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
1046 and `search-upper-case' is non-nil, the matching is case-sensitive."
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1047 (interactive (occur-read-primary-args))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1048 (occur-1 regexp nlines (list (current-buffer))))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1049
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1050 (defun multi-occur (bufs regexp &optional nlines)
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1051 "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
1052 This function acts on multiple buffers; otherwise, it is exactly like
68504
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1053 `occur'. When you invoke this command interactively, you must specify
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1054 the buffer names that you want, one by one."
15040
04f81516b6e0 (occur): Fix up interactive code.
Richard M. Stallman <rms@gnu.org>
parents: 14819
diff changeset
1055 (interactive
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1056 (cons
47204
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
1057 (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
1058 (current-buffer) t)))
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
1059 (buf nil)
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
1060 (ido-ignore-item-temp-list bufs))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1061 (while (not (string-equal
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48276
diff changeset
1062 (setq buf (read-buffer
47204
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
1063 (if (eq read-buffer-function 'ido-read-buffer)
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
1064 "Next buffer to search (C-j to end): "
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
1065 "Next buffer to search (RET to end): ")
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
1066 nil t))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1067 ""))
47204
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
1068 (add-to-list 'bufs buf)
539aabdebd62 (multi-occur): Made "ido-aware":
Kim F. Storm <storm@cua.dk>
parents: 47130
diff changeset
1069 (setq ido-ignore-item-temp-list bufs))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1070 (nreverse (mapcar #'get-buffer bufs)))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1071 (occur-read-primary-args)))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1072 (occur-1 regexp nlines bufs))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1073
68504
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1074 (defun multi-occur-in-matching-buffers (bufregexp regexp &optional allbufs)
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1075 "Show all lines matching REGEXP in buffers specified by BUFREGEXP.
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1076 Normally BUFREGEXP matches against each buffer's visited file name,
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1077 but if you specify a prefix argument, it matches against the buffer name.
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1078 See also `multi-occur'."
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1079 (interactive
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1080 (cons
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1081 (let* ((default (car regexp-history))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1082 (input
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1083 (read-from-minibuffer
68536
4bad00cd1b68 (multi-occur-in-matching-buffers): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 68504
diff changeset
1084 (if current-prefix-arg
68504
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1085 "List lines in buffers whose names match regexp: "
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1086 "List lines in buffers whose filenames match regexp: ")
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1087 nil
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1088 nil
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1089 nil
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1090 'regexp-history)))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1091 (if (equal input "")
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1092 default
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1093 input))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1094 (occur-read-primary-args)))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1095 (when bufregexp
68536
4bad00cd1b68 (multi-occur-in-matching-buffers): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 68504
diff changeset
1096 (occur-1 regexp nil
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1097 (delq nil
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1098 (mapcar (lambda (buf)
68504
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1099 (when (if allbufs
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1100 (string-match bufregexp
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1101 (buffer-name buf))
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1102 (and (buffer-file-name buf)
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1103 (string-match bufregexp
5e010e843834 (multi-occur): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67839
diff changeset
1104 (buffer-file-name buf))))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1105 buf))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1106 (buffer-list))))))
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1107
45265
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1108 (defun occur-1 (regexp nlines bufs &optional buf-name)
94525
dea0b823c8e2 (occur-read-primary-args): Set default to the car of
Juri Linkov <juri@jurta.org>
parents: 93121
diff changeset
1109 (unless (and regexp (not (equal regexp "")))
dea0b823c8e2 (occur-read-primary-args): Set default to the car of
Juri Linkov <juri@jurta.org>
parents: 93121
diff changeset
1110 (error "Occur doesn't work with the empty regexp"))
45265
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1111 (unless buf-name
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1112 (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
1113 (let (occur-buf
45079
bf76420e3297 (occur-mode-map): Bind "q" to `delete-window'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
1114 (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
1115 (when (buffer-live-p buf) buf))
bf76420e3297 (occur-mode-map): Bind "q" to `delete-window'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
1116 bufs))))
bf76420e3297 (occur-mode-map): Bind "q" to `delete-window'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
1117 ;; 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
1118 ;; 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
1119 (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
1120 (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
1121 (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
1122
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
1123 ;; 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
1124 ;; 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
1125 (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
1126
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1127 (with-current-buffer occur-buf
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1128 (occur-mode)
76392
8d2b12834458 (occur-engine): buffer-undo-list binding moved...
Chong Yidong <cyd@stupidchicken.com>
parents: 76252
diff changeset
1129 (let ((inhibit-read-only t)
8d2b12834458 (occur-engine): buffer-undo-list binding moved...
Chong Yidong <cyd@stupidchicken.com>
parents: 76252
diff changeset
1130 ;; Don't generate undo entries for creation of the initial contents.
8d2b12834458 (occur-engine): buffer-undo-list binding moved...
Chong Yidong <cyd@stupidchicken.com>
parents: 76252
diff changeset
1131 (buffer-undo-list t))
62147
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1132 (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
1133 (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
1134 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
1135 (or nlines list-matching-lines-default-context-lines)
87211
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
1136 (if (and case-fold-search search-upper-case)
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
1137 (isearch-no-upper-case-p regexp t)
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
1138 case-fold-search)
62147
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1139 list-matching-lines-buffer-name-face
66756
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
1140 nil list-matching-lines-face
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
1141 (not (eq occur-excluded-properties t)))))
62147
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1142 (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
1143 (diff (- (length bufs) bufcount)))
107449
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1144 (message "Searched %d buffer%s%s; %s match%s%s"
62147
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1145 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
1146 (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
1147 (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
1148 (if (= count 1) "" "es")
107449
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1149 ;; Don't display regexp if with remaining text
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1150 ;; it is longer than window-width.
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1151 (if (> (+ (length regexp) 42) (window-width))
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1152 "" (format " for `%s'" (query-replace-descr regexp)))))
62147
94214f10d9c4 (occur-1): Bind inhibit-read-only so that erase-buffer doesn't barf
Eli Zaretskii <eliz@gnu.org>
parents: 60713
diff changeset
1153 (setq occur-revert-arguments (list regexp nlines bufs))
63970
01120e702316 (occur-hook): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 63919
diff changeset
1154 (if (= count 0)
01120e702316 (occur-hook): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 63919
diff changeset
1155 (kill-buffer occur-buf)
01120e702316 (occur-hook): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 63919
diff changeset
1156 (display-buffer occur-buf)
01120e702316 (occur-hook): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 63919
diff changeset
1157 (setq next-error-last-buffer occur-buf)
01120e702316 (occur-hook): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 63919
diff changeset
1158 (setq buffer-read-only t)
01120e702316 (occur-hook): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 63919
diff changeset
1159 (set-buffer-modified-p nil)
01120e702316 (occur-hook): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 63919
diff changeset
1160 (run-hooks 'occur-hook)))))))
18991
2cf48aa123b8 (occur): Local variable line-start redundant.
Richard M. Stallman <rms@gnu.org>
parents: 18918
diff changeset
1161
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1162 (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
1163 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
1164 (with-current-buffer out-buf
48276
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1165 (let ((globalcount 0)
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1166 (coding nil))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1167 ;; Map over all the buffers
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1168 (dolist (buf buffers)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1169 (when (buffer-live-p buf)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1170 (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
1171 (lines 1) ;; line count
107653
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1172 (prev-after-lines nil) ;; context lines of prev match
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1173 (prev-lines nil) ;; line number of prev match endpt
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1174 (matchbeg 0)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1175 (origpt nil)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1176 (begpt nil)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1177 (endpt nil)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1178 (marker nil)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1179 (curstring "")
107653
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1180 (ret nil)
70349
71e8fc4fc523 Revision: emacs@sv.gnu.org/emacs--devo--0--patch-261
Miles Bader <miles@gnu.org>
parents: 68651
diff changeset
1181 (inhibit-field-text-motion t)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1182 (headerpt (with-current-buffer out-buf (point))))
67187
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1183 (with-current-buffer buf
48276
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1184 (or coding
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1185 ;; 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
1186 ;; binds buffer-file-coding-system.
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1187 (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
1188 (setq coding buffer-file-coding-system))
44794
3b95c81de514 (toplevel): Require `cl' while compiling.
Colin Walters <walters@gnu.org>
parents: 44138
diff changeset
1189 (save-excursion
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1190 (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
1191 (while (not (eobp))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1192 (setq origpt (point))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1193 (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
1194 (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
1195 (setq matchbeg (match-beginning 0))
107476
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1196 ;; Get beginning of first match line and end of the last.
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1197 (save-excursion
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1198 (goto-char matchbeg)
107476
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1199 (setq begpt (line-beginning-position))
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1200 (goto-char endpt)
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1201 (setq endpt (line-end-position)))
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1202 ;; Sum line numbers up to the first match line.
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1203 (setq lines (+ lines (count-lines origpt begpt)))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1204 (setq marker (make-marker))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1205 (set-marker marker matchbeg)
107475
7913a8c227bd * replace.el (occur-engine-line): Add optional arg `keep-props'.
Juri Linkov <juri@jurta.org>
parents: 107468
diff changeset
1206 (setq curstring (occur-engine-line begpt endpt keep-props))
66756
670149b47c39 (occur-excluded-properties): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 66720
diff changeset
1207 ;; Highlight the matches
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1208 (let ((len (length curstring))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1209 (start 0))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1210 (while (and (< start len)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1211 (string-match regexp curstring start))
58995
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1212 (add-text-properties
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1213 (match-beginning 0) (match-end 0)
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1214 (append
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1215 `(occur-match t)
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1216 (when match-face
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1217 ;; Use `face' rather than `font-lock-face' here
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1218 ;; so as to override faces copied from the buffer.
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1219 `(face ,match-face)))
feb3eb61d019 (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 58987
diff changeset
1220 curstring)
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1221 (setq start (match-end 0))))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1222 ;; Generate the string to insert for this match
107476
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1223 (let* ((match-prefix
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1224 ;; Using 7 digits aligns tabs properly.
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1225 (apply #'propertize (format "%7d:" lines)
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1226 (append
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1227 (when prefix-face
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1228 `(font-lock-face prefix-face))
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1229 `(occur-prefix t mouse-face (highlight)
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1230 occur-target ,marker follow-link t
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1231 help-echo "mouse-2: go to this occurrence"))))
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1232 (match-str
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1233 ;; We don't put `mouse-face' on the newline,
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1234 ;; because that loses. And don't put it
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1235 ;; on context lines to reduce flicker.
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1236 (propertize curstring 'mouse-face (list 'highlight)
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1237 'occur-target marker
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1238 'follow-link t
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1239 'help-echo
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1240 "mouse-2: go to this occurrence"))
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1241 (out-line
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1242 (concat
107476
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1243 match-prefix
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1244 ;; Add non-numeric prefix to all non-first lines
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1245 ;; of multi-line matches.
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1246 (replace-regexp-in-string
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1247 "\n"
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1248 "\n :"
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1249 match-str)
66720
f41b7662a7a5 (occur-engine): Add marker at end of line, too.
Romain Francoise <romain@orebokech.com>
parents: 66537
diff changeset
1250 ;; Add marker at eol, but no mouse props.
f41b7662a7a5 (occur-engine): Add marker at end of line, too.
Romain Francoise <romain@orebokech.com>
parents: 66537
diff changeset
1251 (propertize "\n" 'occur-target marker)))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1252 (data
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1253 (if (= nlines 0)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1254 ;; The simple display style
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1255 out-line
87529
56186447f050 (occur-context-lines): New subroutine, broken out of occur-engine.
Richard M. Stallman <rms@gnu.org>
parents: 87453
diff changeset
1256 ;; The complex multi-line display style.
107653
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1257 (setq ret (occur-context-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1258 out-line nlines keep-props begpt endpt
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1259 lines prev-lines prev-after-lines))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1260 ;; Set first elem of the returned list to `data',
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1261 ;; and the second elem to `prev-after-lines'.
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1262 (setq prev-after-lines (nth 1 ret))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1263 (nth 0 ret))))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1264 ;; Actually insert the match display data
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1265 (with-current-buffer out-buf
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1266 (let ((beg (point))
107653
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1267 (end (progn (insert data) (point)))))))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1268 (goto-char endpt))
45265
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1269 (if endpt
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1270 (progn
107476
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1271 ;; Sum line numbers between first and last match lines.
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1272 (setq lines (+ lines (count-lines begpt endpt)
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1273 ;; Add 1 for empty last match line since
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1274 ;; count-lines returns 1 line less.
dc9e20df2b90 Implement Occur multi-line matches.
Juri Linkov <juri@jurta.org>
parents: 107475
diff changeset
1275 (if (and (bolp) (eolp)) 1 0)))
45265
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1276 ;; On to the next match...
06efd7086835 (occur-1): New optional argument `buf-name'.
Colin Walters <walters@gnu.org>
parents: 45255
diff changeset
1277 (forward-line 1))
107653
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1278 (goto-char (point-max)))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1279 (setq prev-lines (1- lines)))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1280 ;; Flush remaining context after-lines.
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1281 (when prev-after-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1282 (with-current-buffer out-buf
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1283 (insert (apply #'concat (occur-engine-add-prefix
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1284 prev-after-lines)))))))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1285 (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
1286 (setq globalcount (+ globalcount matches))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1287 (with-current-buffer out-buf
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1288 (goto-char headerpt)
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1289 (let ((beg (point))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1290 end)
107449
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1291 (insert (format "%d match%s%s in buffer: %s\n"
54778
edec41928fc8 * replace.el (occur-engine): Distinguish between one and several
John Paul Wallington <jpw@pobox.com>
parents: 54375
diff changeset
1292 matches (if (= matches 1) "" "es")
107449
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1293 ;; Don't display regexp for multi-buffer.
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1294 (if (> (length buffers) 1)
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1295 "" (format " for \"%s\""
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1296 (query-replace-descr regexp)))
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1297 (buffer-name buf)))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1298 (setq end (point))
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1299 (add-text-properties beg end
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1300 (append
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1301 (when title-face
45689
01fbc1331841 (occur-mode): Don't set up categories.
Colin Walters <walters@gnu.org>
parents: 45529
diff changeset
1302 `(font-lock-face ,title-face))
01fbc1331841 (occur-mode): Don't set up categories.
Colin Walters <walters@gnu.org>
parents: 45529
diff changeset
1303 `(occur-title ,buf))))
44924
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1304 (goto-char (point-min)))))))
107449
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1305 ;; Display total match count and regexp for multi-buffer.
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1306 (when (and (not (zerop globalcount)) (> (length buffers) 1))
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1307 (goto-char (point-min))
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1308 (let ((beg (point))
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1309 end)
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1310 (insert (format "%d match%s total for \"%s\":\n"
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1311 globalcount (if (= globalcount 1) "" "es")
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1312 (query-replace-descr regexp)))
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1313 (setq end (point))
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1314 (add-text-properties beg end (when title-face
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1315 `(font-lock-face ,title-face))))
e64817c0ab40 Fix message of multi-line occur regexps and multi-buffer header lines.
Juri Linkov <juri@jurta.org>
parents: 107417
diff changeset
1316 (goto-char (point-min)))
48276
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1317 (if coding
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1318 ;; 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
1319 ;; 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
1320 ;; buffer.
3a5bc7e171a5 (occur-engine): Set buffer-file-coding-system of
Kenichi Handa <handa@m17n.org>
parents: 48173
diff changeset
1321 (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
1322 ;; Return the number of matches
4a1d60fe2473 (occur-accumulate-lines): Avoid incf and decf.
Richard M. Stallman <rms@gnu.org>
parents: 44865
diff changeset
1323 globalcount)))
18991
2cf48aa123b8 (occur): Local variable line-start redundant.
Richard M. Stallman <rms@gnu.org>
parents: 18918
diff changeset
1324
107475
7913a8c227bd * replace.el (occur-engine-line): Add optional arg `keep-props'.
Juri Linkov <juri@jurta.org>
parents: 107468
diff changeset
1325 (defun occur-engine-line (beg end &optional keep-props)
107468
008c1c06812b * replace.el (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 107449
diff changeset
1326 (if (and keep-props (if (boundp 'jit-lock-mode) jit-lock-mode)
008c1c06812b * replace.el (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 107449
diff changeset
1327 (text-property-not-all beg end 'fontified t))
008c1c06812b * replace.el (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 107449
diff changeset
1328 (if (fboundp 'jit-lock-fontify-now)
008c1c06812b * replace.el (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 107449
diff changeset
1329 (jit-lock-fontify-now beg end)))
008c1c06812b * replace.el (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 107449
diff changeset
1330 (if (and keep-props (not (eq occur-excluded-properties t)))
008c1c06812b * replace.el (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 107449
diff changeset
1331 (let ((str (buffer-substring beg end)))
008c1c06812b * replace.el (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 107449
diff changeset
1332 (remove-list-of-text-properties
008c1c06812b * replace.el (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 107449
diff changeset
1333 0 (length str) occur-excluded-properties str)
008c1c06812b * replace.el (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 107449
diff changeset
1334 str)
008c1c06812b * replace.el (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 107449
diff changeset
1335 (buffer-substring-no-properties beg end)))
008c1c06812b * replace.el (occur-accumulate-lines, occur-engine):
Juri Linkov <juri@jurta.org>
parents: 107449
diff changeset
1336
107656
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1337 (defun occur-engine-add-prefix (lines)
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1338 (mapcar
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1339 #'(lambda (line)
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1340 (concat " :" line "\n"))
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1341 lines))
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1342
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1343 (defun occur-accumulate-lines (count &optional keep-props pt)
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1344 (save-excursion
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1345 (when pt
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1346 (goto-char pt))
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1347 (let ((forwardp (> count 0))
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1348 result beg end moved)
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1349 (while (not (or (zerop count)
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1350 (if forwardp
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1351 (eobp)
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1352 (and (bobp) (not moved)))))
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1353 (setq count (+ count (if forwardp -1 1)))
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1354 (setq beg (line-beginning-position)
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1355 end (line-end-position))
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1356 (push (occur-engine-line beg end keep-props) result)
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1357 (setq moved (= 0 (forward-line (if forwardp 1 -1)))))
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1358 (nreverse result))))
a788d758fe0a * replace.el (occur-accumulate-lines): Move occur-engine related
Juri Linkov <juri@jurta.org>
parents: 107653
diff changeset
1359
87529
56186447f050 (occur-context-lines): New subroutine, broken out of occur-engine.
Richard M. Stallman <rms@gnu.org>
parents: 87453
diff changeset
1360 ;; Generate context display for occur.
56186447f050 (occur-context-lines): New subroutine, broken out of occur-engine.
Richard M. Stallman <rms@gnu.org>
parents: 87453
diff changeset
1361 ;; OUT-LINE is the line where the match is.
56186447f050 (occur-context-lines): New subroutine, broken out of occur-engine.
Richard M. Stallman <rms@gnu.org>
parents: 87453
diff changeset
1362 ;; NLINES and KEEP-PROPS are args to occur-engine.
107653
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1363 ;; LINES is line count of the current match,
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1364 ;; PREV-LINES is line count of the previous match,
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1365 ;; PREV-AFTER-LINES is a list of after-context lines of the previous match.
87529
56186447f050 (occur-context-lines): New subroutine, broken out of occur-engine.
Richard M. Stallman <rms@gnu.org>
parents: 87453
diff changeset
1366 ;; Generate a list of lines, add prefixes to all but OUT-LINE,
56186447f050 (occur-context-lines): New subroutine, broken out of occur-engine.
Richard M. Stallman <rms@gnu.org>
parents: 87453
diff changeset
1367 ;; then concatenate them all together.
107653
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1368 (defun occur-context-lines (out-line nlines keep-props begpt endpt
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1369 lines prev-lines prev-after-lines)
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1370 ;; Find after- and before-context lines of the current match.
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1371 (let ((before-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1372 (nreverse (cdr (occur-accumulate-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1373 (- (1+ (abs nlines))) keep-props begpt))))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1374 (after-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1375 (cdr (occur-accumulate-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1376 (1+ nlines) keep-props endpt)))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1377 separator)
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1378
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1379 ;; Combine after-lines of the previous match
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1380 ;; with before-lines of the current match.
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1381
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1382 (when prev-after-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1383 ;; Don't overlap prev after-lines with current before-lines.
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1384 (if (>= (+ prev-lines (length prev-after-lines))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1385 (- lines (length before-lines)))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1386 (setq prev-after-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1387 (butlast prev-after-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1388 (- (length prev-after-lines)
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1389 (- lines prev-lines (length before-lines) 1))))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1390 ;; Separate non-overlapping context lines with a dashed line.
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1391 (setq separator "-------\n")))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1392
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1393 (when prev-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1394 ;; Don't overlap current before-lines with previous match line.
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1395 (if (<= (- lines (length before-lines))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1396 prev-lines)
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1397 (setq before-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1398 (nthcdr (- (length before-lines)
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1399 (- lines prev-lines 1))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1400 before-lines))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1401 ;; Separate non-overlapping before-context lines.
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1402 (unless (> nlines 0)
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1403 (setq separator "-------\n"))))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1404
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1405 (list
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1406 ;; Return a list where the first element is the output line.
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1407 (apply #'concat
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1408 (append
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1409 (and prev-after-lines
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1410 (occur-engine-add-prefix prev-after-lines))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1411 (and separator (list separator))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1412 (occur-engine-add-prefix before-lines)
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1413 (list out-line)))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1414 ;; And the second element is the list of context after-lines.
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1415 (if (> nlines 0) after-lines))))
bfde3c2dbef5 Make occur handle multi-line matches cleanly with context.
Juri Linkov <juri@jurta.org>
parents: 107652
diff changeset
1416
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1417
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1418 ;; 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
1419 ;; to make that display both SPC and Y.
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1420 (defconst query-replace-help
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1421 "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
1422 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
1423 Comma to replace but not move point immediately,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1424 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
1425 C-w to delete match and recursive edit,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1426 C-l to clear the screen, redisplay, and offer same replacement again,
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1427 ! 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
1428 ^ to move point back to previous match,
be3f5fa41e90 (query-replace-map): Add binding for `E'.
Gerd Moellmann <gerd@gnu.org>
parents: 28706
diff changeset
1429 E to edit the replacement string"
38036
018637678f29 (case-replace, query-replace-from-history-variable)
Eli Zaretskii <eliz@gnu.org>
parents: 37832
diff changeset
1430 "Help message while in `query-replace'.")
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1431
67187
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1432 (defvar query-replace-map
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1433 (let ((map (make-sparse-keymap)))
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1434 (define-key map " " 'act)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1435 (define-key map "\d" 'skip)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1436 (define-key map [delete] 'skip)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1437 (define-key map [backspace] 'skip)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1438 (define-key map "y" 'act)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1439 (define-key map "n" 'skip)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1440 (define-key map "Y" 'act)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1441 (define-key map "N" 'skip)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1442 (define-key map "e" 'edit-replacement)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1443 (define-key map "E" 'edit-replacement)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1444 (define-key map "," 'act-and-show)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1445 (define-key map "q" 'exit)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1446 (define-key map "\r" 'exit)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1447 (define-key map [return] 'exit)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1448 (define-key map "." 'act-and-exit)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1449 (define-key map "\C-r" 'edit)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1450 (define-key map "\C-w" 'delete-and-edit)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1451 (define-key map "\C-l" 'recenter)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1452 (define-key map "!" 'automatic)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1453 (define-key map "^" 'backup)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1454 (define-key map "\C-h" 'help)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1455 (define-key map [f1] 'help)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1456 (define-key map [help] 'help)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1457 (define-key map "?" 'help)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1458 (define-key map "\C-g" 'quit)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1459 (define-key map "\C-]" 'quit)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1460 (define-key map "\e" 'exit-prefix)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1461 (define-key map [escape] 'exit-prefix)
805356939662 (query-replace-map): Move initialization into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67180
diff changeset
1462 map)
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1463 "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
1464 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
1465 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
1466 `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
1467 `automatic', `backup', `exit-prefix', and `help'.")
2080
6ee99287dbc6 (query-replace-map): New keymap.
Richard M. Stallman <rms@gnu.org>
parents: 1820
diff changeset
1468
96908
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1469 (defvar multi-query-replace-map
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1470 (let ((map (make-sparse-keymap)))
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1471 (set-keymap-parent map query-replace-map)
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1472 (define-key map "Y" 'automatic-all)
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1473 (define-key map "N" 'exit-current)
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1474 map)
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1475 "Keymap that defines additional bindings for multi-buffer replacements.
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1476 It extends its parent map `query-replace-map' with new bindings to
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1477 operate on a set of buffers/files. The difference with its parent map
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1478 is the additional answers `automatic-all' to replace all remaining
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1479 matches in all remaining buffers with no more questions, and
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1480 `exit-current' to skip remaining matches in the current buffer
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1481 and to continue with the next buffer in the sequence.")
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1482
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1483 (defun replace-match-string-symbols (n)
29051
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1484 "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
1485 Symbol Expands To
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1486 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
1487 #N (string-to-number (match-string N))
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1488 & (match-string 0)
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1489 #& (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
1490 # replace-count
29051
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1491
c45f6793d6ab Doc and error message fixes.
Dave Love <fx@gnu.org>
parents: 28801
diff changeset
1492 Note that these symbols must be preceeded by a backslash in order to
72095
2a66d3b6c808 (replace-match-string-symbols): Handle dotted lists.
Richard M. Stallman <rms@gnu.org>
parents: 71125
diff changeset
1493 type them using Lisp syntax."
2a66d3b6c808 (replace-match-string-symbols): Handle dotted lists.
Richard M. Stallman <rms@gnu.org>
parents: 71125
diff changeset
1494 (while (consp n)
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1495 (cond
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1496 ((consp (car n))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1497 (replace-match-string-symbols (car n))) ;Process sub-list
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1498 ((symbolp (car n))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1499 (let ((name (symbol-name (car n))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1500 (cond
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1501 ((string-match "^[0-9]+$" name)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1502 (setcar n (list 'match-string (string-to-number name))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1503 ((string-match "^#[0-9]+$" name)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1504 (setcar n (list 'string-to-number
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1505 (list 'match-string
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1506 (string-to-number (substring name 1))))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1507 ((string= "&" name)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1508 (setcar n '(match-string 0)))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1509 ((string= "#&" name)
56148
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1510 (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
1511 ((string= "#" name)
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1512 (setcar n 'replace-count))))))
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1513 (setq n (cdr n))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1514
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1515 (defun replace-eval-replacement (expression replace-count)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1516 (let ((replacement (eval expression)))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1517 (if (stringp replacement)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1518 replacement
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1519 (prin1-to-string replacement t))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1520
56148
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1521 (defun replace-quote (replacement)
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1522 "Quote a replacement string.
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1523 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
1524 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
1525 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
1526 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
1527
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1528 `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
1529 (save-match-data
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1530 (replace-regexp-in-string "\\\\" "\\\\"
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1531 (if (stringp replacement)
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1532 replacement
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1533 (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
1534 t t)))
dbab365230eb (query-replace-read-args): Only warn about use of \n
David Kastrup <dak@gnu.org>
parents: 56006
diff changeset
1535
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1536 (defun replace-loop-through-replacements (data replace-count)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1537 ;; DATA is a vector contaning the following values:
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1538 ;; 0 next-rotate-count
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1539 ;; 1 repeat-count
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1540 ;; 2 next-replacement
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1541 ;; 3 replacements
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1542 (if (= (aref data 0) replace-count)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1543 (progn
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1544 (aset data 0 (+ replace-count (aref data 1)))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1545 (let ((next (cdr (aref data 2))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1546 (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
1547 (car (aref data 2)))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1548
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1549 (defun replace-match-data (integers reuse &optional new)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1550 "Like `match-data', but markers in REUSE get invalidated.
74578
34b20acf743f (replace-match-data, replace-match-maybe-edit): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 72095
diff changeset
1551 If NEW is non-nil, it is set and returned instead of fresh data,
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1552 but coerced to the correct value of INTEGERS."
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1553 (or (and new
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1554 (progn
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1555 (set-match-data new)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1556 (and (eq new reuse)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1557 (eq (null integers) (markerp (car reuse)))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1558 new)))
63150
571afd8b238a (replace-match-data): Pass RESEAT arg `t' to
Kim F. Storm <storm@cua.dk>
parents: 62737
diff changeset
1559 (match-data integers reuse t)))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1560
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1561 (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
1562 "Make a replacement with `replace-match', editing `\\?'.
58913
0b183affb969 (replace-match-maybe-edit): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 58741
diff changeset
1563 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
1564 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
1565 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
1566
74578
34b20acf743f (replace-match-data, replace-match-maybe-edit): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 72095
diff changeset
1567 The return value is non-nil if there has been no `\\?' or NOEDIT was
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1568 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
1569 (unless (or literal noedit)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1570 (setq noedit t)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1571 (while (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\(\\\\\\?\\)"
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1572 newtext)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1573 (setq newtext
62458
2c228409c44d Replace `read-input' by `read-string'.
Juanma Barranquero <lekktu@gmail.com>
parents: 62147
diff changeset
1574 (read-string "Edit replacement string: "
2c228409c44d Replace `read-input' by `read-string'.
Juanma Barranquero <lekktu@gmail.com>
parents: 62147
diff changeset
1575 (prog1
2c228409c44d Replace `read-input' by `read-string'.
Juanma Barranquero <lekktu@gmail.com>
parents: 62147
diff changeset
1576 (cons
2c228409c44d Replace `read-input' by `read-string'.
Juanma Barranquero <lekktu@gmail.com>
parents: 62147
diff changeset
1577 (replace-match "" t t newtext 3)
2c228409c44d Replace `read-input' by `read-string'.
Juanma Barranquero <lekktu@gmail.com>
parents: 62147
diff changeset
1578 (1+ (match-beginning 3)))
2c228409c44d Replace `read-input' by `read-string'.
Juanma Barranquero <lekktu@gmail.com>
parents: 62147
diff changeset
1579 (setq match-data
2c228409c44d Replace `read-input' by `read-string'.
Juanma Barranquero <lekktu@gmail.com>
parents: 62147
diff changeset
1580 (replace-match-data
2c228409c44d Replace `read-input' by `read-string'.
Juanma Barranquero <lekktu@gmail.com>
parents: 62147
diff changeset
1581 nil match-data match-data))))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1582 noedit nil)))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1583 (set-match-data match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1584 (replace-match newtext fixedcase literal)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1585 noedit)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1586
95604
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1587 (defvar replace-search-function 'search-forward
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1588 "Function to use when searching for strings to replace.
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1589 It is used by `query-replace' and `replace-string', and is called
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1590 with three arguments, as if it were `search-forward'.")
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1591
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1592 (defvar replace-re-search-function 're-search-forward
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1593 "Function to use when searching for regexps to replace.
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1594 It is used by `query-replace-regexp', `replace-regexp',
96419
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
1595 `query-replace-regexp-eval', and `map-query-replace-regexp'.
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
1596 It is called with three arguments, as if it were
b5e89d359b84 (read-regexp): New function.
Juri Linkov <juri@jurta.org>
parents: 95604
diff changeset
1597 `re-search-forward'.")
95604
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1598
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1599 (defun perform-replace (from-string replacements
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1600 query-flag regexp-flag delimited-flag
40254
51c9985454e3 (perform-replace): Move START and END parameters
Gerd Moellmann <gerd@gnu.org>
parents: 38986
diff changeset
1601 &optional repeat-count map start end)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1602 "Subroutine of `query-replace'. Its complexity handles interactive queries.
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1603 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
1604 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
1605
a7b1d283fe97 (perform-replace): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents: 38414
diff changeset
1606 (while (re-search-forward \"foo[ \\t]+bar\" nil t)
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1607 (replace-match \"foobar\" nil nil))
38675
a7b1d283fe97 (perform-replace): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents: 38414
diff changeset
1608
a7b1d283fe97 (perform-replace): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents: 38414
diff changeset
1609 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
1610 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
1611 `case-replace'.
45014630aeb2 (perform-replace): Document return value. Use `pop'.
Colin Walters <walters@gnu.org>
parents: 45490
diff changeset
1612
45014630aeb2 (perform-replace): Document return value. Use `pop'.
Colin Walters <walters@gnu.org>
parents: 45490
diff changeset
1613 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
1614 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
1615 (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
1616 (and query-flag minibuffer-auto-raise
024d3847af99 (perform-replace): Obey minibuffer-auto-raise.
Richard M. Stallman <rms@gnu.org>
parents: 16129
diff changeset
1617 (raise-frame (window-frame (minibuffer-window))))
82072
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1618 (let* ((case-fold-search
87211
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
1619 (if (and case-fold-search search-upper-case)
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
1620 (isearch-no-upper-case-p from-string regexp-flag)
c2b1300a87e5 (keep-lines, flush-lines, how-many): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 86291
diff changeset
1621 case-fold-search))
82072
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1622 (nocasify (not (and case-replace case-fold-search)))
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1623 (literal (or (not regexp-flag) (eq regexp-flag 'literal)))
95604
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1624 (search-function
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1625 (if regexp-flag
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1626 replace-re-search-function
664723b81c00 (replace-search-function, replace-re-search-function): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 94678
diff changeset
1627 replace-search-function))
82072
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1628 (search-string from-string)
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1629 (real-match-data nil) ; The match data for the current match.
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1630 (next-replacement nil)
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1631 ;; This is non-nil if we know there is nothing for the user
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1632 ;; to edit in the replacement.
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1633 (noedit nil)
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1634 (keep-going t)
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1635 (stack nil)
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1636 (replace-count 0)
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1637 (nonempty-match nil)
96908
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1638 (multi-buffer nil)
106325
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1639 (recenter-last-op nil) ; Start cycling order with initial position.
18433
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1640
82072
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1641 ;; If non-nil, it is marker saying where in the buffer to stop.
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1642 (limit nil)
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
1643
82072
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1644 ;; Data for the next match. If a cons, it has the same format as
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1645 ;; (match-data); otherwise it is t if a match is possible at point.
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1646 (match-again t)
18433
1de7cef26431 (perform-replace): When matching regexps, if the next match is
Paul Eggert <eggert@twinsun.com>
parents: 17933
diff changeset
1647
82072
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1648 (message
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1649 (if query-flag
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1650 (apply 'propertize
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1651 (substitute-command-keys
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1652 "Query replacing %s with %s: (\\<query-replace-map>\\[help] for help) ")
7894e62e5b10 (perform-replace): Use isearch-no-upper-case-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78112
diff changeset
1653 minibuffer-prompt-properties))))
20248
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
1654
b87f3ba0e1d7 (perform-replace): In Transient Mark mode, if
Karl Heuer <kwzh@gnu.org>
parents: 20244
diff changeset
1655 ;; 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
1656 (when start
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
1657 (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
1658 (goto-char (min start end))
29790e97da09 (perform-replace): Add parameters START and END. Use
Gerd Moellmann <gerd@gnu.org>
parents: 28502
diff changeset
1659 (deactivate-mark))
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1660
96908
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1661 ;; If last typed key in previous call of multi-buffer perform-replace
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1662 ;; was `automatic-all', don't ask more questions in next files
101013
dbe70c3aa01d Replace last-input-char with last-input-event.
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
1663 (when (eq (lookup-key map (vector last-input-event)) 'automatic-all)
96908
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1664 (setq query-flag nil multi-buffer t))
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1665
25167
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1666 ;; 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
1667 ;; 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
1668 ;; called to generate each replacement like this:
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1669 ;; (funcall (car replacements) (cdr replacements) replace-count)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1670 ;; It must return a string.
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1671 (cond
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1672 ((stringp replacements)
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1673 (setq next-replacement replacements
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1674 replacements nil))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1675 ((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
1676 (or repeat-count (setq repeat-count 1))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1677 (setq replacements (cons 'replace-loop-through-replacements
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1678 (vector repeat-count repeat-count
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1679 replacements replacements)))))
8a881b02ea7b (query-replace-regexp-eval)
Richard M. Stallman <rms@gnu.org>
parents: 25039
diff changeset
1680
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1681 (if delimited-flag
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1682 (setq search-function 're-search-forward
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1683 search-string (concat "\\b"
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1684 (if regexp-flag from-string
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1685 (regexp-quote from-string))
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1686 "\\b")))
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1687 (when query-replace-lazy-highlight
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1688 (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
1689
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1690 (push-mark)
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1691 (undo-boundary)
5393
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1692 (unwind-protect
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1693 ;; Loop finding occurrences that perhaps should be replaced.
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1694 (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
1695 (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
1696 ;; 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
1697 ;; 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
1698 ;; 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
1699 (setq real-match-data
76236
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1700 (cond ((consp match-again)
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1701 (goto-char (nth 1 match-again))
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1702 (replace-match-data
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1703 t real-match-data match-again))
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1704 ;; MATCH-AGAIN non-nil means accept an
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1705 ;; adjacent match.
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1706 (match-again
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1707 (and
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1708 (funcall search-function search-string
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1709 limit t)
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1710 ;; For speed, use only integers and
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1711 ;; reuse the list used last time.
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1712 (replace-match-data t real-match-data)))
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1713 ((and (< (1+ (point)) (point-max))
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1714 (or (null limit)
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1715 (< (1+ (point)) limit)))
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1716 ;; If not accepting adjacent matches,
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1717 ;; move one char to the right before
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1718 ;; searching again. Undo the motion
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1719 ;; if the search fails.
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1720 (let ((opoint (point)))
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1721 (forward-char 1)
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1722 (if (funcall
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1723 search-function search-string
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1724 limit t)
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1725 (replace-match-data
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1726 t real-match-data)
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1727 (goto-char opoint)
91de64a1c05e (perform-replace): Undo forward-char immediately if non-adjacent
Chong Yidong <cyd@stupidchicken.com>
parents: 75921
diff changeset
1728 nil))))))
74578
34b20acf743f (replace-match-data, replace-match-maybe-edit): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 72095
diff changeset
1729
67839
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1730 ;; Record whether the match is nonempty, to avoid an infinite loop
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1731 ;; repeatedly matching the same empty string.
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1732 (setq nonempty-match
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1733 (/= (nth 0 real-match-data) (nth 1 real-match-data)))
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1734
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1735 ;; If the match is empty, record that the next one can't be
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1736 ;; adjacent.
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1737
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1738 ;; Otherwise, if matching a regular expression, do the next
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1739 ;; match now, since the replacement for this match may
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1740 ;; affect whether the next match is adjacent to this one.
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1741 ;; If that match is empty, don't use it.
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1742 (setq match-again
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1743 (and nonempty-match
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1744 (or (not regexp-flag)
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1745 (and (looking-at search-string)
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1746 (let ((match (match-data)))
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1747 (and (/= (nth 0 match) (nth 1 match))
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1748 match))))))
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1749
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1750 ;; 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
1751 (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
1752 (text-property-not-all
67839
33258a660650 (perform-replace): Calculate match-again
Richard M. Stallman <rms@gnu.org>
parents: 67426
diff changeset
1753 (nth 0 real-match-data) (nth 1 real-match-data)
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1754 'read-only nil))
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 658
diff changeset
1755
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1756 ;; Calculate the replacement string, if necessary.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1757 (when replacements
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1758 (set-match-data real-match-data)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1759 (setq next-replacement
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1760 (funcall (car replacements) (cdr replacements)
75212
dbdc8c2aae7f (perform-replace): Remove leftover code.
Juanma Barranquero <lekktu@gmail.com>
parents: 75208
diff changeset
1761 replace-count)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1762 (if (not query-flag)
98145
9d5c120a08ec (perform-replace): Don't set inhibit-read-only using
Chong Yidong <cyd@stupidchicken.com>
parents: 97082
diff changeset
1763 (progn
58913
0b183affb969 (replace-match-maybe-edit): Doc fix.
Juri Linkov <juri@jurta.org>
parents: 58741
diff changeset
1764 (unless (or literal noedit)
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1765 (replace-highlight
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1766 (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
1767 start end search-string
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1768 (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
1769 (setq noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1770 (replace-match-maybe-edit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1771 next-replacement nocasify literal
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1772 noedit real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1773 replace-count (1+ replace-count)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1774 (undo-boundary)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1775 (let (done replaced key def)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1776 ;; 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
1777 ;; which means it has finished handling this
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1778 ;; occurrence. Any command that sets `done' should
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1779 ;; leave behind proper match data for the stack.
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1780 ;; Commands not setting `done' need to adjust
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1781 ;; `real-match-data'.
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1782 (while (not done)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1783 (set-match-data real-match-data)
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1784 (replace-highlight
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1785 (match-beginning 0) (match-end 0)
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1786 start end search-string
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1787 (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
1788 ;; 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
1789 ;; with a bunch of identical messages.
86018
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
1790 (let ((message-log-max nil)
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
1791 (replacement-presentation
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
1792 (if query-replace-show-replacement
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
1793 (save-match-data
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
1794 (set-match-data real-match-data)
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
1795 (match-substitute-replacement next-replacement
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
1796 nocasify literal))
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
1797 next-replacement)))
57023
cf85be0f7afa (perform-replace): Use `query-replace-descr'.
Juri Linkov <juri@jurta.org>
parents: 56922
diff changeset
1798 (message message
cf85be0f7afa (perform-replace): Use `query-replace-descr'.
Juri Linkov <juri@jurta.org>
parents: 56922
diff changeset
1799 (query-replace-descr from-string)
86018
2c176c668b7a (query-replace-show-replacement): New defcustom.
Juri Linkov <juri@jurta.org>
parents: 82140
diff changeset
1800 (query-replace-descr replacement-presentation)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1801 (setq key (read-event))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1802 ;; 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
1803 ;; that clobbers the match data.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1804 (set-match-data real-match-data)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1805 (setq key (vector key))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1806 (setq def (lookup-key map key))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1807 ;; 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
1808 (cond ((eq def 'help)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1809 (with-output-to-temp-buffer "*Help*"
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1810 (princ
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1811 (concat "Query replacing "
98913
f989303f1963 (query-replace, query-replace-regexp)
Juri Linkov <juri@jurta.org>
parents: 98909
diff changeset
1812 (if delimited-flag "word " "")
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1813 (if regexp-flag "regexp " "")
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1814 from-string " with "
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1815 next-replacement ".\n\n"
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1816 (substitute-command-keys
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1817 query-replace-help)))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1818 (with-current-buffer standard-output
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1819 (help-mode))))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1820 ((eq def 'exit)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1821 (setq keep-going nil)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1822 (setq done t))
96908
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1823 ((eq def 'exit-current)
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1824 (setq multi-buffer t keep-going nil done t))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1825 ((eq def 'backup)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1826 (if stack
45529
45014630aeb2 (perform-replace): Document return value. Use `pop'.
Colin Walters <walters@gnu.org>
parents: 45490
diff changeset
1827 (let ((elt (pop stack)))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1828 (goto-char (nth 0 elt))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1829 (setq replaced (nth 1 elt)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1830 real-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1831 (replace-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1832 t real-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1833 (nth 2 elt))))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1834 (message "No previous match")
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1835 (ding 'no-terminate)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1836 (sit-for 1)))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1837 ((eq def 'act)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1838 (or replaced
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1839 (setq noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1840 (replace-match-maybe-edit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1841 next-replacement nocasify literal
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1842 noedit real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1843 replace-count (1+ replace-count)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1844 (setq done t replaced t))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1845 ((eq def 'act-and-exit)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1846 (or replaced
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1847 (setq noedit
56273
610a9a9c39d0 (query-replace-read-args): Swallow a space after
Juri Linkov <juri@jurta.org>
parents: 56262
diff changeset
1848 (replace-match-maybe-edit
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1849 next-replacement nocasify literal
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1850 noedit real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1851 replace-count (1+ replace-count)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1852 (setq keep-going nil)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1853 (setq done t replaced t))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1854 ((eq def 'act-and-show)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1855 (if (not replaced)
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1856 (setq noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1857 (replace-match-maybe-edit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1858 next-replacement nocasify literal
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1859 noedit real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1860 replace-count (1+ replace-count)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1861 real-match-data (replace-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1862 t real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1863 replaced t)))
96908
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1864 ((or (eq def 'automatic) (eq def 'automatic-all))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1865 (or replaced
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1866 (setq noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1867 (replace-match-maybe-edit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1868 next-replacement nocasify literal
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1869 noedit real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1870 replace-count (1+ replace-count)))
96908
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1871 (setq done t query-flag nil replaced t)
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1872 (if (eq def 'automatic-all) (setq multi-buffer t)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1873 ((eq def 'skip)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1874 (setq done t))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1875 ((eq def 'recenter)
106325
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1876 ;; `this-command' has the value `query-replace',
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1877 ;; so we need to bind it to `recenter-top-bottom'
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1878 ;; to allow it to detect a sequence of `C-l'.
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1879 (let ((this-command 'recenter-top-bottom)
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1880 (last-command 'recenter-top-bottom))
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1881 (recenter-top-bottom)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1882 ((eq def 'edit)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1883 (let ((opos (point-marker)))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1884 (setq real-match-data (replace-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1885 nil real-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1886 real-match-data))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1887 (goto-char (match-beginning 0))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1888 (save-excursion
44138
f1d7c706f7f7 (query-replace-read-args): New optional arg NOERROR.
Richard M. Stallman <rms@gnu.org>
parents: 43406
diff changeset
1889 (save-window-excursion
f1d7c706f7f7 (query-replace-read-args): New optional arg NOERROR.
Richard M. Stallman <rms@gnu.org>
parents: 43406
diff changeset
1890 (recursive-edit)))
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1891 (goto-char opos)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1892 (set-marker opos nil))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1893 ;; Before we make the replacement,
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1894 ;; decide whether the search string
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1895 ;; 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
1896 (if (and regexp-flag nonempty-match)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1897 (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
1898 (match-data)))))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1899 ;; Edit replacement.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1900 ((eq def 'edit-replacement)
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1901 (setq real-match-data (replace-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1902 nil real-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1903 real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1904 next-replacement
62458
2c228409c44d Replace `read-input' by `read-string'.
Juanma Barranquero <lekktu@gmail.com>
parents: 62147
diff changeset
1905 (read-string "Edit replacement string: "
2c228409c44d Replace `read-input' by `read-string'.
Juanma Barranquero <lekktu@gmail.com>
parents: 62147
diff changeset
1906 next-replacement)
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1907 noedit nil)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1908 (if replaced
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1909 (set-match-data real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1910 (setq noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1911 (replace-match-maybe-edit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1912 next-replacement nocasify literal noedit
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1913 real-match-data)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1914 replaced t))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1915 (setq done t))
46693
4ed23f64c88c (occur-rename-buffer): New command.
Sam Steingold <sds@gnu.org>
parents: 46519
diff changeset
1916
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1917 ((eq def 'delete-and-edit)
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1918 (replace-match "" t t)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1919 (setq real-match-data (replace-match-data
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1920 nil real-match-data))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1921 (replace-dehighlight)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1922 (save-excursion (recursive-edit))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1923 (setq replaced t))
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1924 ;; 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
1925 ;; specially here, since we reread
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1926 ;; any unrecognized character.
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1927 (t
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1928 (setq this-command 'mode-exited)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1929 (setq keep-going nil)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1930 (setq unread-command-events
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1931 (append (listify-key-sequence key)
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1932 unread-command-events))
58914
f55019d052ed * replace.el (query-replace-highlight): Add new value `isearch'
Juri Linkov <juri@jurta.org>
parents: 58913
diff changeset
1933 (setq done t)))
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1934 (when query-replace-lazy-highlight
106325
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1935 ;; 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
1936 (if (not (memq def '(skip backup)))
106325
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1937 (setq isearch-lazy-highlight-last-string nil)))
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1938 (unless (eq def 'recenter)
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1939 ;; Reset recenter cycling order to initial position.
d1953939048b (perform-replace): Let-bind recenter-last-op to nil.
Juri Linkov <juri@jurta.org>
parents: 105965
diff changeset
1940 (setq recenter-last-op nil)))
40925
8733f6312f8a (query-replace-skip-read-only): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 40254
diff changeset
1941 ;; 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
1942 ;; 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
1943 ;; since lots of markers slow down editing.
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1944 (push (list (point) replaced
63779
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
1945 ;;; If the replacement has already happened, all we need is the
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
1946 ;;; current match start and end. We could get this with a trivial
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
1947 ;;; match like
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
1948 ;;; (save-excursion (goto-char (match-beginning 0))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
1949 ;;; (search-forward (match-string 0))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
1950 ;;; (match-data t))
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
1951 ;;; if we really wanted to avoid manually constructing match data.
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
1952 ;;; Adding current-buffer is necessary so that match-data calls can
98208dd356b4 (keep-lines-read-args): Add INTERACTIVE arg.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63736
diff changeset
1953 ;;; return markers which are appropriate for editing.
56228
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1954 (if replaced
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1955 (list
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1956 (match-beginning 0)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1957 (match-end 0)
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1958 (current-buffer))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1959 (match-data t)))
4e0ea2b75232 (query-replace-read-args): Implement `\,' and `\#'
David Kastrup <dak@gnu.org>
parents: 56148
diff changeset
1960 stack)))))
29952
3e2589e69a8a (perform-replace): Undo change of 2000-04-04.
Gerd Moellmann <gerd@gnu.org>
parents: 29051
diff changeset
1961
5393
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1962 (replace-dehighlight))
10157
7953cde9d951 (perform-replace): Report number of replacements when done.
Richard M. Stallman <rms@gnu.org>
parents: 10155
diff changeset
1963 (or unread-command-events
7953cde9d951 (perform-replace): Report number of replacements when done.
Richard M. Stallman <rms@gnu.org>
parents: 10155
diff changeset
1964 (message "Replaced %d occurrence%s"
7953cde9d951 (perform-replace): Report number of replacements when done.
Richard M. Stallman <rms@gnu.org>
parents: 10155
diff changeset
1965 replace-count
7953cde9d951 (perform-replace): Report number of replacements when done.
Richard M. Stallman <rms@gnu.org>
parents: 10155
diff changeset
1966 (if (= replace-count 1) "" "s")))
96908
531d21ce5cca (multi-query-replace-map): New variable.
Juri Linkov <juri@jurta.org>
parents: 96419
diff changeset
1967 (or (and keep-going stack) multi-buffer)))
61
20f2a7720e65 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1968
5393
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1969 (defvar replace-overlay nil)
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1970
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1971 (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
1972 string regexp case-fold)
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1973 (if query-replace-highlight
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1974 (if replace-overlay
60101
aa148fbcec2e (perform-replace): Pass new args to replace-highlight.
Richard M. Stallman <rms@gnu.org>
parents: 59996
diff changeset
1975 (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
1976 (setq replace-overlay (make-overlay match-beg match-end))
67426
eac49762e6b9 (replace-highlight): Change overlay priority from 1 to 1001.
Juri Linkov <juri@jurta.org>
parents: 67187
diff changeset
1977 (overlay-put replace-overlay 'priority 1001) ;higher than lazy overlays
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1978 (overlay-put replace-overlay 'face 'query-replace)))
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1979 (if query-replace-lazy-highlight
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1980 (let ((isearch-string string)
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1981 (isearch-regexp regexp)
75921
1c3c5aeeb934 (replace-highlight): Bind search-whitespace-regexp to nil.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1982 (search-whitespace-regexp nil)
109715
843bffdd92eb Fix query-replace-regexp incomplete highlighting (Bug#6808).
Chong Yidong <cyd@stupidchicken.com>
parents: 106815
diff changeset
1983 (isearch-case-fold-search case-fold)
843bffdd92eb Fix query-replace-regexp incomplete highlighting (Bug#6808).
Chong Yidong <cyd@stupidchicken.com>
parents: 106815
diff changeset
1984 (isearch-forward t)
843bffdd92eb Fix query-replace-regexp incomplete highlighting (Bug#6808).
Chong Yidong <cyd@stupidchicken.com>
parents: 106815
diff changeset
1985 (isearch-error nil))
108721
c465f7b92264 * replace.el (replace-highlight): Fix lazy-highlighting
Juri Linkov <juri@jurta.org>
parents: 107656
diff changeset
1986 ;; Set isearch-word to nil because word-replace is regexp-based,
c465f7b92264 * replace.el (replace-highlight): Fix lazy-highlighting
Juri Linkov <juri@jurta.org>
parents: 107656
diff changeset
1987 ;; so `isearch-search-fun' should not use `word-search-forward'.
c465f7b92264 * replace.el (replace-highlight): Fix lazy-highlighting
Juri Linkov <juri@jurta.org>
parents: 107656
diff changeset
1988 (if (and isearch-word isearch-regexp) (setq isearch-word nil))
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1989 (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
1990
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1991 (defun replace-dehighlight ()
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1992 (when replace-overlay
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1993 (delete-overlay replace-overlay))
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1994 (when query-replace-lazy-highlight
60713
77391bae98f1 (perform-replace): Remove bindings of global
Juri Linkov <juri@jurta.org>
parents: 60240
diff changeset
1995 (lazy-highlight-cleanup lazy-highlight-cleanup)
58973
7fed010105d9 (perform-replace): Add isearch-case-fold-search.
Juri Linkov <juri@jurta.org>
parents: 58914
diff changeset
1996 (setq isearch-lazy-highlight-last-string nil)))
5393
cfd16a1af914 (query-replace-highlight): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 5337
diff changeset
1997
56355
ac4a6e4361cf (query-replace-descr): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56351
diff changeset
1998 ;; arch-tag: 16b4cd61-fd40-497b-b86f-b667c4cf88e4
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 324
diff changeset
1999 ;;; replace.el ends here