[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Doing search and replace via *grep* buffer
From: |
Kim F. Storm |
Subject: |
Doing search and replace via *grep* buffer |
Date: |
Thu, 15 Feb 2007 13:11:20 +0100 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.0.93 (gnu/linux) |
Here is a small patch which provides a very handy search and replace
functionality via the normal grep interfaces (including lgrep/rgrep).
It requires that grep regexp highlighting works (I suppose most modern
grep programs do that).
Here is an example of its use, replacing _some_ occurrences of
the identifier `oldtext' with `newtext':
First use rgrep to search for oldtext in all .c and .h files:
M-x rgrep RET oldtext RET ch RET RET
Then in the *grep* buffer, move to the first instance which you want to
replace (use `n' or C-n).
Then hit / and type the replacement text:
/ newtext RET
Now, still in the *grep* buffer, move to the next instance you want
to modify, and just hit . to repeat the replacement, for example:
n n . n . n . n n n .
(I suppose VI users will find this very familiar).
*** grep.el 14 Feb 2007 12:54:20 +0100 1.69
--- grep.el 15 Feb 2007 12:46:01 +0100
***************
*** 185,192 ****
--- 185,195 ----
(define-key map "\r" 'compile-goto-error) ;; ?
(define-key map "n" 'next-error-no-select)
(define-key map "p" 'previous-error-no-select)
+ (define-key map "o" 'grep-goto-error-no-select)
(define-key map "{" 'compilation-previous-file)
(define-key map "}" 'compilation-next-file)
+ (define-key map "/" 'grep-replace-match)
+ (define-key map "." 'grep-repeat-replace-match)
(define-key map "\t" 'compilation-next-error)
(define-key map [backtab] 'compilation-previous-error)
***************
*** 790,795 ****
--- 793,831 ----
(if (eq next-error-last-buffer (current-buffer))
(setq default-directory dir)))))))
+ (defun grep-goto-error-no-select ()
+ "Display currently grep match in other window."
+ (interactive)
+ (save-selected-window
+ (compile-goto-error)))
+
+ (defvar grep-last-replace-string nil)
+
+ (defun grep-replace-match-internal ()
+ (when compilation-highlight-overlay
+ (let ((start (overlay-start compilation-highlight-overlay)))
+ (goto-char start)
+ (undo-boundary)
+ (delete-region start (overlay-end compilation-highlight-overlay))
+ (insert grep-last-replace-string)
+ (move-overlay compilation-highlight-overlay start (point)))))
+
+ (defun grep-replace-match (string)
+ "Replace current grep match with string STRING."
+ (interactive "sReplace with: ")
+ (save-selected-window
+ (setq grep-last-replace-string string)
+ (let ((next-error-highlight
+ (if (numberp next-error-highlight) next-error-highlight 0.01))
+ (next-error-hook '(grep-replace-match-internal)))
+ (compile-goto-error))))
+
+ (defun grep-repeat-replace-match ()
+ "Replace current grep match with last match replace string."
+ (interactive)
+ (if (not grep-last-replace-string)
+ (call-interactively 'grep-replace-match)
+ (grep-replace-match grep-last-replace-string)))
+
(provide 'grep)
--
Kim F. Storm <address@hidden> http://www.cua.dk
- Doing search and replace via *grep* buffer,
Kim F. Storm <=