summaryrefslogtreecommitdiff
path: root/Completion/Unix/Command/_units
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2007-06-04 15:39:12 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2007-06-04 15:39:12 +0000
commita8bff431644991e30eeadcc886b20f2b4ca08ae5 (patch)
treeff2a159c38c2de235ef3de36aa3df953c2772e4e /Completion/Unix/Command/_units
parent1fbe8436876b81f338bbe9a4aaf601b4c2016e4a (diff)
downloadzsh-a8bff431644991e30eeadcc886b20f2b4ca08ae5.tar.gz
zsh-a8bff431644991e30eeadcc886b20f2b4ca08ae5.zip
23519: completion for units
Diffstat (limited to 'Completion/Unix/Command/_units')
-rw-r--r--Completion/Unix/Command/_units75
1 files changed, 75 insertions, 0 deletions
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