Commit 6d52838a authored by Roland Hopferwieser's avatar Roland Hopferwieser
Browse files

Add bash-completion

parent 36a7cedf
# 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:
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment