Sams Teach Yourself Emacs in 24 Hours |
|||||||||||||||||
Hour 8: Searching for Text in Multiple Files |
|||||||||||||||||
|
If you are used to UNIX, you will most certainly know the two commands called grep and find. grep lists the lines of a file that contain certain text, whereas find lists files that match a pattern. Together, these two commands can search for a given string in all files in a directory structure. Emacs has a command called grep (that is, M-x grep) which interfaces to the grep command. Now that you know about it, forget it please! I told you about it, in case you ever find yourself without igrep and really need to use grep instead. igrep has a much more user-friendly interface than grep. Furthermore, it combines find and grep, which makes it possible to search for files in a directory hierarchy. In the igrep library is a set of different functions:
fgrep--This grep command searches for fixed string matches (that is, no regular expressions).
igrep--This is the usual grep command, which searches using regular expressions.
agrep--This is an approximative grep, that is an ordinary string grep that allows a few errors. For example, it would match aproximative when searching for approximative.
Caution - agrep is not included in the usual grep packages, so it might not be installed at all at your system. It is, however, available from the WWW at http://glimpse.cs.arizona.edu/. |
To tell agrep how many errors are allowed, press C-u before pressing M-x agrep. This makes Emacs ask for options to agrep. Here, you must type -2 to tell it to accept two errors, for example.
Each of the three functions described previously searches for text in files in one directory. There also exist three functions called fgrep-find, igrep-find, and agrep-find, which work the same as those without the extension -find, but they work recursively in a whole directory structure--that is, files in the current directory and all its subdirectories.
Igrep.el by Kevin Rodgers is part of the XEmacs distribution but not part of the GNU Emacs distribution, so if you use GNU Emacs, you should copy igrep to your lisp directory. (If you use both GNU Emacs and XEmacs you should still copy it to your lisp directory. There is no trouble in using this one instead of the one shipped with XEmacs.) In Appendix A, "Installing Functions and Packages from the CD," there is a description on what you should do to install igrep (including what to put in your .emacs file).
Windows Notes - If you are using Windows 95 or 98, you will have to install one of the UNIX tool kits available for Windows, such as the Cygwin tools. There are copies on the CD-ROM. Again, see Appendix A. Windows NT supports regular expressions somewhat in its program findstr, but most UNIX greps are more powerful. findstr will do in a pinch if you put the following into your .emacs file: (setq grep-command "findstr /n") If you use Bash as your shell, insert the following into your .emacs: (setq w32-quote-process-args ?\") But then you won't need to substitute findstr for grep. However, neither operating system has a substitute for find. |
This task will demonstrate the igrep.el package by showing how you can search through all the standard C include files on your system for a given function. Follow these steps:
1. First you have to locate yourself in the base directory for your include files. (If you want to try this example and do not have include files installed, you might try it with your home directory and a search string that you want to search for in your files.) To go to this directory, press C-x C-f (find-file) and type the name of the directory. This loads the content of the directory into a special buffer. The mode for this buffer is called dired-mode (for directory editor ) and is described in detail in Hour 16, "Interfacing with the System" (see Figure 8.4).
Note - If you already are in the directory in which you want to search, you can skip this step. |
2. Now press M-x (fgrep-find). Emacs will ask you for an expression to search for. This is simply the search string when you use fgrep (see Figure 8.5).
3. Finally Emacs wants to know which files to search for the string in. By default it suggests *, which means all files. This is simply a pattern, known from the shell. So here you can tell it to search only in files ending in .h by typing *.h (see Figure 8.6).
Now Emacs searches recursively for matches, splits the window in two, and, in the lower part, displays the matches, one line for each match (see Figure 8.7).
The first three lines are simply the command used to find the matches. The actual matches start on the third line, which tells you which file the match is located in and which line it is located on and shows you the line.
Note - I have resized the window for your eyes only. Emacs doesn't resize itself. |
4. Now you can open the files with the matches and go to the line with the match, either by clicking the middle mouse button on the match or by moving point to the match and pressing Enter (see Figure 8.8).
If you have the feeling of déjà vu now, it might
simply be because the interface that igrep uses
is the same interface used by occur, which is described
in Hour 7. In fact, this interface is used
a lot of places in Emacs.
If you press M-u once before you press M-x fgrep, Emacs will ask you for options to give to fgrep. You can consult the manual page for fgrep for information about these options. There are two useful options, namely -i, which makes the searches not case sensitive, and -# (where # should be replaced with a number), which tells grep to display a number of context lines.
In Figure 8.9, you can see an example of the output where two context lines are displayed.
Sams Teach Yourself Emacs in 24 Hours |
|||||||||||||||||
Hour 8: Searching for Text in Multiple Files |
|||||||||||||||||
|
© Copyright Macmillan USA. All rights reserved.