forked from RichiH/vcsh
-
Notifications
You must be signed in to change notification settings - Fork 0
/
_vcsh_bash
138 lines (118 loc) · 3.04 KB
/
_vcsh_bash
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: