summaryrefslogtreecommitdiffstats
path: root/lisp/init-grep.el
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-07-08 23:29:00 +0200
committerMartin Polden <mpolden@mpolden.no>2021-07-08 23:34:28 +0200
commitb151178b2e1784c4385429be23c88fd908d77e53 (patch)
tree3a8109cd40e2f9984d55e1a0d2dc09628c08dfd0 /lisp/init-grep.el
parent4d492f0f59ef745ff3f369647ae70166783e2092 (diff)
grep: Better detection of Git root directory
Diffstat (limited to 'lisp/init-grep.el')
-rw-r--r--lisp/init-grep.el20
1 files changed, 16 insertions, 4 deletions
diff --git a/lisp/init-grep.el b/lisp/init-grep.el
index 4b0d0ca..6f23f47 100644
--- a/lisp/init-grep.el
+++ b/lisp/init-grep.el
@@ -5,12 +5,24 @@
(defvar mpolden/rg-template "rg -nH --no-heading <C> -e <R> -- "
"The grep template to use when rg (ripgrep) is installed.")
+(defun mpolden/git-root-dir (filename)
+ "Return the root directory to the Git repository of FILENAME.
+Return nil if FILENAME is not in a Git repository."
+ (let* ((dir (if (directory-name-p filename)
+ filename
+ (file-name-directory filename)))
+ (git-dir (expand-file-name ".git" dir)))
+ (cond ((file-directory-p git-dir) dir)
+ ((not (equal dir "/")) (mpolden/git-root-dir
+ (directory-file-name dir))))))
+
(defun mpolden/grep ()
- "Run grep interactively in `default-directory' or current VC tree."
+ "Run grep interactively in `default-directory' or current Git repository."
(interactive)
- (let ((vc-root-dir (vc-root-dir)))
- (if vc-root-dir
- (vc-git-grep (grep-read-regexp) "" vc-root-dir)
+ (let ((git-root-dir (mpolden/git-root-dir (or buffer-file-name
+ default-directory))))
+ (if git-root-dir
+ (vc-git-grep (grep-read-regexp) "" git-root-dir)
(lgrep (grep-read-regexp) "" default-directory))))
(defun mpolden/grep-visit-buffer-other-window (&optional result noselect)