Emacs Lisp: Find Replace Text in Buffer
Search and Find Replace Functions
These search functions are used for search text, do find replace, and also move cursor to where a pattern occur:
- text search:
search-forward
andsearch-backward
- regex search:
re-search-forward
(aliassearch-backward-regexp
) andre-search-backward
(aliassearch-forward-regexp
)
The forward versions place cursor at end of match. The backward versions place cursor at begin of match.
[see Emacs Lisp: Regex Functions]
Find Replace Text in Buffer
Typical way to do string replacement in current buffer:
(let ((case-fold-search nil)) ;; set case-fold-search to t, if u want to ignore case (goto-char (point-min)) (while (search-forward "myStr1" nil t) (replace-match "myReplaceStr1")) (goto-char (point-min)) (while (search-forward "myStr2" nil t) (replace-match "myReplaceStr2")) ;; repeat for other string pairs )
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) ; case sensitive search ) ;; find replace 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.
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
. Example:
(save-restriction (narrow-to-region pos1 pos2) body )
;; 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 p1 p2)
and use
(point-min)
and
(point-max)
for boundary,
once you narrowed.
Find Replace Multiple Pairs
If you need to find replace multiple pairs frequently, see: Emacs: Xah Replace Pairs, xah-replace-pairs.el.
Emacs Regular Expression
- Regular Expression
- Regex Syntax
- About Quoting Regex
- Case Sensitivity
- How to Insert a Tab or Newline
- Wildcards vs Regex
- Emacs Regex vs Python, JavaScript, Java