Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: _units
- X-seq: zsh-workers 23519
- From: Peter Stephenson <pws@xxxxxxx>
- To: zsh-workers@xxxxxxxxxx (Zsh hackers list)
- Subject: PATCH: _units
- Date: Mon, 04 Jun 2007 16:18:04 +0100
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
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 <pws@xxxxxxx> 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
Messages sorted by:
Reverse Date,
Date,
Thread,
Author