Re: [PATCH v7 3/3] git-jump: invoke emacs/emacsclient
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- Nov 25, 2022, 08:55 UTC
- Message-ID
- <221125.8635a7o123.gmgdl@evledraar.gmail.com>
- In-Reply-To
- <d8233f9617563d7c7168afc6e1abfaba57e54038.1669347422.git.gitgitgadget@gmail.com>
On Fri, Nov 25 2022, Yoichi Nakayama via GitGitGadget wrote:
Show 37 quoted lines
> From: Yoichi Nakayama <yoichi.nakayama@gmail.com>
>
> It works with GIT_EDITOR="emacs", "emacsclient" or "emacsclient -t"
>
> Signed-off-by: Yoichi Nakayama <yoichi.nakayama@gmail.com>
> ---
> 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 0I.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...