From ed6c05aa7cccd69d4928907450f5d6d84d3ef287 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Fri, 3 Feb 2006 16:31:23 +0000 Subject: 22187: improved _hosts --- ChangeLog | 6 ++++++ Completion/Unix/Type/_hosts | 39 ++++++++++++++++++++++++++------------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index b7299c077..4c16ded93 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-02-03 Peter Stephenson + + * 22187: Completion/Unix/Type/_hosts: don't trounce any global + $hosts; don't use hacky array assignment; do examine + ~/.ssh/known_hosts for default set of hosts to complete. + 2006-01-29 Wayne Davison * unposted: Completion/Unix/Command/_rsync: Added new options 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)~~"$(/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)~~"$(/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 -- cgit 1.4.1