4
(defun pretend (keys)
  (dolist (e (reverse (listify-key-sequence (kbd keys))))
    (push e unread-command-events)
    ;; (mystery-function)
    (redisplay t)
    (sleep-for 0.1)))

(pretend "M-x my-function-")

This function is intended to take key events and 'pretend' they were entered by the user at a reasonable pace of 100ms/key. Unfortunately, it doesn't seem like unread-command-events is being processed – probably because emacs is not idle during execution. One way to get around this is to abuse run-with-idle-timer, but this seems like the wrong approach.

How can I process/flush unread-command-events before continuing execution?

(I suspect I won't need the call to reverse after this is fixed.)

Sean Allred
  • 6,861
  • 16
  • 85

1 Answers1

0

You could used recursive-edit to put yourself into a situation where your events will be consumed. To make control return to your code, you must also add (kbd "C-M-c") (a.k.a exit-recursive-edit) to unread-command-events.

One limitation is that you will have to push complete key sequences, so you can't return to your code between the C-x and 2 in the key sequence C-x 2.

One concrete example where this is used is in the test code for dynamic-spaces (a package that try to make text to the right of the edit location to say in place). (N.B., I was not aware of the function listify-key-sequence when I wrote it, so it could probably be simplified.)

Lindydancer
  • 6,095
  • 1
  • 13
  • 25