@@ -5,11 +5,13 @@ _comp_cmd_ssh_keygen()
5
5
local cur prev words cword comp_args
6
6
_comp_initialize -n := -- " $@ " || return
7
7
8
+ local noargopts=' !(-*|*[ aCIJjMNPSVWzbEFRDwfGKsTmnOrtY]*)'
9
+ # shellcheck disable=SC2254
8
10
case $prev in
9
- -* [aCIJjMNPSVWz])
11
+ -${noargopts} [aCIJjMNPSVWz])
10
12
return
11
13
;;
12
- -* b)
14
+ -${noargopts} b)
13
15
local -a sizes=()
14
16
case " ${words[*]} " in
15
17
* " -t dsa" ? ( * ))
@@ -26,28 +28,28 @@ _comp_cmd_ssh_keygen()
26
28
_comp_compgen -- -W ' "${sizes[@]}"'
27
29
return
28
30
;;
29
- -* E)
31
+ -${noargopts} E)
30
32
_comp_compgen -- -W ' md5 sha256'
31
33
return
32
34
;;
33
- -* [FR])
35
+ -${noargopts} [FR])
34
36
# TODO: trim this down to actual entries in known hosts files
35
37
_comp_compgen_known_hosts -- " $cur "
36
38
return
37
39
;;
38
- -* [Dw])
40
+ -${noargopts} [Dw])
39
41
_comp_compgen_filedir so
40
42
return
41
43
;;
42
- -* [fGKsT])
44
+ -${noargopts} [fGKsT])
43
45
_comp_compgen_filedir
44
46
return
45
47
;;
46
- -* m)
48
+ -${noargopts} m)
47
49
_comp_compgen -- -W ' PEM PKCS8 RFC4716'
48
50
return
49
51
;;
50
- -* n)
52
+ -${noargopts} n)
51
53
[[ ${words[*]} != * \ -* Y\ * ]] || return
52
54
if [[ ${words[*]} == * \ -* h\ * ]]; then
53
55
_comp_compgen_known_hosts -- " ${cur##* ,} "
@@ -58,20 +60,20 @@ _comp_cmd_ssh_keygen()
58
60
fi
59
61
return
60
62
;;
61
- -* O)
63
+ -${noargopts} O)
62
64
if [[ $cur != * = * ]]; then
63
65
local -a opts=()
64
66
case ${words[*]} in
65
- * \ -* M\ * )
67
+ * \ -${noargopts} M\ * )
66
68
opts=(
67
69
lines= start-line= checkpoint= memory= start=
68
70
generator=
69
71
)
70
72
;;
71
- * \ -* r\ * )
73
+ * \ -${noargopts} r\ * )
72
74
opts=(hashalg=)
73
75
;;
74
- * \ -* s\ * )
76
+ * \ -${noargopts} s\ * )
75
77
opts=(
76
78
clear critical: extension: force-command=
77
79
no-agent-forwarding no-port-forwarding no-pty
@@ -81,13 +83,13 @@ _comp_cmd_ssh_keygen()
81
83
source-address= verify-required
82
84
)
83
85
;;
84
- * \ -* t\ + ([a-z0-9])-sk\ * )
86
+ * \ -${noargopts} t\ + ([a-z0-9])-sk\ * )
85
87
opts=(
86
88
application= challenge= device= no-touch-required
87
89
resident user= verify-required write-attestation=
88
90
)
89
91
;;
90
- * \ -* Y\ * )
92
+ * \ -${noargopts} Y\ * )
91
93
opts=(hashalg= print-pubkey verify-time)
92
94
;;
93
95
esac
@@ -129,11 +131,11 @@ _comp_cmd_ssh_keygen()
129
131
fi
130
132
return
131
133
;;
132
- -* r)
133
- [[ ${words[*]} != * \ -* Y\ * ]] || _comp_compgen_filedir
134
+ -${noargopts} r)
135
+ [[ ${words[*]} != * \ -${noargopts} Y\ * ]] || _comp_compgen_filedir
134
136
return
135
137
;;
136
- -* t)
138
+ -${noargopts} t)
137
139
# Prefer `ssh` from same dir for resolving options, etc
138
140
local pathcmd protocols
139
141
pathcmd=$( type -P -- " $1 " ) && local PATH=${pathcmd%/* } :$PATH
@@ -145,7 +147,7 @@ _comp_cmd_ssh_keygen()
145
147
_comp_compgen -- -W " $types "
146
148
return
147
149
;;
148
- -* Y)
150
+ -${noargopts} Y)
149
151
_comp_compgen -- -W ' find-principals check-novalidate sign verify'
150
152
return
151
153
;;
@@ -157,7 +159,7 @@ _comp_cmd_ssh_keygen()
157
159
_comp_compgen_help -- " -?" # OpenSSH < 7
158
160
fi
159
161
160
- if [[ ${words[*]} == * \ -* s\ * ]]; then
162
+ if [[ ${words[*]} == * \ -${noargopts} s\ * ]]; then
161
163
_comp_compgen -a filedir pub
162
164
fi
163
165
} &&
0 commit comments