about summary refs log tree commit diff
path: root/Completion/Unix/Type/_hosts
diff options
context:
space:
mode:
authorPaul Ackersviller <packersv@users.sourceforge.net>2007-05-03 02:49:44 +0000
committerPaul Ackersviller <packersv@users.sourceforge.net>2007-05-03 02:49:44 +0000
commit505239c6f89e200aea9058a1fa5a552d1b6e529d (patch)
tree4d66bd941a7e172b752273e13488c6fbcc093292 /Completion/Unix/Type/_hosts
parent26785dfe6b5e36e520934585f91aaa44704bba75 (diff)
downloadzsh-505239c6f89e200aea9058a1fa5a552d1b6e529d.tar.gz
zsh-505239c6f89e200aea9058a1fa5a552d1b6e529d.tar.xz
zsh-505239c6f89e200aea9058a1fa5a552d1b6e529d.zip
Merge trunk revisions up to 1.10, i.e. 21315, 21931, 22187, 22191, 22192, 22393.
Diffstat (limited to 'Completion/Unix/Type/_hosts')
-rw-r--r--Completion/Unix/Type/_hosts57
1 files changed, 57 insertions, 0 deletions
diff --git a/Completion/Unix/Type/_hosts b/Completion/Unix/Type/_hosts
new file mode 100644
index 000000000..c93399945
--- /dev/null
+++ b/Completion/Unix/Type/_hosts
@@ -0,0 +1,57 @@
+#compdef ftp rwho rup xping traceroute host aaaa zone mx ns soa txt
+
+# avoid calling variable "hosts", it's an obvious candidate for use in
+#  zstyle -e '*' hosts 'reply=($hosts)'
+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)"}##${~ipstrip}}})
+    else
+      _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}##${~ipstrip}} ) # If you use YP
+      fi
+    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[@]" )
+fi
+
+_wanted hosts expl host \
+    compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' -a "$@" - _hosts