Previous: Replace, Up: Search


20.10 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 occur and its variants, all operate on the text from point to the end of the buffer, or on the active region in Transient Mark mode.

M-x occur <RET> regexp <RET>
Display a list showing each line in the buffer that contains a match for regexp. To limit the search to part of the buffer, narrow to that part (see Narrowing). A numeric argument n specifies that n lines of context are to be displayed before and after each matching line. Currently, occur can not correctly handle multiline matches.

The buffer ‘*Occur*’ containing the output serves as a menu for finding the occurrences in their original context. Click Mouse-2 on an occurrence listed in ‘*Occur*’, or position point there and type <RET>; this switches to the buffer that was searched and moves point to the original of the chosen occurrence. o and C-o display the match in another window; C-o does not select it.

Occur mode supports the next-error functionality described in Compilation Mode.

M-x list-matching-lines
Synonym for M-x occur.
M-x multi-occur <RET> buffers <RET> regexp <RET>
This function is just like occur, except it is able to search through multiple buffers.
M-x multi-occur-by-filename-regexp <RET> bufregexp <RET> regexp <RET>
This function is similar to multi-occur, except the buffers to search are specified by a regexp on their filename.
M-x how-many <RET> regexp <RET>
Print the number of matches for regexp that exist in the buffer after point. In Transient Mark mode, if the region is active, the command operates on the region instead.
M-x flush-lines <RET> regexp <RET>
This command deletes each line that contains a match for regexp, operating on the text after point; it deletes the current line if it contains a match starting after point. In Transient Mark mode, if the region is active, the command operates on the region instead; it deletes a line partially contained in the region if it contains a match entirely contained in the region.

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 <RET> regexp <RET>
This command deletes each line that does not contain a match for regexp, operating on the text after point; if point is not at the beginning of a line, it always keeps the current line. In Transient Mark mode, 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.

You can also search multiple files under control of a tags table (see Tags Search) or through the Dired A command (see Operating on Files), or ask the grep program to do it (see Grep Searching).