mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-27 04:40:59 +01:00
improved zcalc escapes and completion
This commit is contained in:
parent
90f5247f84
commit
808b79eba6
5 changed files with 179 additions and 34 deletions
|
|
@ -1,5 +1,11 @@
|
|||
2008-06-13 Peter Stephenson <pws@csr.com>
|
||||
|
||||
* 25152: Completion/Zsh/Context/{.distfiles,_zcalc_line}
|
||||
(moved from Type because this is where it should be),
|
||||
Doc/Zsh/contrib.yo, Functions/Misc/zcalc: improved zcalc
|
||||
escape commands with ":" including ":!" and ":raw"; more complete
|
||||
zcalc completion with special context.
|
||||
|
||||
* unposted: Completion/{Unix,Linux}/Command/{strace,.distfiles}: move
|
||||
|
||||
* users/12911: Tomasz Pala <gotar@polanet.pl>:
|
||||
|
|
|
|||
|
|
@ -1,7 +1,18 @@
|
|||
DISTFILES_SRC='
|
||||
.distfiles
|
||||
_assign _autocd
|
||||
_brace_parameter _equal _math _subscript
|
||||
_condition _first _parameter _tilde
|
||||
_default _in_vared _redirect _value
|
||||
_assign
|
||||
_autocd
|
||||
_brace_parameter
|
||||
_condition
|
||||
_default
|
||||
_equal
|
||||
_first
|
||||
_in_vared
|
||||
_math
|
||||
_parameter
|
||||
_redirect
|
||||
_subscript
|
||||
_tilde
|
||||
_value
|
||||
_zcalc_line
|
||||
'
|
||||
|
|
|
|||
83
Completion/Zsh/Context/_zcalc_line
Normal file
83
Completion/Zsh/Context/_zcalc_line
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
#compdef -zcalc-line-
|
||||
|
||||
# This handles completion of a zcalc command line read via vared.
|
||||
|
||||
_zcalc_line_escapes() {
|
||||
local -a cmds
|
||||
cmds=(
|
||||
"!:shell escape"
|
||||
"q:quit"
|
||||
"norm:normal output format"
|
||||
"sci:scientific output format"
|
||||
"fix:fixed point output format"
|
||||
"eng:engineering (power of 1000) output format"
|
||||
"raw:raw output format"
|
||||
"local:make variables local"
|
||||
"function:define math function"
|
||||
)
|
||||
cmds=("\:"${^cmds})
|
||||
_describe -t command-escapes "command escapes" cmds -Q
|
||||
}
|
||||
|
||||
_zcalc_line() {
|
||||
local expl
|
||||
|
||||
if [[ CURRENT -eq 1 && $words[1] != ":!"* ]]; then
|
||||
local -a alts
|
||||
if [[ $words[1] = (|:*) ]]; then
|
||||
alts=("command-escapes:command escape:_zcalc_line_escapes")
|
||||
fi
|
||||
if [[ $words[1] = (|[^:]*) ]]; then
|
||||
alts+=("math:math formula:_math")
|
||||
fi
|
||||
_alternative $alts
|
||||
return
|
||||
fi
|
||||
|
||||
case $words[1] in
|
||||
(":!"*)
|
||||
if [[ $words[1] = ":!" ]]; then
|
||||
shift words
|
||||
(( CURRENT >1 && CURRENT-- ))
|
||||
else
|
||||
words[1]=${words[1]##:\!}
|
||||
if (( CURRENT == 1 )); then
|
||||
compset -P ":\!"
|
||||
fi
|
||||
fi
|
||||
_normal
|
||||
;;
|
||||
|
||||
(:function)
|
||||
# completing already defined user math functions is in fact exactly
|
||||
# the wrong thing to do since currently zmathfuncdef won't overwrite,
|
||||
# but it may jog the user's memory...
|
||||
if (( CURRENT == 2 )); then
|
||||
_wanted math-functions expl 'math function' \
|
||||
compadd -- ${${(k)functions:#^zsh_math_func_*}##zsh_math_func_}
|
||||
else
|
||||
_math
|
||||
fi
|
||||
;;
|
||||
|
||||
(:local)
|
||||
_parameter
|
||||
;;
|
||||
|
||||
(:(fix|sci|eng))
|
||||
if (( CURRENT == 2 )); then
|
||||
_message "precision"
|
||||
fi
|
||||
;&
|
||||
|
||||
(:*)
|
||||
_message "no more arguments"
|
||||
;;
|
||||
|
||||
([^:]*)
|
||||
_math
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_zcalc_line "$@"
|
||||
|
|
@ -1825,8 +1825,8 @@ calculation is stored. For example, the result of the calculation on the
|
|||
line preceded by `tt(4> )' is available as tt($4). The last value
|
||||
calculated is available as tt(ans). Full command line editing, including
|
||||
the history of previous calculations, is available; the history is saved in
|
||||
the file tt(~/.zcalc_history). To exit, enter a blank line or type `tt(q)'
|
||||
on its own.
|
||||
the file tt(~/.zcalc_history). To exit, enter a blank line or type `tt(:q)'
|
||||
on its own (`tt(q)' is allowed for historical compatibility).
|
||||
|
||||
If arguments are given to tt(zcalc) on start up, they are used to prime the
|
||||
first few positional parameters. A visual indication of this is given when
|
||||
|
|
@ -1846,37 +1846,51 @@ stored locally in the first element of the array tt(psvar), which can be
|
|||
referred to in tt(ZCALCPROMPT) as `tt(%1v)'. The default prompt is
|
||||
`tt(%1v> )'.
|
||||
|
||||
A few special commands are available; these are introduced by a colon.
|
||||
For backward compatibility, the colon may be omitted for certain
|
||||
commands. Completion is available if tt(compinit) has been run.
|
||||
|
||||
The output precision may be specified within zcalc by special commands
|
||||
familiar from many calculators:
|
||||
familiar from many calculators.
|
||||
startitem()
|
||||
item(tt(norm))(
|
||||
item(tt(:norm))(
|
||||
The default output format. It corresponds to the printf tt(%g)
|
||||
specification. Typically this shows six decimal digits.
|
||||
)
|
||||
item(tt(sci) var(digits))(
|
||||
item(tt(:sci) var(digits))(
|
||||
Scientific notation, corresponding to the printf tt(%g) output format with
|
||||
the precision given by var(digits). This produces either fixed point or
|
||||
exponential notation depending on the value output.
|
||||
)
|
||||
item(tt(fix) var(digits))(
|
||||
item(tt(:fix) var(digits))(
|
||||
Fixed point notation, corresponding to the printf tt(%f) output format with
|
||||
the precision given by var(digits).
|
||||
)
|
||||
item(tt(eng) var(digits))(
|
||||
item(tt(:eng) var(digits))(
|
||||
Exponential notation, corresponding to the printf tt(%E) output format with
|
||||
the precision given by var(digits).
|
||||
)
|
||||
item(tt(:raw))(
|
||||
Raw output: this is the default form of the output from a math
|
||||
evaluation. This may show more precision than the number actually
|
||||
possesses.
|
||||
)
|
||||
enditem()
|
||||
|
||||
Other special commands:
|
||||
startitem()
|
||||
item(tt(local) var(arg) ...)(
|
||||
item(tt(:!)var(line...))(
|
||||
Execute var(line...) as a normal shell command line. Note that it
|
||||
is executed in the context of the function, i.e. with local variables.
|
||||
Space is optional after tt(:!).
|
||||
)
|
||||
item(tt(:local) var(arg) ...)(
|
||||
Declare variables local to the function. Note that certain variables
|
||||
are used by the function for its own purposes. Other variables
|
||||
may be used, too, but they will be taken from or put into the global
|
||||
scope.
|
||||
)
|
||||
item(tt(function) var(name) [ var(body) ])(
|
||||
item(tt(:function) var(name) [ var(body) ])(
|
||||
Define a mathematical function or (with no var(body)) delete it.
|
||||
The function is defined using tt(zmathfuncdef), see below.
|
||||
|
||||
|
|
@ -1887,14 +1901,14 @@ example(function cube $1 * $1 * $1)
|
|||
defines a function to cube the sole argument.
|
||||
)
|
||||
item(tt([#)var(base)tt(]))(
|
||||
When this syntax appears on a line by itself, the default output radix
|
||||
is set to var(base). Use, for example, `tt([#16])' to display hexadecimal
|
||||
output preceded by an indication of the base, or `tt([##16])' just to
|
||||
display the raw number in the given base. Bases themselves are always
|
||||
specified in decimal. `tt([#])' restores the normal output format. Note
|
||||
that setting an output base suppresses floating point output; use `tt([#])'
|
||||
to return to normal operation.
|
||||
|
||||
This is not a special command, rather part of normal arithmetic
|
||||
syntax; however, when this form appears on a line by itself the default
|
||||
output radix is set to var(base). Use, for example, `tt([#16])' to display
|
||||
hexadecimal output preceded by an indication of the base, or `tt([##16])'
|
||||
just to display the raw number in the given base. Bases themselves are
|
||||
always specified in decimal. `tt([#])' restores the normal output format.
|
||||
Note that setting an output base suppresses floating point output; use
|
||||
`tt([#])' to return to normal operation.
|
||||
)
|
||||
enditem()
|
||||
|
||||
|
|
|
|||
|
|
@ -96,16 +96,16 @@ setopt extendedglob
|
|||
# TODO: make local variables that shouldn't be visible in expressions
|
||||
# begin with _.
|
||||
local line ans base defbase forms match mbegin mend psvar optlist opt arg
|
||||
local compcontext="-math-"
|
||||
local compcontext="-zcalc-line-"
|
||||
integer num outdigits outform=1
|
||||
|
||||
# We use our own history file with an automatic pop on exit.
|
||||
history -ap "${ZDOTDIR:-$HOME}/.zcalc_history"
|
||||
|
||||
forms=( '%2$g' '%.*g' '%.*f' '%.*E' )
|
||||
forms=( '%2$g' '%.*g' '%.*f' '%.*E' '')
|
||||
|
||||
zmodload -i zsh/mathfunc 2>/dev/null
|
||||
autoload zmathfuncdef
|
||||
autoload -U zmathfuncdef
|
||||
|
||||
: ${ZCALCPROMPT="%1v> "}
|
||||
|
||||
|
|
@ -176,35 +176,62 @@ while vared -cehp "${(%)ZCALCPROMPT}" line; do
|
|||
|
||||
print -s -- $line
|
||||
|
||||
case ${${line##[[:blank:]]#}%%[[:blank:]]#} in
|
||||
(q) # Exit if `q' on its own.
|
||||
line="${${line##[[:blank:]]#}%%[[:blank:]]#}"
|
||||
case "$line" in
|
||||
# Escapes begin with a colon
|
||||
(:!*)
|
||||
# shell escape
|
||||
eval ${line##:\![[:blank:]]#}
|
||||
line=
|
||||
continue
|
||||
;;
|
||||
|
||||
((:|)q)
|
||||
# Exit
|
||||
return 0
|
||||
;;
|
||||
(norm) # restore output format to default
|
||||
|
||||
((:|)norm) # restore output format to default
|
||||
outform=1
|
||||
;;
|
||||
(sci[[:blank:]]#(#b)(<->)(#B))
|
||||
|
||||
((:|)sci[[:blank:]]#(#b)(<->)(#B))
|
||||
outdigits=$match[1]
|
||||
outform=2
|
||||
;;
|
||||
(fix[[:blank:]]#(#b)(<->)(#B))
|
||||
|
||||
((:|)fix[[:blank:]]#(#b)(<->)(#B))
|
||||
outdigits=$match[1]
|
||||
outform=3
|
||||
;;
|
||||
(eng[[:blank:]]#(#b)(<->)(#B))
|
||||
|
||||
((:|)eng[[:blank:]]#(#b)(<->)(#B))
|
||||
outdigits=$match[1]
|
||||
outform=4
|
||||
;;
|
||||
(local([[:blank:]]##*|))
|
||||
|
||||
(:raw)
|
||||
outform=5
|
||||
;;
|
||||
|
||||
((:|)local([[:blank:]]##*|))
|
||||
eval $line
|
||||
line=
|
||||
continue
|
||||
;;
|
||||
(function[[:blank:]]##(#b)([^[:blank:]]##)(|[[:blank:]]##([^[:blank:]]*)))
|
||||
|
||||
((:|)function[[:blank:]]##(#b)([^[:blank:]]##)(|[[:blank:]]##([^[:blank:]]*)))
|
||||
zmathfuncdef $match[1] $match[3]
|
||||
line=
|
||||
continue
|
||||
;;
|
||||
|
||||
(:*)
|
||||
print "Unrecognised escape"
|
||||
line=
|
||||
continue
|
||||
;;
|
||||
|
||||
(*)
|
||||
# Latest value is stored as a string, because it might be floating
|
||||
# point or integer --- we don't know till after the evaluation, and
|
||||
|
|
@ -222,7 +249,11 @@ while vared -cehp "${(%)ZCALCPROMPT}" line; do
|
|||
if [[ -n $base ]]; then
|
||||
print -- $(( $base $ans ))
|
||||
elif [[ $ans = *.* ]] || (( outdigits )); then
|
||||
if [[ -z $forms[outform] ]]; then
|
||||
print -- $(( $ans ))
|
||||
else
|
||||
printf "$forms[outform]\n" $outdigits $ans
|
||||
fi
|
||||
else
|
||||
printf "%d\n" $ans
|
||||
fi
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue