Emacs: Interactive Find Replace Text in Directory

By Xah Lee. Date: . Last updated: .

Suppose you want to do find and replace, for hundreds of files in a directory, either in one shot, or asking yes/no for each occurrence. Here's the solution.

Note: you need to have unix commands { grep, find, xargs } installed. If not, use Emacs: Xah Find Replace (xah-find.el)

Select Target Directory

Alt+x dired, then type a directory path, to list a directory. [see Emacs: File Manager, dired]

Press ^ to go up a directory.

Now, your cursor should be on the directory you want to do the find/replace.

emacs dired find replace dir 2017 06 24
emacs dired

Select Only Some Files

If you want to find/replace only files ending in “.html”, or “.js”, or other selections of files, you need to mark files.

Mark Files/Directories

m
Mark the file/directory under cursor.
u
Unmark the file/directory under cursor.
U
Unmark all marked.
emacs dired marked files 2017 06 d830f
emacs dired marked files

Mark Files by Regex

Alt+x dired-mark-files-regexp% m

then type a regex. [see Emacs: Regular Expression Syntax]

For example, if you want to mark all files ending in “.html”, then type % m then \.html$.

Interactive Find Replace

Alt+x dired-do-query-replace-regexpQ】.

Answer the prompt, by typing find regex string and replace string. [see Emacs: Regular Expression Syntax]

For example, type “queen” Enter then “princess”, to replace words “queen” by “princess”.

The Result Window

Emacs will show result, in a split window.

emacs dired do query replace regexp 2017 06 96227
emacs dired-do-query-replace-regexp result. Note the prompt at bottom.

The top pane, is a file where a match is found. Cursor is place on the word.

The bottom pane shows a list of files where match is found. This buffer is name “*xref*”.

In the top pane showing the actual file, the following keys are available:

y
Replace current highlighted occurrence. (emacs will then jump to next one.)
n
Skip.
Ctrl+g
Abort the whole find/replace.
!
Replace all occurrences in current file without more asking.
N
Skip all possible replacement for rest of the current file.
Y
Do the replacement on all files without further asking.

If you want to cancel the whole operation without saving any changes you've made, type Ctrl+g, then exit emacs.

Result Overview: xref buffer

The bottom pane buffer named “*xref*”, lists all the occurrences and files.

Move cursor to the “*xref*” pane, then the following keys are available:

Enter
Display the reference on the current line.
n or .
Move to the next reference and display it in the other window (xref-next-line).
p or ,
Move to the previous reference and display it in the other window (xref-prev-line).
Ctrl+o
Display the reference on the current line in the other window (xref-show-location-at-point).
r
Prompt for find replace with regex. (xref-query-replace-in-results)
q
Quit the window showing the *xref* buffer. (quit-window)

In the xref buffer, Alt+x describe-mode to see the doc.

Xref Commands (Emacs Manual)

Save Changed Files

Alt+x ibuffer to list all opened files.

  1. Type * u to mark all unsaved files
  2. type S to save all marked files
  3. type D to close them all.

Alternative to the above options, Alt+x save-some-buffersCtrl+x s】. Then emacs will display each unsaved file and ask if you want it saved.

Emacs Find Replace

Find Replace Scripts