git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "David Kågedal" <davidk@lysator.liu.se>
To: vanicat@debian.org (Rémi Vanicat)
Cc: git@vger.kernel.org, julliard@winehq.org,
	David Christensen <david@endpoint.com>
Subject: Re: [PATCH] git.el: Add "git grep" functionality in a grep-style compilation buffer
Date: Tue, 09 Sep 2008 17:14:16 +0200	[thread overview]
Message-ID: <87sks973nb.fsf@lysator.liu.se> (raw)
In-Reply-To: <87d4jdcqyk.dlv@maison.homelinux.org> ("Rémi Vanicat"'s message of "Tue\, 09 Sep 2008 16\:51\:47 +0200")

vanicat@debian.org (Rémi Vanicat) writes:

> 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:
>
>> 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 ?

Kindof. This seems to be an improved version that doesn't fail on
older emacsen and that adds a menu. I'm not sure who contributed that,
but it's probably also in some mail somewhere. I use this every day
(but without the improvements) and I think it is really useful.

> -- 
> 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

-- 
David Kågedal

      reply	other threads:[~2008-09-09 15:15 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-30 18:55 [PATCH] git.el: Add "git grep" functionality in a grep-style compilation buffer David Christensen
2008-09-09  9:25 ` David Kågedal
2008-09-09 14:51   ` Rémi Vanicat
2008-09-09 15:14     ` David Kågedal [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87sks973nb.fsf@lysator.liu.se \
    --to=davidk@lysator.liu.se \
    --cc=david@endpoint.com \
    --cc=git@vger.kernel.org \
    --cc=julliard@winehq.org \
    --cc=vanicat@debian.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).