Always return something
[vng.git] / integration / bashCompletion
blob2084a12e9af73a63576777e9e75da7ffe6c83327
1 #-*- mode: shell-script;-*-
3 # vng command line completion.
4 # Copyright 2002 "David Roundy" <droundy@abridgegame.org>
6 have vng &&
7 _vng()
9     local cur
10     cur=${COMP_WORDS[COMP_CWORD]}
12     COMPREPLY=()
14     if (($COMP_CWORD == 1)); then
15         COMPREPLY=( $( vng --commands | grep "^$cur" ) )
16         return 0
17     fi
19     local IFS=$'\n' # So that the following "command-output to array" operation splits only at newlines, not at each space, tab or newline.
20     COMPREPLY=( $( vng ${COMP_WORDS[1]} --list-option | grep "^${cur//./\\.}") )
22         # Then, we adapt the resulting strings to be reusable by bash. If we don't
23         # do this, in the case where we have two repositories named
24         # ~/space in there-0.1 and ~/space in there-0.2, the first completion will
25         # give us:
26         # bash> vng push ~/space in there-0.
27         # ~/space in there-0.1 ~/space in there-0.2
28         # and we have introduced two spaces in the command line (if we try to
29         # recomplete that, it won't find anything, as it doesn't know anything
30         # starting with "there-0.").
31         # printf %q will gracefully add the necessary backslashes.
32         #
33         # Bash also interprets colon as a separator. If we didn't handle it
34         # specially, completing http://example.org/repo from http://e would 
35         # give us:
36         # bash> vng pull http:http://example.org/repo
37         # An option would be to require the user to escape : as \: and we
38         # would do the same here. Instead, we return only the part after
39         # the last colon that is already there, and thus fool bash. The
40         # downside is that bash only shows this part to the user.
41     local i=${#COMPREPLY[*]}
42     local colonprefixes=${cur%"${cur##*:}"}
43     while [ $((--i)) -ge 0 ]; do
44       COMPREPLY[$i]=`printf %q "${COMPREPLY[$i]}"`
46       COMPREPLY[$i]=${COMPREPLY[$i]#"$colonprefixes"} 
47     done
48     return 0
51 [ "$have" ] && complete -F _vng -o default vng