mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			80 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #compdef units
 | |
| 
 | |
| local curcontext="$curcontext" state line expl
 | |
| 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 format' \
 | |
|   '(-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 reciprocal 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
 |