28.4.1.3 Searching and Replacing with Identifiers
The commands in this section perform various search and replace operations either on identifiers themselves or on files that reference them.
M-?
Find all the references for the identifier at point.
M-x xref-query-replace-in-results RET regexp RET replacement RET
Interactively replace regexp with replacement in the names
of all the identifiers shown in the *xref*
buffer.
M-x tags-search RET regexp RET
Search for regexp through the files in the selected tags table.
M-x tags-query-replace RET regexp RET replacement RET
Perform a query-replace-regexp
on each file in the selected tags table.
M-x fileloop-continue
Restart one of the last 2 commands above, from the current location of point.
M-?
finds all the references for the identifier at point,
prompting for the identifier as needed, with completion. Depending on
the current backend (see Find Identifier References), the command may prompt even if it
finds a valid identifier at point. When invoked with a prefix
argument, it always prompts for the identifier. (If you want it to
prompt always, customize the value of the variable
xref-prompt-for-identifier
to t
; or set it to nil
to prompt only if there’s no usable identifier at point.) The command
then presents the *xref*
buffer with all the references to the
identifier, showing the file name and the line where the identifier is
referenced. The XREF mode commands are available in this buffer, see
Commands Available in the *xref*
Buffer.
If the value of the variable xref-auto-jump-to-first-xref
is
t
, xref-find-references
automatically jumps to the first
result and selects the window where it is displayed. If the value is
show
, the first result is shown, but the window showing the
*xref*
buffer is left selected. If the value is move
,
the first result is selected in the *xref*
buffer, but is not
shown. The default value is nil
, which just shows the results
in the *xref*
buffer, but doesn’t select any of them.
M-x xref-query-replace-in-results
reads a regexp to match identifier
names and a replacement string, just like ordinary M-x query-replace-regexp
. It then performs the specified replacement in
the names of the matching identifiers in all the places in all the
files where these identifiers are referenced. This is useful when you
rename your identifiers as part of refactoring. This command should
be invoked in the *xref*
buffer generated by M-?
.
M-x tags-search
reads a regexp using the minibuffer, then
searches for matches in all the files in the selected tags table, one
file at a time. It displays the name of the file being searched so
you can follow its progress. As soon as it finds an occurrence,
tags-search
returns. This command requires tags tables to be
available (see Tags Tables).
Having found one match with tags-search
, you probably want to
find all the rest. M-x fileloop-continue
resumes the
tags-search
, finding one more match. This searches the rest of
the current buffer, followed by the remaining files of the tags table.
M-x tags-query-replace
performs a single
query-replace-regexp
through all the files in the tags table. It
reads a regexp to search for and a string to replace with, just like
ordinary M-x query-replace-regexp
. It searches much like M-x tags-search
, but repeatedly, processing matches according to your
input. See Query Replace, for more information on query replace.
You can control the case-sensitivity of tags search commands by
customizing the value of the variable tags-case-fold-search
. The
default is to use the same setting as the value of
case-fold-search
(see Lax Matching During Searching).
It is possible to get through all the files in the tags table with a
single invocation of M-x tags-query-replace
. But often it is
useful to exit temporarily, which you can do with any input event that
has no special query replace meaning. You can resume the query
replace subsequently by typing M-x fileloop-continue
; this
command resumes the last tags search or replace command that you did.
For instance, to skip the rest of the current file, you can type
M-> M-x fileloop-continue
.
Note that the commands described above carry out much broader
searches than the xref-find-definitions
family. The
xref-find-definitions
commands search only for definitions of
identifiers that match your string or regexp. The commands
xref-find-references
, tags-search
, and
tags-query-replace
find every occurrence of the identifier or
regexp, as ordinary search commands and replace commands do in the
current buffer.
As an alternative to xref-find-references
and
tags-search
, you can run grep
as a subprocess and
have Emacs show you the matching lines one by one. See Searching with Grep under Emacs.