From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3952 invoked from network); 4 Jun 2007 15:24:30 -0000 X-Spam-Checker-Version: SpamAssassin 3.2.0 (2007-05-01) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=no version=3.2.0 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 4 Jun 2007 15:24:30 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 60072 invoked from network); 4 Jun 2007 15:24:22 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 4 Jun 2007 15:24:22 -0000 Received: (qmail 1202 invoked by alias); 4 Jun 2007 15:24:19 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 23519 Received: (qmail 1189 invoked from network); 4 Jun 2007 15:24:18 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 4 Jun 2007 15:24:18 -0000 Received: (qmail 59754 invoked from network); 4 Jun 2007 15:24:18 -0000 Received: from cluster-d.mailcontrol.com (217.69.20.190) by a.mx.sunsite.dk with SMTP; 4 Jun 2007 15:24:14 -0000 Received: from cameurexb01.EUROPE.ROOT.PRI ([62.189.241.200]) by rly21d.srv.mailcontrol.com (MailControl) with ESMTP id l54FJv16027999 for ; Mon, 4 Jun 2007 16:23:57 +0100 Received: from news01.csr.com ([10.103.143.38]) by cameurexb01.EUROPE.ROOT.PRI with Microsoft SMTPSVC(6.0.3790.1830); Mon, 4 Jun 2007 16:18:04 +0100 Received: from news01.csr.com (localhost.localdomain [127.0.0.1]) by news01.csr.com (8.13.8/8.13.4) with ESMTP id l54FI4Ud007226 for ; Mon, 4 Jun 2007 16:18:04 +0100 Received: from csr.com (pws@localhost) by news01.csr.com (8.13.8/8.13.8/Submit) with ESMTP id l54FI4lV007223 for ; Mon, 4 Jun 2007 16:18:04 +0100 Message-Id: <200706041518.l54FI4lV007223@news01.csr.com> X-Authentication-Warning: news01.csr.com: pws owned process doing -bs To: zsh-workers@sunsite.dk (Zsh hackers list) Subject: PATCH: _units Date: Mon, 04 Jun 2007 16:18:04 +0100 From: Peter Stephenson X-OriginalArrivalTime: 04 Jun 2007 15:18:04.0859 (UTC) FILETIME=[8C6FF0B0:01C7A6BB] Content-Type: text/plain MIME-Version: 1.0 X-Scanned-By: MailControl A-07-07-05 (www.mailcontrol.com) on 10.68.0.131 This implements completion for GNU units. As noted, it's not that useful for some other implementations which don't take command line arguments, though for any that do and have a text data file it should be extensible. The location of the data file can no doubt be in other places than the ones listed. Index: Completion/Unix/Command/_units =================================================================== RCS file: Completion/Unix/Command/_units diff -N Completion/Unix/Command/_units --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ Completion/Unix/Command/_units 4 Jun 2007 15:15:10 -0000 @@ -0,0 +1,75 @@ +#compdef units + +local curcontext="$curcontext" state line +typeset -A opt_args + +# Command line completion for Solaris units isn't very useful; this +# may be standard old-fashioned behaviour. However, it does let you +# find out the units that are available before running units +# interactively. + +# GNU options, but these aren't very intrusive for other versions. +_arguments -C -s -S \ + '(-c --check --check-verbose)'{-c,--check}'[check units are reducible]' \ + '(-c --check)--check-verbose[verbosely check units are reducible]' \ + '(-o --output-format)'{-o,--output-format}'[specify output format]:printf formt: ' \ + '(-f --file)'{-f,--file}'[specify file with units]:units file:_files' \ + '(-m --minus)'{-m,--minus}'[- is subtraction]' \ + '(-p --product)'{-p,--product}'[binary - is product]' \ + '(-q --quiet --silent)'{-q,--quiet,--silent}'[suppress prompts and statistics]' \ + '(-s --strict)'{-s,--strict}'[suppress conversion to reciprocals units]' \ + '(-t --terse)'{-t,--terse}'[make conversion output briefer]' \ + '(-v --verbose)'{-v,--verbose}'[make output more verbose]' \ + '(- *)'{-h,--help}'[show help information and exit]' \ + '(- *)'{-V,--version}'[show version information and exit]' \ + '*:unit expression:->expr' && return 0 + +[[ $state = expr ]] || return 1 + +# It's very like there's a quoted expression, since things like '2 seconds' +# need to be a single argument. Units themselves don't have special +# characters, so it's safe to take just the characters around the +# cursor. +compset -P '*[^[:alnum:]]' +compset -S '[^[:alnum:]]*' + +# Find the units data. +local datfile +local -a testfiles +testfiles=( + /usr/share/units.dat # GNU + /usr/local/share/units.dat + /usr/share/lib/unittab # Solaris +) + +datfile=${opt_args[-f]:-${opt_args[--file]}} +if [[ -z $datfile ]]; then + for datfile in $testfiles; do + [[ -f $datfile ]] && break + done +fi + +if [[ ! -f $datfile ]]; then + _message "Data file for units not found." + return +fi + +local -a all units pfxs +# Solaris uses / to start a comment, else #. +# could cache this, but it's not that big a deal... +all=($(awk '$1 !~ /^[\/#]/ { print $1 }' $datfile)) +# prefixes end in a - +pfxs=(${${all:#^[[:alnum:]]##-}%%-}) +# units may include regular or piecewise linear functions +units=(${${all:#^[[:alnum:]]##([\(\]]*|)}%%\(*}) + +if (( ${#units} )); then + _alternative 'unit prefixes:unitprefix:compadd -S "" -a pfxs' \ + 'units:unit:compadd -a units' && return 0 + # attempt to skip a prefix + if compset -P "(${(j.|.)pfxs})"; then + _wanted units expl unit compadd -a units + fi +else + _message "No unit definitions found." +fi -- Peter Stephenson Software Engineer CSR PLC, Churchill House, Cambridge Business Park, Cowley Road Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070 To access the latest news from CSR copy this link into a web browser: http://www.csr.com/email_sig.php To get further information regarding CSR, please visit our Investor Relations page at http://ir.csr.com/csr/about/overview