ELisp: Find Replace Text in Buffer
Search and Find Replace Functions
These search functions are used to search text, do find replace, and also move cursor to where a text occur:
search-forward
search-backward
re-search-forward
(aliassearch-backward-regexp
)re-search-backward
(aliassearch-forward-regexp
)
The forward versions place cursor at end of match. The backward versions place cursor at begin of match.
Find Replace Text in Buffer
Typical way to do text replacement in current buffer:
(let ((case-fold-search nil)) ;; set case-fold-search to t, if you want to ignore case (goto-char (point-min)) (while (search-forward "myStr" nil t) (replace-match "myReplaceStr")) ;; repeat for other string pairs ;; use re-search-forward if you want regex )
Case Sensitivity in Search
To control the letter case of search, locally set case-fold-search to t or nil. By default, it's t.
(let ((case-fold-search nil)) ;; set case-fold-search to t, if you want to ignore case ;; search text code here )
Case Sensitivity in Replacement
To control letter case of the replacement, use the optional arguments in replace-match
function.
(replace-match NEWTEXT &optional FIXEDCASE LITERAL STRING SUBEXP)
Use t for FIXEDCASE.
By default, the letter case used in replacement is smart. If the found text is First-cap or ALLCAPS, the replacement is accordingly.
Match Data
the begin/end positions of match, or capture, are storedin match-data
.
Find Replace in a Region
If you need to do find replace on a region only, wrap the code with save-restriction
and narrow-to-region
.
;; idiom for string replacement within a region (save-restriction (narrow-to-region pos1 pos2) (goto-char (point-min)) (while (search-forward "myStr1" nil t) (replace-match "myReplaceStr1")) ;; repeat for other string pairs )
🛑 WARNING: Boundary Change After Insert/Remove text
Whenever you work in a region, remember that the position of the end boundary is changed when you add or remove text in that region.
For example, suppose {p1, p2} is the boundary of some text you are interested.
After doing some change there, suppose you want to do some more change.
Don't just call (something-region p1 p2)
again, because p2 is no longer the correct boundary.
A good solution is to use
narrow-to-region
.
ELisp: Save narrow-to-region
Find Replace Multiple Pairs
A package to allow easy code for to find replace multiple pairs.
Emacs Lisp, Regex in Lisp Code
- ELisp: Regular Expression
- ELisp: Regex Functions
- Emacs: Regular Expression Syntax
- ELisp: Regex Backslash in Lisp Code
- ELisp: Case Sensitivity (case-fold-search)
- ELisp: Find Replace Text in Buffer
- ELisp: Match Data (Regex Result)
- ELisp: Unicode Escape Sequence
- ELisp: Convert Regex to Lisp Regex String
- ELisp: Tip: How to Test Regex
- ELisp: Regex in Readable Syntax, Package Rx
- ELisp: Regex Named Character Class and Syntax Table
- Emacs Regex vs Regex in Python, JavaScript, Java