Subject: Re: bug#46290: 28.0.50; repeat's ability to repeat complex commands is broken

From: Sean Whitton <[email-masked]>
Date: Thu, 04 Feb 2021 10:47:22 -0700

On Thu 04 Feb 2021 at 08:30AM GMT, Gregory Heytings wrote:

>>
>> But secondly, it doesn't seem like the "Repeating %S" branch works at 
>> all.  For if you type M-! date RET C-x z then you get prompted for a 
>> shell command, rather than date(1) just getting executed again right 
>> away.
>>
>> I added some debug printing to `repeat' and found that after M-! date 
>> RET, last-repeatable-command is set to shell-command, not 
>> exit-minibuffer.  So perhaps the way that last-repeatable-command gets 
>> set has changed since this code in repeat.el was written?
>>
>
> FWIW, the answer to that question seems to be positive.  In Emacs 21 M-! 
> date RET C-x z repeats "date" without prompting again, in later Emacsen 
> you get prompted again for a shell command.

Ah, thanks for testing.

One possible fix is attached.  It has the advantage of removing the list
which needs to be kept updated, so it works immediately for repeating
M-z and M-:

-- 
Sean Whitton
>From 60bde7beb317601c00d075f356a1b89877ad6104 Mon Sep 17 00:00:00 2001
From: Sean Whitton <[email-masked]>
Date: Thu, 4 Feb 2021 10:42:21 -0700
Subject: [PATCH] * lisp/repeat.el (repeat): Fix repeating complex commands
 (bug#46290)

---
 lisp/repeat.el | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/lisp/repeat.el b/lisp/repeat.el
index d488889348..795577c93f 100644
--- a/lisp/repeat.el
+++ b/lisp/repeat.el
@@ -239,9 +239,7 @@ recently executed command not bound to an input event\"."
            (car (memq last-command-event
                       (listify-key-sequence
                        repeat-on-final-keystroke))))))
-    (if (memq last-repeatable-command '(exit-minibuffer
-					minibuffer-complete-and-exit
-					self-insert-and-exit))
+    (if (eq last-repeatable-command (caar command-history))
         (let ((repeat-command (car command-history)))
           (repeat-message "Repeating %S" repeat-command)
           (eval repeat-command))
-- 
2.29.2