1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
# bash completion for vcsh.
# run git command
# based on bash_completion:_command_offset()
_vcsh_git_command () {
local word_offset=$1
for (( i=0; i < $word_offset; i++ )); do
for (( j=0; j <= ${#COMP_LINE}; j++ )); do
[[ "$COMP_LINE" == "${COMP_WORDS[i]}"* ]] && break
COMP_LINE=${COMP_LINE:1}
((COMP_POINT--))
done
COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"}
((COMP_POINT-=${#COMP_WORDS[i]}))
done
COMP_LINE="git $COMP_LINE"
((COMP_POINT+=4))
# shift COMP_WORDS elements and adjust COMP_CWORD
for (( i=1; i <= COMP_CWORD - $word_offset + 1; i++ )); do
COMP_WORDS[i]=${COMP_WORDS[i+$word_offset-1]}
done
for (( i; i <= COMP_CWORD; i++ )); do
unset 'COMP_WORDS[i]'
done
COMP_WORDS[0]=git
((COMP_CWORD -= $word_offset - 1))
local cspec=$( complete -p git 2>/dev/null )
if [[ -n $cspec ]]; then
if [[ ${cspec#* -F } != $cspec ]]; then
local func=${cspec#*-F }
func=${func%% *}
if [[ ${#COMP_WORDS[@]} -ge 2 ]]; then
$func git "${COMP_WORDS[${#COMP_WORDS[@]}-1]}" "${COMP_WORDS[${#COMP_WORDS[@]}-2]}"
else
$func git "${COMP_WORDS[${#COMP_WORDS[@]}-1]}"
fi
# restore initial compopts
local opt
while [[ $cspec == *" -o "* ]]; do
# FIXME: should we take "+o opt" into account?
cspec=${cspec#*-o }
opt=${cspec%% *}
compopt -o $opt
cspec=${cspec#$opt}
done
fi
fi
}
_vcsh () {
local cur prev words cword OPTS
_init_completion -n = || return
local repos cmds
repos=( $(command vcsh list) )
cmds="clone delete enter foreach help init list list-tracked list-untracked
pull push rename run status upgrade version which write-gitignore"
local subcword cmd subcmd
for (( subcword=1; subcword < ${#words[@]}-1; subcword++ )); do
[[ -n $cmd && ${words[subcword]} != -* ]] && subcmd=${words[subcword]} && break
[[ ${words[subcword]} != -* ]] && cmd=${words[subcword]}
done
if [[ -z $cmd ]]; then
case $prev in
-c)
COMPREPLY=( $(compgen -f -- $cur) )
return
;;
esac
case $cur in
-*)
OPTS='-c -d -h -v'
COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
return
;;
esac
COMPREPLY=( $(compgen -W "${repos[*]} ${cmds[*]}" -- $cur) )
return 0
fi
case $cmd in
help|init|list|pull|push|version|which)
return
;;
list-untracked)
[[ $cur == -* ]] && \
COMPREPLY=( $(compgen -W '-a -r' -- $cur) ) && return
;;&
run)
if [[ -n $subcmd && -n "${repos[$subcmd]}" ]]; then
_command_offset $(( $subcword+1 ))
return
fi
;;&
delete|enter|list-tracked|list-untracked|rename|run|status|upgrade|write-gitignore)
# return repos
if [[ -z $subcmd ]]; then
COMPREPLY=( $(compgen -W "${repos[*]}" -- $cur) )
return
fi
return
;;
clone)
[[ $cur == -* ]] && \
COMPREPLY=( $(compgen -W '-b' -- $cur) )
return
;;
foreach)
[[ $cur == -* ]] \
&& COMPREPLY=( $(compgen -W "-g" -- $cur) ) && return
_vcsh_git_command $subcword
return
;;
esac
# git command on repository
if [[ -n "${repos[$cmd]}" ]]; then
_vcsh_git_command $subcword
fi
return 0
}
complete -F _vcsh vcsh
# vim: ft=sh:
|