From a8bff431644991e30eeadcc886b20f2b4ca08ae5 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 4 Jun 2007 15:39:12 +0000 Subject: 23519: completion for units --- Completion/Unix/Command/_units | 75 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Completion/Unix/Command/_units (limited to 'Completion/Unix/Command/_units') diff --git a/Completion/Unix/Command/_units b/Completion/Unix/Command/_units new file mode 100644 index 000000000..e4708dbe7 --- /dev/null +++ b/Completion/Unix/Command/_units @@ -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 -- cgit 1.4.1