@@ -6,72 +6,189 @@ send_completions() {
66 echo $' # completely (https://github.com/bashly-framework/completely)'
77 echo $' # Modifying it manually is not recommended'
88 echo $' '
9- echo $' _cli_completions_filter() {'
10- echo $' local words="$1"'
9+ echo $' _cli_completions_flag_expects_value() {'
10+ echo $' case "$1" in'
11+ echo $' --user|-u) return 0 ;;'
12+ echo $' --password|-p) return 0 ;;'
13+ echo $' esac'
14+ echo $' '
15+ echo $' return 1'
16+ echo $' }'
17+ echo $' '
18+ echo $' _cli_completions() {'
1119 echo $' local cur=${COMP_WORDS[COMP_CWORD]}'
12- echo $' local result=()'
20+ echo $' local prev='
21+ echo $' if ((COMP_CWORD > 0)); then'
22+ echo $' prev=${COMP_WORDS[$((COMP_CWORD - 1))]}'
23+ echo $' fi'
1324 echo $' '
14- echo $' # words the user already typed (excluding the command itself)'
15- echo $' local used=()'
25+ echo $' local completed=()'
1626 echo $' if ((COMP_CWORD > 1)); then'
17- echo $' used =("${COMP_WORDS[@]:1:$((COMP_CWORD - 1))}")'
27+ echo $' completed =("${COMP_WORDS[@]:1:$((COMP_CWORD - 1))}")'
1828 echo $' fi'
1929 echo $' '
20- echo $' if [[ "${cur:0:1}" == "-" ]]; then'
21- echo $' # Completing an option: offer everything (including options)'
22- echo $' echo "$words"'
23- echo $' '
24- echo $' else'
25- echo $' # Completing a non-option: offer only non-options,'
26- echo $' # and don\' t re-offer ones already used earlier in the line.'
27- echo $' for word in $words; do'
28- echo $' [[ "${word:0:1}" == "-" ]] && continue'
29- echo $' '
30- echo $' local seen=0'
31- echo $' for u in "${used[@]}"; do'
32- echo $' if [[ "$u" == "$word" ]]; then'
33- echo $' seen=1'
34- echo $' break'
35- echo $' fi'
36- echo $' done'
37- echo $' ((!seen)) && result+=("$word")'
38- echo $' done'
30+ echo $' local non_options=()'
31+ echo $' local completed_options=()'
32+ echo $' local skip_next=0'
33+ echo $' for word in "${completed[@]}"; do'
34+ echo $' if ((skip_next)); then'
35+ echo $' skip_next=0'
36+ echo $' continue'
37+ echo $' fi'
38+ echo $' '
39+ echo $' if [[ "${word:0:1}" == "-" ]]; then'
40+ echo $' completed_options+=("$word")'
41+ echo $' if _cli_completions_flag_expects_value "$word"; then'
42+ echo $' skip_next=1'
43+ echo $' fi'
44+ echo $' continue'
45+ echo $' fi'
46+ echo $' '
47+ echo $' non_options+=("$word")'
48+ echo $' done'
49+ echo $' '
50+ echo $' local route_id='
51+ echo $' local route_word_count=-1'
52+ echo $' local route_has_positionals=0'
53+ echo $' local positional_index=0'
54+ echo $' if (( ${#non_options[@]} >= 0 )) &&'
55+ echo $' (( 0 > route_word_count ))'
56+ echo $' then'
57+ echo $' route_id=0'
58+ echo $' route_word_count=0'
59+ echo $' route_has_positionals=0'
60+ echo $' positional_index=$((${#non_options[@]} - 0))'
61+ echo $' fi'
3962 echo $' '
40- echo $' echo "${result[*]}"'
63+ echo $' if (( ${#non_options[@]} >= 1 )) &&'
64+ echo $' (( 1 > route_word_count )) &&'
65+ echo $' [[ "${non_options[0]}" == "download" || "${non_options[0]}" == "d" ]]'
66+ echo $' then'
67+ echo $' route_id=1'
68+ echo $' route_word_count=1'
69+ echo $' route_has_positionals=1'
70+ echo $' positional_index=$((${#non_options[@]} - 1))'
4171 echo $' fi'
42- echo $' }'
4372 echo $' '
44- echo $' _cli_completions() {'
45- echo $' local cur=${COMP_WORDS[COMP_CWORD]}'
46- echo $' local compwords=()'
47- echo $' if ((COMP_CWORD > 0)); then'
48- echo $' compwords=("${COMP_WORDS[@]:1:$((COMP_CWORD - 1))}")'
73+ echo $' if (( ${#non_options[@]} >= 1 )) &&'
74+ echo $' (( 1 > route_word_count )) &&'
75+ echo $' [[ "${non_options[0]}" == "upload" || "${non_options[0]}" == "u" ]]'
76+ echo $' then'
77+ echo $' route_id=2'
78+ echo $' route_word_count=1'
79+ echo $' route_has_positionals=1'
80+ echo $' positional_index=$((${#non_options[@]} - 1))'
4981 echo $' fi'
50- echo $' local compline="${compwords[*]}"'
5182 echo $' '
5283 echo $' COMPREPLY=()'
5384 echo $' '
54- echo $' case "$compline" in '
55- echo $' \' download\' * )'
56- echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_cli_completions_filter "--force --help -f -h")" -- "$cur") '
57- echo $' ;; '
85+ echo $' if [[ -z "$route_id" ]] || { (( route_word_count == 0 )) && (( !route_has_positionals )) && [[ "${cur:0:1}" != "-" ]]; }; then '
86+ echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W " download d upload u" -- "$cur" )'
87+ echo $' return '
88+ echo $' fi '
5889 echo $' '
59- echo $' \' upload\' *)'
60- echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_cli_completions_filter "--help --password --user -h -p -u")" -- "$cur")'
90+ echo $' case "$route_id:$prev" in'
91+ echo $' 2:--user|2:-u)'
92+ echo $' return'
6193 echo $' ;;'
62- echo $' '
63- echo $' \' d\' *)'
64- echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_cli_completions_filter "--force --help -f -h")" -- "$cur")'
94+ echo $' 2:--password|2:-p)'
95+ echo $' return'
6596 echo $' ;;'
97+ echo $' esac'
6698 echo $' '
67- echo $' \' u\' *)'
68- echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_cli_completions_filter "--help --password --user -h -p -u")" -- "$cur")'
69- echo $' ;;'
99+ echo $' if [[ "${cur:0:1}" == "-" ]]; then'
100+ echo $' case "$route_id" in'
101+ echo $' 0)'
102+ echo $' local words=()'
103+ echo $' local option_seen=0'
104+ echo $' for completed_option in "${completed_options[@]}"; do'
105+ echo $' case "$completed_option" in'
106+ echo $' --help|-h) option_seen=1 ;;'
107+ echo $' esac'
108+ echo $' done'
109+ echo $' if ((!option_seen)); then'
110+ echo $' words+=("--help" "-h")'
111+ echo $' fi'
112+ echo $' local option_seen=0'
113+ echo $' for completed_option in "${completed_options[@]}"; do'
114+ echo $' case "$completed_option" in'
115+ echo $' --version|-v) option_seen=1 ;;'
116+ echo $' esac'
117+ echo $' done'
118+ echo $' if ((!option_seen)); then'
119+ echo $' words+=("--version" "-v")'
120+ echo $' fi'
121+ echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")'
122+ echo $' return'
123+ echo $' ;;'
124+ echo $' 1)'
125+ echo $' local words=()'
126+ echo $' local option_seen=0'
127+ echo $' for completed_option in "${completed_options[@]}"; do'
128+ echo $' case "$completed_option" in'
129+ echo $' --help|-h) option_seen=1 ;;'
130+ echo $' esac'
131+ echo $' done'
132+ echo $' if ((!option_seen)); then'
133+ echo $' words+=("--help" "-h")'
134+ echo $' fi'
135+ echo $' local option_seen=0'
136+ echo $' for completed_option in "${completed_options[@]}"; do'
137+ echo $' case "$completed_option" in'
138+ echo $' --force|-f) option_seen=1 ;;'
139+ echo $' esac'
140+ echo $' done'
141+ echo $' if ((!option_seen)); then'
142+ echo $' words+=("--force" "-f")'
143+ echo $' fi'
144+ echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")'
145+ echo $' return'
146+ echo $' ;;'
147+ echo $' 2)'
148+ echo $' local words=()'
149+ echo $' local option_seen=0'
150+ echo $' for completed_option in "${completed_options[@]}"; do'
151+ echo $' case "$completed_option" in'
152+ echo $' --help|-h) option_seen=1 ;;'
153+ echo $' esac'
154+ echo $' done'
155+ echo $' if ((!option_seen)); then'
156+ echo $' words+=("--help" "-h")'
157+ echo $' fi'
158+ echo $' local option_seen=0'
159+ echo $' for completed_option in "${completed_options[@]}"; do'
160+ echo $' case "$completed_option" in'
161+ echo $' --user|-u) option_seen=1 ;;'
162+ echo $' esac'
163+ echo $' done'
164+ echo $' if ((!option_seen)); then'
165+ echo $' words+=("--user" "-u")'
166+ echo $' fi'
167+ echo $' local option_seen=0'
168+ echo $' for completed_option in "${completed_options[@]}"; do'
169+ echo $' case "$completed_option" in'
170+ echo $' --password|-p) option_seen=1 ;;'
171+ echo $' esac'
172+ echo $' done'
173+ echo $' if ((!option_seen)); then'
174+ echo $' words+=("--password" "-p")'
175+ echo $' fi'
176+ echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")'
177+ echo $' return'
178+ echo $' ;;'
179+ echo $' esac'
180+ echo $' fi'
70181 echo $' '
71- echo $' *)'
72- echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_cli_completions_filter "--help --version -h -v d download u upload")" -- "$cur")'
182+ echo $' case "$route_id:$positional_index" in'
183+ echo $' 1:0)'
184+ echo $' return'
185+ echo $' ;;'
186+ echo $' 1:1)'
187+ echo $' return'
188+ echo $' ;;'
189+ echo $' 2:0)'
190+ echo $' return'
73191 echo $' ;;'
74- echo $' '
75192 echo $' esac'
76193 echo $' } &&'
77194 echo $' complete -F _cli_completions cli'
0 commit comments