zsh-workers
 help / color / mirror / code / Atom feed
* PATCH: _units
@ 2007-06-04 15:18 Peter Stephenson
  2007-06-04 19:21 ` Phil Pennock
  2007-06-04 20:30 ` Mikael Magnusson
  0 siblings, 2 replies; 6+ messages in thread
From: Peter Stephenson @ 2007-06-04 15:18 UTC (permalink / raw)
  To: Zsh hackers list

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@csr.com>                  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


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2007-06-05 15:56 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-06-04 15:18 PATCH: _units Peter Stephenson
2007-06-04 19:21 ` Phil Pennock
2007-06-05 10:11   ` Peter Stephenson
2007-06-05 15:46     ` Phil Pennock
2007-06-05 15:55       ` Peter Stephenson
2007-06-04 20:30 ` Mikael Magnusson

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).