Commit f0e1713e authored by Dan Nicolaescu's avatar Dan Nicolaescu
Browse files

(vc-git-extra-menu-map): New key map.

(vc-git-extra-menu, vc-git-extra-status-menu, vc-git-grep):
New functions.
parent a58b57e2
2008-03-26 Dan Nicolaescu <>
* 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.
......@@ -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"))
(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]."
((equal current-prefix-arg '(16))
(list (read-from-minibuffer "Run: " "git grep"
nil nil 'grep-history)
(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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment