mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-11-04 07:21:06 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			80 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#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
 |