Package: zsh
Version: 4.3.2-2
Severity: wishlist
Tags: patch

Hi!

The current _hosts completion does not use IP addresses, and
completes using host names alone. This patch optionally enables the
inclusion of IP addresses by a boolean style (the default behaviour
is unchanged). Further, currently only ~/.ssh/known_hosts file is
read. Added /etc/ssh/known_hosts to this list, if present. Further,
observing that any plain list of hostnames would anyway be
parseable, and that ~"`id -nu`"/.ssh/known_hosts and not
~/.ssh/known_hosts might be readable under sudo environments, made
the list of known host files customizable (defaulting to the two
files initially specified). Here is the patch:



--- _hosts      2006-03-30 05:00:08.000000000 +0530
+++ _hosts.new  2006-03-30 05:21:37.000000000 +0530
@@ -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=( "[EMAIL PROTECTED]" )
Regards,
Ramkumar.

-- System Information:
Debian Release: testing/unstable
  APT prefers testing
  APT policy: (101, 'testing')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/dash
Kernel: Linux 2.6.15-archck2
Locale: LANG=en_IN, LC_CTYPE=en_IN (charmap=UTF-8)

Versions of packages zsh depends on:
ii  debconf [debconf-2.0]         1.4.72     Debian configuration management sy
ii  libc6                         2.3.6-3    GNU C Library: Shared libraries an
ii  libncurses5                   5.5-1      Shared libraries for terminal hand

Versions of packages zsh recommends:
ii  libcap1                       1:1.10-14  support for getting/setting POSIX.
ii  libpcre3                      6.4-1.1    Perl 5 Compatible Regular Expressi

-- no debconf information

-- 
WARN_(accel)("msg null; should hang here to be win compatible\n");
                                   -- WINE source code

Reply via email to