Subject: bug#45607: 27.1; compiled replace-string breaks repeat-complex-command

From: Lars Ingebrigtsen <[email-masked]>
Date: Thu, 09 Jun 2022 20:52:57 +0200

Lars Ingebrigtsen <[email-masked]> writes:

> could be something like
>
>           (interactive-region-beginning)
>           (interactive-region-end)
>
> and whatever updates command-history would reify those as is instead of
> their return values?

Sometimes it's helpful to actually look at the code.  All this magic
comes from:

/* If the list of args INPUT was produced with an explicit call to
   `list', look for elements that were computed with
   (region-beginning) or (region-end), and put those expressions into
   VALUES instead of the present values.

   This function doesn't return a value because it modifies elements
   of VALUES to do its job.  */

static void
fix_command (Lisp_Object input, Lisp_Object values)
{
  /* FIXME: Instead of this ugly hack, we should provide a way for an
     interactive spec to return an expression/function that will re-build the
     args without user intervention.  */
  if (CONSP (input))

And what this does is to try to hack its way through the lisp code in an
interactive spec like

      /* Skip through certain special forms.  */
      while (EQ (car, Qlet) || EQ (car, Qletx)
	     || EQ (car, Qsave_excursion)
	     || EQ (car, Qprogn))

looking for `region-beginning' and friends.  But we now byte-compile the
interactive specs, so all this fails spectacularly.

So we need a brand new way to specify which options are
`region-beginning' etc.  Perhaps with a declare form?  (That translates
into symbol properties, I guess.)

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no