diff options
Diffstat (limited to 'Completion/Unix')
-rw-r--r-- | Completion/Unix/Type/_hosts | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/Completion/Unix/Type/_hosts b/Completion/Unix/Type/_hosts index 21a26e2e0..c93399945 100644 --- a/Completion/Unix/Type/_hosts +++ b/Completion/Unix/Type/_hosts @@ -2,29 +2,52 @@ # avoid calling variable "hosts", it's an obvious candidate for use in # zstyle -e '*' hosts 'reply=($hosts)' -local expl _hosts tmp +local expl _hosts tmp useip if ! zstyle -a ":completion:${curcontext}:hosts" hosts _hosts; then if (( $+_cache_hosts == 0 )); then # uniquify typeset -gUa _cache_hosts + local ipstrip='[:blank:]#[^[:blank:]]#' + + # This boolean style determines whether hosts completes IP addresses. The + # default is no (not using IP addresses). + zstyle -t ":completion:${curcontext}:hosts" use-ip && useip=yes + [[ -n $useip ]] && ipstrip= if (( ${+commands[getent]} )); then # pws: we were using the horrible ": ${(A)...:=}" syntax to assign # to _cache_hosts, overriding the typeset as well as being unreadable # and having obscure splitting behaviour. Why? We've just # tested _cache_hosts doesn't exist. - _cache_hosts=(${(s: :)${(ps:\t:)${(f)~~"$(_call_program hosts getent hosts 2>/dev/null)"}##[:blank:]#[^[:blank:]]#}}) + _cache_hosts=(${(s: :)${(ps:\t:)${(f)~~"$(_call_program hosts getent hosts 2>/dev/null)"}##${~ipstrip}}}) else - _cache_hosts=(${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}) + _cache_hosts=(${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##${~ipstrip}}}) if (( ${+commands[ypcat]} )) && tmp=$(_call_program hosts ypcat hosts.byname 2>/dev/null); then - _cache_hosts+=( ${=${(f)tmp}##[:blank:]#[^[:blank:]]#} ) # If you use YP + _cache_hosts+=( ${=${(f)tmp}##${~ipstrip}} ) # If you use YP fi fi - if [[ -r ~/.ssh/known_hosts ]]; then - _cache_hosts+=(${${${(u)${(f)"$(<~/.ssh/known_hosts)"}%%[ ,|#]*}:#(#s)[0-9]##.[0-9]##.[0-9]##.[0-9]##(#e)}:#(#s)[0-9a-f:]##(#e)}) - fi + local khostfile + typeset -Ua khostfiles + + # This style specifies a list of files to look up for host names and IP + # addresses, if asked to. The files can contain comma separated host names + # and IP's, and any text on a line after the first whitespace,| or # is + # discarded. ssh's known_hosts files are thus supported. This style defaults + # to the list /etc/ssh/ssh_known_hosts, ~/.ssh/known_hosts + zstyle -a ":completion:${curcontext}:hosts" known-hosts-files khostfiles || + khostfiles=(/etc/ssh/ssh_known_hosts ~/.ssh/known_hosts) + + for khostfile in $khostfiles; do + if [[ -r $khostfile ]]; then + khosts=(${(s:,:)${(j:,:)${(u)${(f)"$(<$khostfile)"}%%[ |#]*}}}) + if [[ -z $useip ]]; then + khosts=(${${khosts:#(#s)[0-9]##.[0-9]##.[0-9]##.[0-9]##(#e)}:#(#s)[0-9a-f:]##(#e)}) + fi + _cache_hosts+=($khosts) + fi + done fi _hosts=( "$_cache_hosts[@]" ) |