#compdef units
local curcontext="$curcontext" state line
integer ret=1
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 likely 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 on Fedora
/usr/share/units/units.dat # on gentoo
/usr/share/misc/units.dat # on Debian
/usr/local/share/units.dat # GNU DIY install
/usr/share/lib/unittab # Solaris
/usr/share/misc/units.lib # BSD
)
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 'unitprefixes:unit prefix:compadd -S "" -a pfxs' \
'units:unit:compadd -a units' && ret=0
# attempt to skip a prefix
if (( ${#pfxs} )) && compset -P "(${(j.|.)pfxs})"; then
_wanted units expl unit compadd -a units && ret=0
fi
return ret
else
_message "No unit definitions found."
fi
Copyright 2K16 - 2K18 Indonesian Hacker Rulez