(defun git-grep-dired (repo wildcards regexp) "Find Git-controlled files in DIR with a name like WILDCARDS containing a regexp REGEXP and start Dired on output." (interactive "DGit-grep (directory): \nsGit-grep (filename wildcard(s), e.g. *.xml): \nsGit-grep (grep regexp): ") (setq repo (file-name-as-directory (expand-file-name repo))) (switch-to-buffer (concat "*Git Grep " repo "*")) (fundamental-mode) (setq buffer-read-only nil) (erase-buffer) (setq default-directory repo) (let ((cmd (format "git --git-dir %s/.git ls-files --recurse-submodules -z%s | xargs -0 grep -lZ -- %s | xargs -0 ls -l" repo (apply 'concat (mapcar (lambda (s) (concat " " (shell-quote-argument s))) (split-string wildcards))) (shell-quote-argument regexp)))) (insert " " cmd "\n " repo ":\n") (call-process-shell-command (concat cmd " | sed -e 's/^/ /g'") nil t)) (dired-mode) (dired-build-subdir-alist) (goto-line 2))