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

* Re: PATCH: _units
  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-04 20:30 ` Mikael Magnusson
  1 sibling, 1 reply; 6+ messages in thread
From: Phil Pennock @ 2007-06-04 19:21 UTC (permalink / raw)
  To: Zsh hackers list

On 2007-06-04 at 16:18 +0100, Peter Stephenson wrote:
> 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.

FreeBSD: /usr/share/misc/units.lib
I suspect that holds for all the modern *BSDs.

My completion-fu sucks; how would this be able to detect automatically
something like FreeBSD units(1), which uses -v for the version:

----------------------------8< cut here >8------------------------------
% units -v

  units version 1.0  Copyright (c) 1993 by Adrian Mariano
                    This program may be freely distributed
usage: units [-f unitsfile] [-q] [-v] [from-unit to-unit]
% 
----------------------------8< cut here >8------------------------------

-Phil


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

* Re: PATCH: _units
  2007-06-04 15:18 PATCH: _units Peter Stephenson
  2007-06-04 19:21 ` Phil Pennock
@ 2007-06-04 20:30 ` Mikael Magnusson
  1 sibling, 0 replies; 6+ messages in thread
From: Mikael Magnusson @ 2007-06-04 20:30 UTC (permalink / raw)
  To: Peter Stephenson; +Cc: Zsh hackers list

On 04/06/07, Peter Stephenson <pws@csr.com> wrote:
> 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.
>
[..]
> +# 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

/usr/share/units/units.dat here (gentoo linux), at school it's on
/usr/share/misc/units.dat (debian 3.1 i think).

> +)
-- 
Mikael Magnusson


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

* Re: PATCH: _units
  2007-06-04 19:21 ` Phil Pennock
@ 2007-06-05 10:11   ` Peter Stephenson
  2007-06-05 15:46     ` Phil Pennock
  0 siblings, 1 reply; 6+ messages in thread
From: Peter Stephenson @ 2007-06-05 10:11 UTC (permalink / raw)
  To: Zsh hackers list

Phil Pennock wrote:
> FreeBSD: /usr/share/misc/units.lib
> I suspect that holds for all the modern *BSDs.

Thanks, I've committed yours and Mikael's suggestions.

> My completion-fu sucks; how would this be able to detect automatically
> something like FreeBSD units(1), which uses -v for the version:

Probably the first thing to do is run with the --version option and look
at what you get.  The worst it's likely to do is print an error
message.

-- 
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

* Re: PATCH: _units
  2007-06-05 10:11   ` Peter Stephenson
@ 2007-06-05 15:46     ` Phil Pennock
  2007-06-05 15:55       ` Peter Stephenson
  0 siblings, 1 reply; 6+ messages in thread
From: Phil Pennock @ 2007-06-05 15:46 UTC (permalink / raw)
  To: Zsh hackers list

On 2007-06-05 at 11:11 +0100, Peter Stephenson wrote:
> Probably the first thing to do is run with the --version option and look
> at what you get.  The worst it's likely to do is print an error
> message.

% units --version | sed 's/^/STDOUT:/'
units: illegal option -- -
usage: units [-f unitsfile] [-q] [-v] [from-unit to-unit]

Exit status happens to be 3; this isn't documented but I've checked the
source and it's hard-coded.

Meh, Unix needed standardised help/version options 20 years earlier.

-Phil


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

* Re: PATCH: _units
  2007-06-05 15:46     ` Phil Pennock
@ 2007-06-05 15:55       ` Peter Stephenson
  0 siblings, 0 replies; 6+ messages in thread
From: Peter Stephenson @ 2007-06-05 15:55 UTC (permalink / raw)
  To: Zsh hackers list

Phil Pennock wrote:
> On 2007-06-05 at 11:11 +0100, Peter Stephenson wrote:
> > Probably the first thing to do is run with the --version option and look
> > at what you get.  The worst it's likely to do is print an error
> > message.
> 
> % units --version | sed 's/^/STDOUT:/'
> units: illegal option -- -
> usage: units [-f unitsfile] [-q] [-v] [from-unit to-unit]

That should be enough to help _pick_variant.  I've tried two versions of
the GNU version:

STDOUT:units version 1.80 with readline, units database in /usr/share/units.dat

STDOUT:GNU Units version 1.85
STDOUT:without readline, units database in /usr/share/units.dat
STDOUT:Copyright (C) 2004 Free Software Foundation, Inc.
STDOUT:GNU Units comes with ABSOLUTELY NO WARRANTY.
STDOUT:You may redistribute copies of GNU Units
STDOUT:under the terms of the GNU General Public License.
STDOUT:

(the units database output is also useful).  Solaris just dumps its
database and prints out the "you have: " prompt, which is ignored
since _pick_variant redirects input from /dev/null.

-- 
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).