Remi Vanicat <vanicat@xxxxxxxxxx> writes: > Here is a modification with inclusion of git-grep only when the grep > library is available. Nice. I didn't even know that require had more parameters. But I'd write nil instead of () in this case. > To put it in another file might be a good idea to, but in this case, > may be we could break this huge 1786 file in several smaller file. > > From 403143a61bf8f77d042893765b19cf7cc7062e59 Mon Sep 17 00:00:00 2001 > From: David Kågedal <davidk@xxxxxxxxxxxxxx> > Date: Fri, 22 Feb 2008 11:57:25 +0100 > Subject: [PATCH] git.el: Add a git-grep command > MIME-Version: 1.0 > Content-Type: text/plain; charset=utf-8 > Content-Transfer-Encoding: 8bit > > This allows easy access to git grep from Emacs. > > Signed-off-by: David Kågedal <davidk@xxxxxxxxxxxxxx> > Signed-off-by: Rémi Vanicat <vanicat@xxxxxxxxxx> > --- > 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 f69b697..afaf187 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.5.4.2.191.g7b407 -- David Kågedal - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html