diff options
author | Dan Nicolaescu <dann@ics.uci.edu> | 2008-03-26 06:35:55 +0000 |
---|---|---|
committer | Dan Nicolaescu <dann@ics.uci.edu> | 2008-03-26 06:35:55 +0000 |
commit | f0e1713e2a1fc1c846436824b28e43d0faf72d3a (patch) | |
tree | 91e0fac70f1e0054352fea5ff0876ac614c35cd8 /lisp/vc-git.el | |
parent | a58b57e22c9d9dd474f42441498e15f84349b909 (diff) | |
download | emacs-f0e1713e2a1fc1c846436824b28e43d0faf72d3a.tar.gz |
(vc-git-extra-menu-map): New key map.
(vc-git-extra-menu, vc-git-extra-status-menu, vc-git-grep):
New functions.
Diffstat (limited to 'lisp/vc-git.el')
-rw-r--r-- | lisp/vc-git.el | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/lisp/vc-git.el b/lisp/vc-git.el index f75c4b8b810..9706afed983 100644 --- a/lisp/vc-git.el +++ b/lisp/vc-git.el @@ -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 @@ or BRANCH^ (where \"^\" can be repeated)." (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 |