Emacs: Interactive Find Replace Text in Directory
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.
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.
- When there are marked files, emacs will do find/replace only on those marked ones.
- When there are no marked files, emacs will do find/replace on the file/directory the cursor is on.
Mark Files/Directories
- m
- Mark the file/directory under cursor.
- u
- Unmark the file/directory under cursor.
- U
- Unmark all marked.
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-regexp
【Q】.
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.
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.
Save Changed Files
Alt+x ibuffer
to list all opened files.
- Type * u to mark all unsaved files
- type S to save all marked files
- type D to close them all.
Alternative to the above options, Alt+x save-some-buffers
【Ctrl+x s】. Then emacs will display each unsaved file and ask if you want it saved.
Emacs Find Replace
- Emacs: Search Text in Current File
- Emacs: Search Current Word 🚀
- Emacs Init: isearch Whitespace Regex
- Emacs Init: isearch by Arrow Keys
- Emacs: Highlight Word, Line
- Emacs: List Matching Lines
- Emacs: Search Text in Directory
- Emacs: Find Replace in Current File
- Emacs: Interactive Find Replace Text in Directory
- Emacs: Xah Find Replace (xah-find.el) 📦
- Emacs: Regular Expression
Find Replace Scripts
- Golang: Find String (grep) Script
- Golang: Script to Find Replace Multi-Pairs of Regex in a Directory
- Python: Find Replace Text in Dir
- Python: Find Replace Regex in Dir
- Perl: Find Replace String Pairs in Directory
- Emacs: Interactive Find Replace Text in Directory
- Emacs: Xah Find Replace (xah-find.el) 📦
- WolframLang: Find/Replace Script