I have set up the following alias in my .gitconfig
file:
[alias]
ss = stash show
Unfortunately bash completion does not work correctly on this alias. When I type git ss <TAB>
, I get:
❯ git ss <TAB>
apply clear drop pop show
branch create list push
Which is obviously the completion for git stash
instead of git stash show
.
With the original command I get the list of available stashes:
❯ git stash show <TAB>
stash@{0} stash@{1}
Is there a way to get the completion on the alias behave like on the original command?
I am on Ubuntu 20.04 and using the distro's default git completions.
CodePudding user response:
I posted this question on the Git mailing list and got a reply to work around this issue:
It is possible to make completion work for your particular
alias by using our completion script's extension mechanism that allows
users to specify completion functions to their own git commands. If
you type git foo <TAB>
and there is a _git_foo()
function in your
shell's environment, then the completion script will invoke that
function to perform completion; this works not only for commands but
for aliases as well. So for your alias you only need to "borrow" all
the "show"-subcommand-specific case arms from _git_stash()
and place
them in a _git_ss()
function, e.g. like this:
_git_ss () {
case "$cur" in
--*)
__gitcomp_builtin stash_show "$__git_diff_common_options"
;;
*)
__gitcomp_nl "$(__git stash list | sed -n -e 's/:.*//p')"
;;
esac
}
Add it to your ~/.bashrc
, or to a separate file that you source from
your .bashrc
; If you use bash-completion, then you don't even have to
touch you .bashrc
: save that function to a file git-ss
(dash, not
underscore!) in one of the directories scanned by bash-completion
($BASH_COMPLETION_USER_DIR
, ~/.local/share/bash-completion/completions
or its XDG_DATA_HOME
-equivalent) and it will be auto-loaded as needed.