summaryrefslogtreecommitdiff
path: root/Completion/Unix
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2006-02-03 16:31:23 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2006-02-03 16:31:23 +0000
commited6c05aa7cccd69d4928907450f5d6d84d3ef287 (patch)
treeb346d24dfa1f5763b39a217dff91be78435050bc /Completion/Unix
parent08bfbba1c81b60de5585276ca69f7b397dcfa75c (diff)
downloadzsh-ed6c05aa7cccd69d4928907450f5d6d84d3ef287.tar.gz
zsh-ed6c05aa7cccd69d4928907450f5d6d84d3ef287.zip
22187: improved _hosts
Diffstat (limited to 'Completion/Unix')
-rw-r--r--Completion/Unix/Type/_hosts39
1 files changed, 26 insertions, 13 deletions
diff --git a/Completion/Unix/Type/_hosts b/Completion/Unix/Type/_hosts
index 6841f0028..e6833132f 100644
--- a/Completion/Unix/Type/_hosts
+++ b/Completion/Unix/Type/_hosts
@@ -1,21 +1,34 @@
#compdef ftp rwho rup xping traceroute host aaaa zone mx ns soa txt
-local expl hosts tmp
+# avoid calling variable "hosts", it's an obvious candidate for use in
+# zstyle -e '*' hosts 'reply=($hosts)'
+local expl _hosts tmp
-if ! zstyle -a ":completion:${curcontext}:hosts" hosts hosts; then
- (( $+_cache_hosts )) ||
- if (( ${+commands[getent]} )); then
- : ${(A)_cache_hosts:=${(s: :)${(ps:\t:)${(f)~~"$(_call_program hosts getent hosts 2>/dev/null)"}##[:blank:]#[^[:blank:]]#}}}
- else
- : ${(A)_cache_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}}
- if (( ${+commands[ypcat]} )) &&
- tmp=$(_call_program hosts ypcat hosts.byname 2>/dev/null); then
- _cache_hosts+=( ${=${(f)tmp}##[:blank:]#[^[:blank:]]#} ) # If you use YP
- fi
+if ! zstyle -a ":completion:${curcontext}:hosts" hosts _hosts; then
+ if (( $+_cache_hosts == 0 )); then
+ # uniquify
+ typeset -gUa _cache_hosts
+ 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:]]#}})
+ else
+ _cache_hosts=(${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}})
+ if (( ${+commands[ypcat]} )) &&
+ tmp=$(_call_program hosts ypcat hosts.byname 2>/dev/null); then
+ _cache_hosts+=( ${=${(f)tmp}##[:blank:]#[^[:blank:]]#} ) # If you use YP
fi
+ fi
- hosts=( "$_cache_hosts[@]" )
+ if [[ -r ~/.ssh/known_hosts ]]; then
+ _cache_hosts+=( $(sed -e '/^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]/d' -e 's/[ ,].*//p' ~/.ssh/known_hosts) )
+ fi
+ fi
+
+ _hosts=( "$_cache_hosts[@]" )
fi
_wanted hosts expl host \
- compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' -a "$@" - hosts
+ compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' -a "$@" - _hosts