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