git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] git.el: Add "git grep" functionality in a grep-style compilation buffer

From
Rémi Vanicat <vanicat@debian.org>
Date
Sep 9, 2008, 14:51 UTC
Message-ID
<87d4jdcqyk.dlv@maison.homelinux.org>
In-Reply-To
<871vzt8ydp.fsf@lysator.liu.se>
From: David Kågedal <davidk@lysator.liu.se>
Subject: [PATCH] [PATCH] git.el: Add a git-grep command
This allows easy access to git grep from Emacs.
Signed-off-by: David Kågedal <davidk@lysator.liu.se>
Tested-by: Rémi Vanicat <vanicat@debian.org>
---
David Kågedal <davidk@lysator.liu.se> writes:
Show 7 quoted lines
> David Christensen <david@endpoint.com> writes:
>
>> Signed-off-by: David Christensen <david@endpoint.com>
>
> I posted a longer version of git-grep that built on the grep commands
> in Emacs 22 a while ago. It gives you a better was to navigate to the
> hits etc. I'll dig it up again.
Was it this one ?
-- 
Rémi Vanicat
 contrib/emacs/git.el |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 52 insertions(+), 0 deletions(-)

diff --git a/contrib/emacs/git.el b/contrib/emacs/git.el
index c1cf1cb..57351a5 100644
--- a/contrib/emacs/git.el
+++ b/contrib/emacs/git.el
@@ -49,6 +49,7 @@
 (require 'ewoc)
 (require 'log-edit)
 (require 'easymenu)
+(require 'grep () t)
 
 
 ;;;; Customizations
@@ -1496,6 +1497,7 @@ amended version of it."
       ["Diff File" git-diff-file t]
       ["Interactive Diff File" git-diff-file-idiff t]
       ["Log" git-log-file t]
+      ,@(if (featurep 'grep) (list ["Grep" git-grep t]) ())
       "--------"
       ["Mark" git-mark-file t]
       ["Mark All" git-mark-all t]
@@ -1584,5 +1586,55 @@ Meant to be used in `after-save-hook'."
   (interactive)
   (describe-function 'git-status-mode))
 
+(when (featurep 'grep)
+  (defvar git-grep-history nil)
+
+  (defun git-grep (regexp &optional files dir)
+    "Recursively grep for REGEXP in FILES in directory tree rooted at DIR.
+The search is limited to file names matching shell pattern FILES.
+FILES may use abbreviations defined in `grep-files-aliases', e.g.
+entering `ch' is equivalent to `*.[ch]'.
+
+With \\[universal-argument] prefix, you can edit the constructed shell command line
+before it is executed.
+With two \\[universal-argument] prefixes, directly edit and run `git-grep-find-command'.
+
+Collect output in a buffer.  While find runs asynchronously, you
+can use \\[next-error] (M-x next-error), or \\<grep-mode-map>\\[compile-goto-error]
+in the grep output buffer, to go to the lines where grep found matches."
+    (interactive
+     (cond
+       ((equal current-prefix-arg '(16))
+       (list (read-from-minibuffer "Run: " "git grep "
+                                   nil nil 'git-grep-history)
+             nil))
+       (t (let* ((regexp (grep-read-regexp))
+                (files (grep-read-files regexp))
+                (dir (read-directory-name "Base directory: "
+                                          nil default-directory t)))
+           (list regexp files dir)))))
+    (when (and (stringp regexp) (> (length regexp) 0))
+      (if (null files)
+         (if (not (string= regexp grep-find-command))
+             (compilation-start regexp 'grep-mode))
+         (setq dir (file-name-as-directory (expand-file-name dir)))
+         (let ((command (concat
+                         "git grep -n "
+                         "-e " (shell-quote-argument regexp)
+                         (if (string= files "*")
+                             ""
+                             (concat " -- " (shell-quote-argument files))))))
+           (when command
+             (if current-prefix-arg
+                 (setq command
+                       (read-from-minibuffer "Confirm: "
+                                             command nil nil 'git-grep-history))
+                 (add-to-history 'git-grep-history command))
+             (let ((default-directory dir))
+               (compilation-start (concat "PAGER= " command) 'grep-mode))
+             ;; Set default-directory if we started rgrep in the *grep* buffer.
+             (if (eq next-error-last-buffer (current-buffer))
+                 (setq default-directory dir))))))))
+
 (provide 'git)
 ;;; git.el ends here
-- 
1.6.0.1.183.gb8d57
Previous: David KågedalNext: David Kågedal
Message 3 of 4 in “git.el: Add "git grep" functionality in a grep-style compilation buffer”
  1. git.el: Add "git grep" functionality in a grep-style compilation bufferDavid Christensen, Aug 30, 2008
  2. David KågedalSep 9, 2008
  3. Rémi VanicatSep 9, 2008
  4. David KågedalSep 9, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.