about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--Doc/Zsh/contrib.yo9
-rw-r--r--Functions/Misc/zcalc22
3 files changed, 32 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index c73745688..8b3ace725 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2001-12-07  Peter Stephenson  <pws@csr.com>
 
+	* 16310: Functions/Misc/zcalc, Doc/Zsh/contrib.yo: separate zcalc
+	history, handle errors in expression, document -#base option.
+
 	* users/4503: Completion/Unix/Command/_gcc: don't complete source
 	or header files after -o.
 
diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo
index 013a37979..654fa699c 100644
--- a/Doc/Zsh/contrib.yo
+++ b/Doc/Zsh/contrib.yo
@@ -828,8 +828,9 @@ Each line typed is evaluated as an expression.  The prompt shows a number,
 which corresponds to a positional parameter where the result of that
 calculation is stored.  For example, the result of the calculation on the
 line preceeded by `tt(4> )' is available as tt($4).  Full command line
-editing, including the history of previous calculations, is available.
-To exit, enter a blank line or type `tt(q)' on its own.
+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.
 
 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
@@ -845,6 +846,10 @@ 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.
 
+The output base can be initialised by passing the option `tt(-#)var(base)',
+for example `tt(zcalc -#16)' (the `tt(#)' may have to be quoted, depending
+on the globbing options set).
+
 The prompt is configurable via the parameter tt(ZCALCPROMPT), which
 undergoes standard prompt expansion.  The index of the current entry is
 stored locally in the first element of the array tt(psvar), which can be
diff --git a/Functions/Misc/zcalc b/Functions/Misc/zcalc
index 5d0264922..5e01e73d0 100644
--- a/Functions/Misc/zcalc
+++ b/Functions/Misc/zcalc
@@ -88,6 +88,25 @@
 emulate -L zsh
 setopt extendedglob
 
+# can't be local since required in EXIT trap
+zcalc_orighist=$HISTFILE 
+local temphist=${TMPPREFIX}hist SAVEHIST=$HISTSIZE
+HISTFILE=$temphist
+fc -W
+
+local HISTSIZE=0
+HISTSIZE=$SAVEHIST
+HISTFILE=~/.zcalc_history
+[[ -f $HISTFILE ]] && fc -R
+
+zcalc_restore() {
+    unfunction zcalc_restore
+    fc -W
+    HISTFILE=$zcalc_orighist
+    fc -R
+}
+trap zcalc_restore HUP INT QUIT EXIT
+
 local line latest base defbase match mbegin mend psvar optlist opt arg
 integer num
 
@@ -172,7 +191,10 @@ while vared -cehp "${(%)ZCALCPROMPT}" line; do
     # 
     # Since it's a string, we'd better make sure we know which
     # base it's in, so don't change that until we actually print it.
+    latest=
     eval "latest=\$(( $line ))"
+    # on error $latest is not set; let user re-edit line
+    [[ -n $latest ]] || continue
     argv[num++]=$latest
     psvar[1]=$num
     if [[ -z $base ]]; then