diff options
-rw-r--r-- | Completion/User/_whois | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/Completion/User/_whois b/Completion/User/_whois new file mode 100644 index 000000000..827ebe627 --- /dev/null +++ b/Completion/User/_whois @@ -0,0 +1,211 @@ +#compdef whois + +_whois () { + setopt localoptions extendedglob + _whois_setup + $_whois_comp +} + +builtin functions _whois_setup >&- || +_whois_setup () { + (( $+_whois_defaultserver )) || + _whois_defaultserver='whois.internic.net' + + (( $+_whois_servers )) || { + typeset -gUa _whois_servers + _whois_servers=( + $_whois_defaultserver + domain-registry.nl + is.nic.pw + whois.apnic.net:p + whois.arin.net:a + whois.aunic.net + whois.berkeley.edu + whois.cdnnet.ca + whois.dns.pt + whois.funet.fi + whois.gb.com + whois.gb.net + whois.internic.net + whois.jpl.nasa.gov + whois.nic-se.se + whois.nic.ad.jp + whois.nic.af + whois.nic.as + whois.nic.br + whois.nic.bt + whois.nic.ch + whois.nic.cx + whois.nic.fr + whois.nic.gov:g + whois.nic.hm + whois.nic.it + whois.nic.li + whois.nic.lk + whois.nic.mil:d + whois.nic.mx + whois.nic.nu + whois.nic.or.kr + whois.nic.sh + whois.nic.tj + whois.nic.tm + whois.nic.uk + whois.ripe.net:r + whois.ripn.net:R + whois.sics.se + whois.stanford.edu + whois.uk.com + www.nic.at + $(functions -m '_whois:*' | + awk '/^undefined _whois:/ {print substr($2,8,length($2)-7)} + /^_whois:/ {print substr($1,8,length($1)-7)}') + ) + } + + (( $+_whois_arguments )) || { + local help="$(whois </dev/null 2>&1)" + local tmp opt opts + + if [[ $help = *"user[@<whois.server>]"* ]]; then + _whois_comp=_whois_fwhois + elif [[ $help = *(name\ ...|OBJECT...)* ]]; then + _whois_comp=_whois_multi + else + _whois_comp=_whois_single + fi + + _whois_arguments=() + + if [[ $help = *"-p PORT"* ]]; then + _whois_arguments=("$_whois_arguments[@]" + '-p[port]:port:_whois_ports' + ) + fi + + tmp="${(j::)${(@)${(@M)_whois_servers:#*:?}##*:}}" + if [[ $help = (#b)*\[-([$tmp]##)\]* ]]; then + tmp=(${(s::)match[1]}) + else + tmp=() + fi + + if [[ $help = *"-h host"* ]]; then + tmp=($tmp h) + fi + + for opt in $tmp; do + opts=(-${^tmp:#$opt}) + if (( $#opts )); then opts="($opts)"; else opts=; fi + _whois_arguments=("$_whois_arguments[@]" + "${opts}-${opt}[${${${(@M)_whois_servers:#*:$opt}%:?}:-specify host}]${(M)${(M)opt:#h}/h/:host:_whois_hosts}" + ) + done + } +} + +_whois_single () { + local state line expl + typeset -A opt_args + local tmp host + + _arguments \ + "$_whois_arguments[@]" \ + ':identifier:->identifier' + + case "$state" in + identifier) + if [[ -z "$QIPREFIX" ]]; then + compadd -QS '' \' + return + fi + compset -q + host="${opt_args[-h]:-$_whois_defaultserver}" + for tmp in $_whois_servers; do + if [[ $tmp = *:? && $+opt_args[-${tmp##*:}] -ne 0 ]]; then + host="${tmp%:?}" + break + fi + done + if builtin functions "_whois:$host" >&-; then + "_whois:$host" "$expl[@]" + else + _message "identifier" + fi + ;; + esac +} + +_whois_multi () { + local state line expl + typeset -A opt_args + local tmp host + + _arguments \ + "$_whois_arguments[@]" \ + '*::identifier:->identifier' + + case "$state" in + identifier) + host="${opt_args[-h]:-$_whois_defaultserver}" + for tmp in $_whois_servers; do + if [[ $tmp = *:? && $+opt_args[-${tmp##*:}] -ne 0 ]]; then + host="${tmp%:?}" + break + fi + done + if builtin functions "_whois:$host" >&-; then + "_whois:$host" "$expl[@]" + else + _message "identifier" + fi + ;; + esac +} + +_whois_fwhois () { + if compset -P '*@'; then + _whois_hosts "$@" + else + if [[ -z "$QIPREFIX" ]]; then + compadd -QS '' \' + return + fi + compset -q + host="$_whois_defaultserver" + if builtin functions "_whois:$host" >&-; then + "_whois:$host" "$@" + else + _message "identifier" + fi + fi +} + +_whois_hosts () { + compadd "$@" \ + -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' \ + - ${_whois_servers%:?} || _hosts "$@" +} + +_whois_ports () { + compadd "$@" - whois || _ports "$@" +} + +builtin functions _whois:whois.internic.net >&- || +_whois:whois.internic.net () { + if (( CURRENT == 1 )); then + compadd HELP DOMAIN HOST + else + _message 'string' + fi +} + +builtin functions _whois:whois.nic.ad.jp >&- || +_whois:whois.nic.ad.jp () { + if (( CURRENT == 1 )); then + compadd HELP DOM NET HOST PERSON CONN COM + else + _message 'string' + fi +} + +_whois "$@" |