15.11 Other Search-and-Loop Commands
Here are some other commands that find matches for a regular expression. They all ignore case in matching, if the pattern contains no upper-case letters and case-fold-search
is non-nil
. Aside from multi-occur
and multi-occur-in-matching-buffers
, which always search the whole buffer, all operate on the text from point to the end of the buffer, or on the region if it is active.
M-x multi-isearch-buffers
​
Prompt for one or more buffer names, ending with RET
; then, begin a multi-buffer incremental search in those buffers. (If the search fails in one buffer, the next C-s
tries searching the next specified buffer, and so forth.) With a prefix argument, prompt for a regexp and begin a multi-buffer incremental search in buffers matching that regexp.
M-x multi-isearch-buffers-regexp
​
This command is just like multi-isearch-buffers
, except it performs an incremental regexp search.
M-x multi-isearch-files
​
Prompt for one or more file names, ending with RET
; then, begin a multi-file incremental search in those files. (If the search fails in one file, the next C-s
tries searching the next specified file, and so forth.) With a prefix argument, prompt for a regexp and begin a multi-file incremental search in files matching that regexp.
M-x multi-isearch-files-regexp
​
This command is just like multi-isearch-files
, except it performs an incremental regexp search.
In some modes that set the buffer-local variable multi-isearch-next-buffer-function
(e.g., in Change Log mode) a multi-file incremental search is activated automatically.
M-x occur
​
M-s o
​
Prompt for a regexp, and display a list showing each line in the buffer that contains a match for it. If you type M-n
at the prompt, you can reuse search strings from previous incremental searches. The text that matched is highlighted using the match
face. A numeric argument n
specifies that n
lines of context are to be displayed before and after each matching line.
The default number of context lines is specified by the variable list-matching-lines-default-context-lines
. When list-matching-lines-jump-to-current-line
is non-nil
the current line is shown highlighted with face list-matching-lines-current-line-face
and the point is set at the first match after such line.
You can also run M-s o
when an incremental search is active; this uses the current search string.
Note that matches for the regexp you type are extended to include complete lines, and a match that starts before the previous match ends is not considered a match.
In the *Occur*
buffer, you can click on each entry, or move point there and type RET
, to visit the corresponding position in the buffer that was searched. o
and C-o
display the match in another window; C-o
does not select it. Alternatively, you can use the M-g M-n
(next-error
) command to visit the occurrences one by one (see Compilation Mode).
Typing e
in the *Occur*
buffer switches to Occur Edit mode, in which edits made to the entries are also applied to the text in the originating buffer. Type C-c C-c
to return to Occur mode.
The command M-x list-matching-lines
is a synonym for M-x occur
.
M-x multi-occur
​
This command is just like occur
, except it is able to search through multiple buffers. It asks you to specify the buffer names one by one.
M-x multi-occur-in-matching-buffers
​
This command is similar to multi-occur
, except the buffers to search are specified by a regular expression that matches visited file names. With a prefix argument, it uses the regular expression to match buffer names instead.
M-x how-many
​
Prompt for a regexp, and print the number of matches for it in the buffer after point. If the region is active, this operates on the region instead.
M-x flush-lines
​
Prompt for a regexp, and delete each line that contains a match for it, operating on the text after point. When the command finishes, it prints the number of deleted matching lines.
This command deletes the current line if it contains a match starting after point. If the region is active, it operates on the region instead; if a line partially contained in the region contains a match entirely contained in the region, it is deleted.
If a match is split across lines, flush-lines
deletes all those lines. It deletes the lines before starting to look for the next match; hence, it ignores a match starting on the same line at which another match ended.
M-x keep-lines
​
Prompt for a regexp, and delete each line that does not contain a match for it, operating on the text after point. If point is not at the beginning of a line, this command always keeps the current line. If the region is active, the command operates on the region instead; it never deletes lines that are only partially contained in the region (a newline that ends a line counts as part of that line).
If a match is split across lines, this command keeps all those lines.