Almost a year ago I wrote
about my handy mu-recursive-grep, an easy way to combine rgrep and
vc-git-grep. But after Leah
Neukirchen
mentioned ugrep recently, I could not resist checking whether it was a good
fit for my daily Emacs usage. A couple of benchmark1 impressed me enough to
add support for it directly via xref-search-program-alist.
The details to configure everything you need are over at Using ugrep within
Emacs on the project
README. Once set, you can just hit C-x p g (project-find-regexp)
in your project and let ugrep do his magic.
Moreover, as the README mentions, it’s possible to leverage grep-template to
have commands like lgrep rely on ugrep.
(setq-default grep-template (string-join '("ugrep"
"--color=always"
"--ignore-binary"
"--ignore-case"
"--include=<F>"
"--line-number"
"--null"
"--recursive"
"--regexp=<R>")
" "))
Thus, mu-recursive-grep becomes a bit simpler:
(defun mu-recursive-grep (search-term search-path)
"Recursively search for SEARCH-TERM in SEARCH-PATH."
(interactive
(progn
(unless grep-command
(grep-compute-defaults))
(let ((search-term (grep-read-regexp))
(search-path (expand-file-name
(read-directory-name
"Directory: " nil default-directory t))))
(list search-term search-path))))
(lgrep search-term "*" search-path))
As mentioned in Grep’s good rep, for project-wide searches C-x p g is my go-to key binding.
However, there are situations when I want to limit the search to specific paths,
and that’s where I prefer using mu-recursive-grep.
A closing remark: before blindly leaving grep, ripgrep, or even
vc-git-grep behind, I suggest to benchmark the performance of each tool and
see what actually suits you best. You may find that whatever you are using at
the moment is already the best choice.