1

One of the commands I find myself running very often is git grep. I would really like it to be accessible through the same magit menu as other commands. However, from my understanding of magit.el, it looks like the items there are hard-coded, and there's no way to add one more, unless I modify the source of this function.

Am I wrong?

Is there a better way?

I read this answer: https://emacs.stackexchange.com/a/12739/563 but I cannot understand what arguments transient-append-suffix needs. Also, it looks like the answer is too old / maybe doesn't work anymore.


What I have so far

(defun wvxvw-magit-grep (regex &optional args) (interactive (list (read-from-minibuffer "Expression: ") (transient-args 'magit-grep))) (let ((invert "") (extended "")) (while args (let ((val (car args))) (cond ((string-equal val "v") (setq invert "-v")) ((string-equal val "E") (setq extended "-E"))) (setq args (cdr args)))) (grep (format "git --no-pager grep -nH%s%s '%s'" invert extended regex)))) (defclass wvxvw-git-grep-expression-cls (transient-variable) ((scope :initarg :scope) (expression :initarg nil))) (transient-define-infix wvxvw-git-grep-expression-cmd () :class wvxvw-git-grep-expression-cls) (transient-define-prefix magit-grep () "Display git-grep command options." :man-page "git-grep" ["Arguments" ("-v" "Invert match" "-v") ("-E" "Extended regexp" "-E")] ["Actions" ("g" "Grep" wvxvw-magit-grep)]) (define-key magit-mode-map "G" 'magit-grep) 

There's a thing I don't like about it: This doesn't actually add it to the magit-dispatcher menu, so, this isn't available if you press h in Magit status buffer.

1
  • I will suggest a slightly different solution. Use project-find-regexp from any file or directory within a given git repository. You can bind it to a key of course. Commented Sep 16, 2021 at 15:03

1 Answer 1

2

SECOND EDIT (in response to you edit)

To format the expression differently, simply modify the string after the :argument keyword in your magit:--grep-expression argument definition (e.g. make it "Expression: ")

To add the prefix to the magit-dispatch popup, simply do it like I explained in the original answer (replace counsel-projectile-rg by magit-grep)

EDIT

To bind a command directly in the magit-status-mode-map, bind it as follows using define-key:

(define-key magit-status-mode-map "G" 'counsel-projectile-rg) 

I have bound it under G as g is already used as a prefix command in the magit-status buffer.

END EDIT

You can add a transient suffix with the following line of code:

(transient-insert-suffix 'magit-dispatch (kbd "h") '("G" "grep" counsel-projectile-rg)) 

read the docstring of transient-insert-suffix for an explanation. There is also the command transient-append-suffix which works similarly.

Here I am adding the command counsel-projectile-rg, which I use myself for this case (well actually I am just using the Spacemacs key-sequence SPC /), and which I can really recommend. There are equally good alternatives for helm, consult and probably more... also for other backends like grep, ag etc...

4
  • Well, this sort of accomplishes part of it, but not quite: 1. G key in the magit-status mode is unbound. I need to first press h to get the list of all possible bindings and only then pressing G invokes the git-grep command. 2. I still have no idea how to handle the options set in this popup. Commented Sep 19, 2021 at 8:03
  • In other words, it seems you are suggesting to add a new suffix to existing popup, but that's not what I want. I want to add a new prefix, that I can trigger from status mode like all other magit commands. Commented Sep 19, 2021 at 8:28
  • Ah okay, I see now. I was misled by your suggestion of using transient-append-suffix. In the magit-status buffer you can just bind a new command in its keymap. I will add how to do that then for completion (for counsel-projectile-rg). Or maybe you really want some prefix (i.e. some magit popup buffer)? But then I don't know from your question which infixes/suffixes you would like to add to it. Commented Sep 19, 2021 at 8:52
  • I'll post what I have so far tomorrow, hopefully it'll make it more clear. Commented Sep 19, 2021 at 18:09

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.