68
votes

I want to search in all files from current folder for macro CODE_INIT_PARAMETERS. I can do M-x occur CODE_INIT_PARAMETERS but this shows only entries from open buffers.

Is there any way to search all files from current folder, from Emacs, without switching to M-x shell and then grep ? I want to avoid grep, because for some commands (M-x occur) Emacs do jumps to offending code, and I want that too. Thanks.

7

7 Answers

128
votes

You can try M-x rgrep.

It will ask for:

  • the directory where you want to search recursively
  • a file pattern for the files you want to include in the search
  • the pattern you want to search

As an extra, it will exclude source control private directories from your search (like CVS, .svn or .git).

13
votes

Emacs provides a built-in command:

M-x grep RET CODE_INIT_PARAMETERS *.c

(and 'grep-find to search sub directories)

Though I prefer the interface provided by an external package igrep (which provides the commands igrep and igrep-find).

8
votes

if you open a folder in dired, and mark all of the files (with 'm') you can run 'dired-do-search ('A' in my bindings). This will search all marked files. To get to the next one, run tags-loop-continue (M-,)

I have set up several elisp functions to mark various sub-sets of the files (.h files, .cpp files, etc) and to create a recursive dired to search a whole tree...

5
votes

This is an improvement on Trey Jackson's suggestion.

M-x grep

You will see the grep command, e.g. grep -nH -e

Add R to the first set of flags (for recursive), and put your search term after -e

grep -nHR -e CODE_INIT_PARAMETERS

Hit RET. The results will be understandable by Emacs -- you will be able to click or otherwise navigate to them, like M-x occur. You may need to put the search directory at the end of the command:

grep -nHR -e CODE_INIT_PARAMETERS /path/to/root/of/search
4
votes

M-x find-grep-dired also works similarly as rgrep

2
votes

In cases where

  1. you may be searching repeatedly; and
  2. etags will work

you might consider using etags and invoking either find-tag (bound to M-. by default) or tags-search (no default binding but can be continued with M-,).

1
votes

There is as well ack-grep mode for emacs which use the ack-grep tool which is specifically designed for ''grepping'' programming languages and IMHO looks nicer than the output of M-x grep.

But as mentioned earlier etags should be the proper way!