mbox series

[0/1] contrib/git-jump: support alias expansion

Message ID cover.1567619579.git.me@ttaylorr.com (mailing list archive)
Headers show
Series contrib/git-jump: support alias expansion | expand

Message

Taylor Blau Sept. 4, 2019, 5:55 p.m. UTC
Hi,

I have been meaning to send this patch for a while, which teaches the
'git-jump' script how to respect user aliases for commands like 'diff',
'merge', and 'grep'.

I often find myself parsing the output of 'git diff' (which I spell 'g
di') in less, and then wanting to jump to some specific diff in a file,
i.e., by running 'git jump diff -- <filename>'.

But, I am so used to typing 'di' instead of 'diff', that I often write
the later invocation as 'g jump di -- <filename>', and 'git-jump'
complains that it doesn't know what 'di' means.

Let's rectify that by teaching it how to expand alises, which is
implemented in the patch below.

Thanks,
Taylor

Taylor Blau (1):
  contrib/git-jump/git-jump: support alias expansion

 contrib/git-jump/README   | 4 ++++
 contrib/git-jump/git-jump | 4 +++-
 2 files changed, 7 insertions(+), 1 deletion(-)

--
2.22.0

Comments

Jeff King Sept. 5, 2019, 6:04 a.m. UTC | #1
On Wed, Sep 04, 2019 at 01:55:00PM -0400, Taylor Blau wrote:

> I often find myself parsing the output of 'git diff' (which I spell 'g
> di') in less, and then wanting to jump to some specific diff in a file,
> i.e., by running 'git jump diff -- <filename>'.
> 
> But, I am so used to typing 'di' instead of 'diff', that I often write
> the later invocation as 'g jump di -- <filename>', and 'git-jump'
> complains that it doesn't know what 'di' means.

Hmm. I'm not exactly _opposed_ to this patch, but it does feel like it's
weirdly conflating git commands with jump modes. Which just happen to
use some of the same verbs, but not not always (e.g., "mode_ws").

And as you note, aliases may carry along options which do not make any
sense for jump modes (or they might; we pass command-line options to
diff and grep, so it's possible the alias could do something useful).

Your case would be equally helped if the tool allowed any non-ambiguous
prefix to be used. But it wouldn't if somebody had "alias.foo = diff" or
something. So I dunno.

I solved this for myself long ago with a mix of git and shell aliases:

  $ git help vgrep
  'vgrep' is aliased to 'jump grep'
  
  $ type d
  d is aliased to `git jump diff'
  
  $ type m
  m is aliased to `git jump merge'

For fun, here's a patch that does the prefix thing (though the $0
hackery may be too much; we list the modes by hand in the usage, after
all).

diff --git a/contrib/git-jump/git-jump b/contrib/git-jump/git-jump
index 931b0fe3a9..c2a092806e 100755
--- a/contrib/git-jump/git-jump
+++ b/contrib/git-jump/git-jump
@@ -64,15 +64,35 @@ mode_ws() {
 	git diff --check "$@"
 }
 
+list_modes() {
+	perl -lne '/^mode_([a-z]+)[ (]/ and print $1' "$0"
+}
+
 if test $# -lt 1; then
 	usage >&2
 	exit 1
 fi
 mode=$1; shift
 
+if ! type "mode_$mode" >/dev/null 2>&1; then
+	found=
+	for i in $(list_modes | grep "^$mode"); do
+		if test -n "$found"; then
+			echo >&2 "ambiguous mode: $mode (matches $found and $i)"
+			exit 1
+		fi
+		found=$i
+	done
+	if test -n "$found"; then
+		mode=$found
+	else
+		usage >&2
+		exit 1
+	fi
+fi
+
 trap 'rm -f "$tmp"' 0 1 2 3 15
 tmp=`mktemp -t git-jump.XXXXXX` || exit 1
-type "mode_$mode" >/dev/null 2>&1 || { usage >&2; exit 1; }
 "mode_$mode" "$@" >"$tmp"
 test -s "$tmp" || exit 0
 open_editor "$tmp"