blob: a4a08ad9197b05e6e8783fe7b5994fee2353b4de (
plain) (
blame)
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
|
#autoload
local -a config_hosts
local config
integer ind
# If users-hosts matches, we shouldn't complete anything else.
if [[ "$IPREFIX" == *@ ]]; then
_combination -s '[:@]' my-accounts users-hosts "users=${IPREFIX/@}" hosts "$@" && return
else
_combination -s '[:@]' my-accounts users-hosts \
${opt_args[-l]:+"users=${opt_args[-l]:q}"} hosts "$@" && return
fi
if (( ind = ${words[(I)-F]} )); then
config=${~words[ind+1]} 2>/dev/null
else
config="$HOME/.ssh/config"
fi
if [[ -r $config ]]; then
local key line host
local -a lines=("${(@f)$(<"$config")}") 2>/dev/null
local -a match_args
local idx=1
while (( idx <= $#lines )); do
IFS=$'=\t ' read -r key line <<<"${lines[idx]}"
if [[ "$key" == ((#i)match) ]]; then
match_args=(${(z)line})
while [[ $#match_args -ge 2 ]]; do
if [[ "${match_args[1]}" == (#i)(canonical|final|(|original)host) ]]; then
key="Host"
line="${match_args[2]//,/ }"
break
fi
shift 2 match_args
done
fi
case "$key" in
((#i)include)
lines[idx]=("${(@f)$(cd $HOME/.ssh; cat ${(z)~line})}") 2>/dev/null;;
((#i)host(|name))
for host in ${(z)line}; do
case $host in
(*[*?]*) ;;
(*) config_hosts+=("$host") ;;
esac
done ;&
(*) (( ++idx ));;
esac
done
if (( ${#config_hosts} )); then
_wanted hosts expl 'remote host name' \
compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts
fi
fi
|