Skip to content

Instantly share code, notes, and snippets.

@jglick
Last active June 1, 2023 21:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jglick/bd7ba2ffb2b0ed155f0d38bf4c1ba5e1 to your computer and use it in GitHub Desktop.
Save jglick/bd7ba2ffb2b0ed155f0d38bf4c1ba5e1 to your computer and use it in GitHub Desktop.
Emacs command to look for a regexp among versioned files in a Git repo
(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))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment