# 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: