bash: Add space after unique command name is completed.
authorShawn O. Pearce <spearce@spearce.org>
Sun, 4 Feb 2007 07:38:27 +0000 (02:38 -0500)
committerJunio C Hamano <junkio@cox.net>
Sun, 4 Feb 2007 08:18:41 +0000 (00:18 -0800)
Because we use the nospace option for our completion function for
the main 'git' wrapper bash won't automatically add a space after a
unique completion has been made by the user.  This has been pointed
out in the past by Linus Torvalds as an undesired behavior.  I agree.

We have to use the nospace option to ensure path completion for
a command such as `git show` works properly, but that breaks the
common case of getting the space for a unique completion.  So now we
set IFS=$'\n' (linefeed) and add a trailing space to every possible
completion option.  This causes bash to insert the space when the
completion is unique.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
contrib/completion/git-completion.bash

index 93f2af5e1fd8f83b58bdf55a8d3502fa807aff66..1cf576e1e57820ed13bfa9fe583b77779b315502 100755 (executable)
@@ -61,6 +61,20 @@ __git_ps1 ()
        fi
 }
 
+__gitcomp ()
+{
+       local all c s=$'\n' IFS=' '$'\t'$'\n'
+       for c in $1; do
+               case "$c" in
+               --*=*) all="$all$c$s" ;;
+               *)     all="$all$c $s" ;;
+               esac
+       done
+       IFS=$s
+       COMPREPLY=($(compgen -W "$all" -- "${COMP_WORDS[COMP_CWORD]}"))
+       return
+}
+
 __git_heads ()
 {
        local cmd i is_hash=y dir="$(__gitdir "$1")"
@@ -787,12 +801,12 @@ _git ()
        done
 
        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
-               COMPREPLY=($(compgen -W "
-                       --git-dir= --version --exec-path
-                       $(__git_commands)
-                       $(__git_aliases)
-                       " -- "${COMP_WORDS[COMP_CWORD]}"))
-               return;
+               case "${COMP_WORDS[COMP_CWORD]}" in
+               --*=*) COMPREPLY=() ;;
+               --*)   __gitcomp "--git-dir= --bare --version --exec-path" ;;
+               *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
+               esac
+               return
        fi
 
        local expansion=$(__git_aliased_command "$command")