zsh-workers
 help / color / mirror / code / Atom feed
From: Peter Stephenson <pws@csr.com>
To: zsh-workers@sunsite.dk (Zsh hackers list)
Subject: PATCH: _units
Date: Mon, 04 Jun 2007 16:18:04 +0100	[thread overview]
Message-ID: <200706041518.l54FI4lV007223@news01.csr.com> (raw)

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


             reply	other threads:[~2007-06-04 15:24 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-06-04 15:18 Peter Stephenson [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200706041518.l54FI4lV007223@news01.csr.com \
    --to=pws@csr.com \
    --cc=zsh-workers@sunsite.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).