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"

Reply via email to