diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | Completion/Unix/Type/_hosts | 37 | ||||
-rw-r--r-- | Doc/Zsh/compsys.yo | 17 |
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 |