emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Doing search and replace via *grep* buffer


From: Andreas Roehler
Subject: Re: Doing search and replace via *grep* buffer
Date: Thu, 15 Feb 2007 19:41:54 +0100
User-agent: Thunderbird 1.5.0.4 (X11/20060516)


Thanks, already looked for something like that.

`grep-replace-match' changes original contents as
expected if cursor in grep-buffer is over match
(highlighted).

Otherwise I'm still prompted for replacement, but get

"compilation-next-error: No grep hit here"

afterwards.

__
Andreas Roehler

GNU Emacs 22.0.93.1 (i686-pc-linux-gnu, X toolkit,
Xaw3d scroll bars) of 2007-02-11

Suse 10.0




Kim F. Storm schrieb:
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)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]