#autoload

local expl known_hosts hostsfiles f tmp

if ! zstyle -a ":completion:${curcontext}:hosts" hosts known_hosts; then
  (( $+_cache_known_hosts )) || {
    # Find ssh_config
    hostsfiles=( )
    _cache_known_hosts=( )
    for f in /etc/ssh/ssh_config /etc/ssh2/ssh_config /etc/openssh/ssh_config $HOME/.ssh/config $HOME/.ssh2/config; do
      [[ -r "$f" ]] || continue
      hostsfiles+=( ${${${(M)${(f)"$(<"$f")"}:#(#i)(Global|User)KnownHostsFile*}##(#i)(Global|User)KnownHostsFile[[:blank:]]#}%%[[:blank:]]#[#]*})
      _cache_known_hosts+=( ${=${${(M)${(f)"$(<"$f")"}:#(#i)Host[[:blank:]]##([^*?]##)}##(#i)Host[[:blank:]]#}%%[[:blank:]]#[#]*} )
    done
    : ${(A)=hostsfiles:=/etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 $HOME/.ssh/known_hosts $HOME/.ssh/known_hosts2}
    for f in "${(@)hostsfiles}"; do
      [[ -r "$f" ]] || continue
      _cache_known_hosts+=( ${${${${(f)"$(<"$f")"}:#[0-9]*}%%\ *}%%,*} )
    done
  }

  known_hosts=( "${(@)_cache_known_hosts}" )
fi

_wanted known_hosts expl host \
    compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' -a "$@" - known_hosts
