15.10.4 Query Replace
M-% string RET newstring RET
Replace some occurrences of string with newstring.
C-M-% regexp RET newstring RET
Replace some matches for regexp with newstring.
If you want to change only some of the occurrences of ‘ foo
’ to
‘ bar
’, not all of them, use M-%
( query-replace
).
This command finds occurrences of ‘ foo
’ one by one, displays each
occurrence and asks you whether to replace it. Aside from querying,
query-replace
works just like replace-string
(see Unconditional Replacement). In particular, it preserves case
provided case-replace
is non- nil
, as it normally is
(see Replace Commands and Lax Matches). A numeric argument means to
consider only occurrences that are bounded by word-delimiter
characters. A negative prefix argument replaces backward.
C-M-%
performs regexp search and replace ( query-replace-regexp
).
It works like replace-regexp
except that it queries
like query-replace
.
You can reuse earlier replacements with these commands. When
query-replace
or query-replace-regexp
prompts for the
search string, use M-p
and M-n
to show previous
replacements in the form ‘ from -> to
’, where
from is the search pattern, to is its replacement, and the
separator between them is determined by the value of the variable
query-replace-from-to-separator
. Type RET
to select the
desired replacement. If the value of this variable is nil
,
replacements are not added to the command history, and cannot be
reused.
These commands highlight the current match using the face
query-replace
. You can disable this highlight by setting the
variable query-replace-highlight
to nil
. They highlight
other matches using lazy-highlight
just like incremental search
(see Incremental Search); this can be disabled by setting
query-replace-lazy-highlight
to nil
. By default,
query-replace-regexp
will show the substituted replacement
string for the current match in the minibuffer. If you want to keep
special sequences ‘ \&
’ and ‘ \n
’ unexpanded, customize
query-replace-show-replacement
variable.
Like search-highlight-submatches
highlights subexpressions in
incremental search (see Tailoring Search to Your Needs), the variable
query-replace-highlight-submatches
defines whether to highlight
subexpressions in the regexp replacement commands.
The variable query-replace-skip-read-only
, if set
non- nil
, will cause replacement commands to ignore matches in
read-only text. The default is not to ignore them.
The characters you can type when you are shown a match for the string or regexp are:
SPC``y
to replace the occurrence with newstring.
DEL``Delete``BACKSPACE``n
to skip to the next occurrence without replacing this one.
, (Comma)
to replace this occurrence and display the result. You are then asked
for another input character to say what to do next. Since the
replacement has already been made, DEL
and SPC
are
equivalent in this situation; both move to the next occurrence.
You can type C-r
at this point (see below) to alter the replaced
text. You can also undo the replacement with the undo
command
(e.g., type C-x u
; see Undo); this exits the
query-replace
, so if you want to do further replacement you
must use C-x ESC ESC RET
to restart
(see Repeating Minibuffer Commands).
RET``q
to exit without doing any more replacements.
. (Period)
to replace this occurrence and then exit without searching for more occurrences.
!
to replace all remaining occurrences without asking again.
^
to go back to the position of the previous occurrence (or what used to be an occurrence), in case you changed it by mistake or want to reexamine it.
u
to undo the last replacement and go back to where that replacement was made.
U
to undo all the replacements and go back to where the first replacement was made.
C-r
to enter a recursive editing level, in case the occurrence needs to be
edited rather than just replaced with newstring. When you are
done, exit the recursive editing level with C-M-c
to proceed to
the next occurrence. See Recursive Editing Levels.
C-w
to delete the occurrence, and then enter a recursive editing level as in
C-r
. Use the recursive edit to insert text to replace the deleted
occurrence of string. When done, exit the recursive editing level
with C-M-c
to proceed to the next occurrence.
e``E
to edit the replacement string in the minibuffer. When you exit the
minibuffer by typing RET
, the minibuffer contents replace the
current occurrence of the pattern. They also become the new
replacement string for any further occurrences.
C-l
to redisplay the screen. Then you must type another character to specify what to do with this occurrence.
Y (Upper-case)
to replace all remaining occurrences in all remaining buffers in
multi-buffer replacements (like the Dired Q
command that performs
query replace on selected files). It answers this question and all
subsequent questions in the series with “yes”, without further
user interaction.
N (Upper-case)
to skip to the next buffer in multi-buffer replacements without replacing remaining occurrences in the current buffer. It answers this question “no”, gives up on the questions for the current buffer, and continues to the next buffer in the sequence.
C-h``?``F1
to display a message summarizing these options. Then you must type another character to specify what to do with this occurrence.
Aside from this, any other character exits the query-replace
,
and is then reread as part of a key sequence. Thus, if you type
C-k
, it exits the query-replace
and then kills to end of
line. In particular, C-g
simply exits the query-replace
.
To restart a query-replace
once it is exited, use C-x ESC ESC
, which repeats the query-replace
because it
used the minibuffer to read its arguments. See C-x ESC
ESC
.
The option search-invisible
determines how query-replace
treats invisible text. See Outline Search.
See Operating on Files, for the Dired Q
command which
performs query replace on selected files. See also Transforming File Names in Dired, for Dired commands to rename, copy, or link files by
replacing regexp matches in file names.