changeset 93240:231f72336aed

(vc-git-extra-menu-map): New key map. (vc-git-extra-menu, vc-git-extra-status-menu, vc-git-grep): New functions.
author Dan Nicolaescu <dann@ics.uci.edu>
date Wed, 26 Mar 2008 06:35:55 +0000
parents 3d37b67e5a01
children 81cbb24a7f16
files lisp/ChangeLog lisp/vc-git.el
diffstat 2 files changed, 69 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Wed Mar 26 04:46:42 2008 +0000
+++ b/lisp/ChangeLog	Wed Mar 26 06:35:55 2008 +0000
@@ -1,5 +1,9 @@
 2008-03-26  Dan Nicolaescu  <dann@ics.uci.edu>
 
+	* vc-git.el (vc-git-extra-menu-map): New key map.
+	(vc-git-extra-menu, vc-git-extra-status-menu, vc-git-grep):
+	New functions.
+
 	* vc-hooks.el (vc-default-mode-line-string): Deal with 'removed
 	and 'missing files.
 
--- a/lisp/vc-git.el	Wed Mar 26 04:46:42 2008 +0000
+++ b/lisp/vc-git.el	Wed Mar 26 06:35:55 2008 +0000
@@ -108,7 +108,7 @@
 ;; - find-file-hook ()				   NOT NEEDED
 ;; - find-file-not-found-hook ()                   NOT NEEDED
 
-(eval-when-compile (require 'cl) (require 'vc))
+(eval-when-compile (require 'cl) (require 'vc) (require 'grep))
 
 (defvar git-commits-coding-system 'utf-8
   "Default coding system for git commits.")
@@ -489,6 +489,70 @@
 (defun vc-git-rename-file (old new)
   (vc-git-command nil 0 (list old new) "mv" "-f" "--"))
 
+(defvar vc-git-extra-menu-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [git-grep]
+      '(menu-item "Git grep..." vc-git-grep
+		  :help "Run the `git grep' command"))
+    map))
+
+(defun vc-git-extra-menu () vc-git-extra-menu-map)
+
+(defun vc-git-extra-status-menu () vc-git-extra-menu-map)
+
+;; Derived from `lgrep'.
+(defun vc-git-grep (regexp &optional files dir)
+  "Run git grep, searching for REGEXP in FILES in directory 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 `grep-command'.
+
+Collect output in a buffer.  While git grep 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.
+
+This command shares argument histories with \\[rgrep] and \\[grep]."
+  (interactive
+   (progn
+     (grep-compute-defaults)
+     (cond
+      ((equal current-prefix-arg '(16))
+       (list (read-from-minibuffer "Run: " "git grep"
+				   nil nil 'grep-history)
+	     nil))
+      (t (let* ((regexp (grep-read-regexp))
+		(files (grep-read-files regexp))
+		(dir (read-directory-name "In directory: "
+					  nil default-directory t)))
+	   (list regexp files dir))))))
+  (require 'grep)
+  (when (and (stringp regexp) (> (length regexp) 0))
+    (let ((command regexp))
+      (if (null files)
+	  (if (string= command "git grep")
+	      (setq command nil))
+	(setq dir (file-name-as-directory (expand-file-name dir)))
+	(setq command
+	      (grep-expand-template "git grep -n -e <R> -- <F>" regexp files))
+	(when command
+	  (if (equal current-prefix-arg '(4))
+	      (setq command
+		    (read-from-minibuffer "Confirm: "
+					  command nil nil 'grep-history))
+	    (add-to-history 'grep-history command))))
+      (when command
+	(let ((default-directory dir)
+	      (compilation-environment '("PAGER=")))
+	  ;; Setting process-setup-function makes exit-message-function work
+	  ;; even when async processes aren't supported.
+	  (compilation-start command 'grep-mode))
+	(if (eq next-error-last-buffer (current-buffer))
+	    (setq default-directory dir))))))
 
 ;;; Internal commands