15.10.3 Replace Commands and Lax Matches
This subsection describes the behavior of replace commands with respect to lax matches (see Lax Matching During Searching) and how to customize it. In general, replace commands mostly default to stricter matching than their search counterparts.
Unlike incremental search, the replacement commands do not use lax
space matching (see lax space matching) by default.
To enable lax space matching for replacement, change the variable
replace-lax-whitespace
to non- nil
. (This only affects
how Emacs finds the text to replace, not the replacement text.)
A companion variable replace-regexp-lax-whitespace
controls
whether query-replace-regexp
uses lax whitespace matching when
searching for patterns.
If the first argument of a replace command is all lower case, the
command ignores case while searching for occurrences to
replace—provided case-fold-search
is non- nil
and
search-upper-case
is also non- nil
. If
search-upper-case
(see search-upper-case) is
nil
, whether searching ignores case is determined by
case-fold-search
alone, regardless of letter-case of the
command’s first argument. If case-fold-search
is set to
nil
, case is always significant in all searches.
In addition, when the newstring argument is all or partly lower case, replacement commands try to preserve the case pattern of each occurrence. Thus, the command
M-x replace-string RET foo RET bar RET
replaces a lower case ‘ foo
’ with a lower case ‘ bar
’, an
all-caps ‘ FOO
’ with ‘ BAR
’, and a capitalized ‘ Foo
’ with
‘ Bar
’. (These three alternatives—lower case, all caps, and
capitalized, are the only ones that replace-string
can
distinguish.)
If upper-case letters are used in the replacement string, they remain
upper case every time that text is inserted. If upper-case letters are
used in the first argument, the second argument is always substituted
exactly as given, with no case conversion. Likewise, if either
case-replace
or case-fold-search
is set to nil
,
replacement is done without case conversion.
The replacement commands by default do not use character folding
(see character folding) when looking for the text to
replace. To enable character folding for matching in
query-replace
and replace-string
, set the variable
replace-char-fold
to a non- nil
value. (This
setting does not affect the replacement text, only how Emacs finds the
text to replace. It also doesn’t affect replace-regexp
.)