On Fri, Nov 25 2022, Yoichi Nakayama via GitGitGadget wrote: > From: Yoichi Nakayama <yoichi.nakayama@xxxxxxxxx> > > It works with GIT_EDITOR="emacs", "emacsclient" or "emacsclient -t" > > Signed-off-by: Yoichi Nakayama <yoichi.nakayama@xxxxxxxxx> > --- > contrib/git-jump/git-jump | 17 ++++++++++++++++- > 1 file changed, 16 insertions(+), 1 deletion(-) > > diff --git a/contrib/git-jump/git-jump b/contrib/git-jump/git-jump > index cc97b0dcf02..eef9cda832f 100755 > --- a/contrib/git-jump/git-jump > +++ b/contrib/git-jump/git-jump > @@ -23,7 +23,22 @@ EOF > > open_editor() { > editor=`git var GIT_EDITOR` > - eval "$editor -q \$1" > + case "$editor" in > + *emacs*) > + # Supported editor values are: > + # - emacs > + # - emacsclient > + # - emacsclient -t > + # > + # Wait for completion of the asynchronously executed process > + # to avoid race conditions in case of "emacsclient". > + eval "$editor --eval \"(let ((buf (compilation-start \\\"cat \$1\\\" 'grep-mode))) (pop-to-buffer buf) (select-frame-set-input-focus (selected-frame)) (while (get-buffer-process buf) (sleep-for 0.1)))\"" > + ;; > + *) > + # assume anything else is vi-compatible > + eval "$editor -q \$1" > + ;; > + esac > } > > mode_diff() { I'd really like to have some closer and smarter emacs integration like this. But I don't see why we need to run the grep ourselves, pipe it to a temporary file, and then discover that we're using emacs, and --eval code into it to switch to that buffer, and fake up a "M-x grep" command with a compilation buffer to make it look like we ran M-x grep in the first place. Let's just ... run M-x grep earlier? Then we can skip all the earlier steps. I experimented with this a bit locally, and I didn't get the "switch to buffer" semantics to work with this (but that's presumably easy, I'm just rusty on my elisp APIs), but something in this direction seems much better: diff --git a/contrib/git-jump/git-jump b/contrib/git-jump/git-jump index eef9cda832f..c932d7acd0f 100755 --- a/contrib/git-jump/git-jump +++ b/contrib/git-jump/git-jump @@ -22,23 +22,7 @@ EOF } open_editor() { - editor=`git var GIT_EDITOR` - case "$editor" in - *emacs*) - # Supported editor values are: - # - emacs - # - emacsclient - # - emacsclient -t - # - # Wait for completion of the asynchronously executed process - # to avoid race conditions in case of "emacsclient". - eval "$editor --eval \"(let ((buf (compilation-start \\\"cat \$1\\\" 'grep-mode))) (pop-to-buffer buf) (select-frame-set-input-focus (selected-frame)) (while (get-buffer-process buf) (sleep-for 0.1)))\"" - ;; - *) - # assume anything else is vi-compatible - eval "$editor -q \$1" - ;; - esac + eval "$editor -q \$1" } mode_diff() { @@ -83,11 +67,14 @@ mode_ws() { } use_stdout= +use_magic=t while test $# -gt 0; do case "$1" in --stdout) use_stdout=t - shift + ;; + --no-magic) + use_magic= ;; --*) usage >&2 @@ -96,7 +83,8 @@ while test $# -gt 0; do *) break ;; - esac + esac && + shift done if test $# -lt 1; then usage >&2 @@ -105,6 +93,22 @@ fi mode=$1; shift type "mode_$mode" >/dev/null 2>&1 || { usage >&2; exit 1; } +editor=`git var GIT_EDITOR` +if test "$use_magic" && test "$mode" = "grep" +then + case "$editor" in + *emacs*) + set -x + eval "$editor --eval \" \ + (grep \\\"git grep -H "$@"\\\") \ + \"" + exit + ;; + *) + ;; + esac +fi + if test "$use_stdout" = "t"; then "mode_$mode" "$@" exit 0 I.e. if we're going to trust emacs to eval this code, and assume that grep.el etc. works, let's just run the equivalent of M-x grep with our 'git grep' command. This is already better in that "grep" understands that I searched for "foo.*bar", so that's highlighted in the resulting buffer, just as with normal "grep" commands. This is missing the bit where we'd need to jump.grepCmd etc, so it's incomplete. I think this is all the prior art we'd need to invoke "git grep" the right way from emacs's "grep": https://github.com/eglaysher/find-things-fast/blob/master/find-things-fast.el#L246 B.t.w. I'd think the "--no-magic" here is something you'd want too. I like this new behavior (sans the comments above), but presumably there's people using emacs as their EDITOR who don't want to have this magic behavior, having an opt-out would be neat. I.e. if you have an existing customization intercepting these then this will screw with that, but maybe that's OK...