Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: A ZLE widget for calculator



Thank you for the inspiration!

I just augmented it with a trick I use to chain accept-line handlers (my own, and zsh_autosuggest):
If you read the fine print, you will see that .accept-line is the rock-bottom handler, not just anything that was bound before.

if [[ -z ${CALCPREVACCEPTLINE} ]]; then
   # only do this once, even if the file is sourced multiple times
   function quote_expression() {
      if [[ ${BUFFER} =~ ^=.* ]]; then
         # used below in history hack
         typeset -g calc_expr="${BUFFER}"
         # add quotes
         BUFFER="= ${(q-)${${BUFFER#=}# }}"
      fi
      if [[ -z ${CALCPREVACCEPTLINE} ]]; then
         # bail out
         zle .accept-line
      else
         # up the chain
         "${CALCPREVACCEPTLINE}" "${@}"
      fi
   }

   # save the original accept-line widget, so we can call it from our wrapper
   CALCPREVACCEPTLINE=${widgets[accept-line]#*:}
   zle -N accept-line quote_expression
fi

Kind regards, erik.

On Tue, Mar 24, 2026 at 10:53 PM Vincent Bernat <bernat@xxxxxxxx> wrote:
On 2026-02-08 16:06, Vincent Bernat wrote:

>> I think the attached does what you want.  It's based on the
>> modify-$BUFFER + .accept-line variation because among other things
>> that has the advantage of working at the PS2 prompt.  It
>> unconditionally removes and re-adds quotes.  The original $BUFFER is
>> saved in a global variable which is then added to the history by the
>> preexec hook, after suppressing the automatic history with
>> zshaddhistory hook.  This could probably use a function instead of an
>> alias for "=", but I didn't change that.
>
> Thanks, it works perfectly!

FI, I have written a short blog post about this:
https://vincent.bernat.ch/en/blog/2026-zsh-calculator

Thanks again!



Messages sorted by: Reverse Date, Date, Thread, Author