about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--Completion/Unix/Type/_hosts37
-rw-r--r--Doc/Zsh/compsys.yo17
3 files changed, 51 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index d7496c494..27d098e68 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2006-04-05  Peter Stephenson  <pws@csr.com>
 
+	* 22393, R. Ramkumar, plus doc, 22402:
+	Completion/Unix/Type/_hosts, Doc/Zsh/compsys.yo: use-ip and
+	known-hosts-files styles.
+
 	* 22375: Doc/Zsh/expn.yo: somehow the doc got missed out.
 
 2006-04-04  Clint Adams  <clint@zsh.org>
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[@]" )
diff --git a/Doc/Zsh/compsys.yo b/Doc/Zsh/compsys.yo
index f798bd759..f0bbc56c3 100644
--- a/Doc/Zsh/compsys.yo
+++ b/Doc/Zsh/compsys.yo
@@ -1665,6 +1665,13 @@ previous line if this style is `true' for all types of match.  Note
 that unlike the tt(ALWAYS_LAST_PROMPT) option this is independent of the
 numeric prefix argument.
 )
+kindex(known-hosts-files)
+item(tt(known-hosts-files))(
+This style should contain a list of files to search for host names and
+(if the tt(use-ip) style is set) IP addresses in a format compatible with
+ssh tt(known_hosts) files.  If it is not set, the files
+tt(/etc/ssh/ssh_known_hosts) and tt(~/.ssh/known_hosts) are used.
+)
 kindex(list, completion style)
 item(tt(list))(
 This style is used by the tt(_history_complete_word) bindable command.
@@ -2498,6 +2505,16 @@ command tt(foo), tt(compctl) will never be invoked for tt(foo).
 However, the tt(compctl) version will be tried if tt(foo) only uses
 default completion.
 )
+kindex(use-ip, completion style)
+item(tt(use-ip))(
+By default, the function tt(_hosts) that completes host names strips
+IP addresses from entries read from host databases such as NIS and
+ssh files.  If this style is true, the corresponding IP addresses
+can be completed as well.  This style is not use in any context
+where the tt(hosts) style is set; note also it must be set before
+the cache of host names is generated (typically the first completion
+attempt).
+)
 kindex(use-perl, completion style)
 item(tt(use-perl))(
 Various parts of the function system use awk to extract words from