changeset 22208:5b05d45bfbbf

(grep-tag-default): New function. (grep): New default arg when prefix arg is specified.
author Richard M. Stallman <rms@gnu.org>
date Sun, 24 May 1998 01:10:12 +0000
parents 51847ba069f8
children 571020b7fc5e
files lisp/progmodes/compile.el
diffstat 1 files changed, 38 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/progmodes/compile.el	Sun May 24 01:00:03 1998 +0000
+++ b/lisp/progmodes/compile.el	Sun May 24 01:10:12 1998 +0000
@@ -553,10 +553,28 @@
 to find the text that grep hits refer to.
 
 This command uses a special history list for its arguments, so you can
-easily repeat a grep command."
+easily repeat a grep command.
+
+A prefix argument says to default the argument based upon the current
+tag the cursor is over."
   (interactive
-   (list (read-from-minibuffer "Run grep (like this): "
-			       grep-command nil nil 'grep-history)))
+   (let (grep-default)
+     (when (and current-prefix-arg grep-history)
+       (let* ((tag-default
+	       (funcall (or find-tag-default-function
+			    (get major-mode 'find-tag-default-function)
+			    ;; We use grep-tag-default instead of
+			    ;; find-tag-default, to avoid loading etags.
+			    'grep-tag-default))))
+	 (setq grep-default (car grep-history))
+	 ;; Replace the thing matching for with that around cursor
+	 (if (string-match "[^ ]+\\s +\\(-[^ ]+\\)*\\s *\\(\"[^\"]+\"\\|[^ ]+\\)" grep-default)
+	     (setq grep-default (replace-match tag-default t t
+					       grep-default 2)))))
+     (list (read-from-minibuffer "Run grep (like this): "
+				 (or grep-default grep-command)
+				 nil nil 'grep-history))))
+
   ;; Setting process-setup-function makes exit-message-function work
   ;; even when async processes aren't supported.
   (let* ((compilation-process-setup-function 'grep-process-setup)
@@ -567,6 +585,23 @@
 				;; Give it a simpler regexp to match.
 				nil grep-regexp-alist)))))
 
+;; This is a copy of find-tag-default from etags.el.
+(defun grep-tag-default ()
+  (save-excursion
+    (while (looking-at "\\sw\\|\\s_")
+      (forward-char 1))
+    (when (or (re-search-backward "\\sw\\|\\s_"
+				  (save-excursion (beginning-of-line) (point))
+				  t)
+	      (re-search-forward "\\(\\sw\\|\\s_\\)+"
+				 (save-excursion (end-of-line) (point))
+				 t))
+      (goto-char (match-end 0))
+      (buffer-substring (point)
+			(progn (forward-sexp -1)
+			       (while (looking-at "\\s'")
+				 (forward-char 1))
+			       (point))))))
 
 ;;;###autoload
 (defun grep-find (command-args)