help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How do I wait, or sit-for, until a hook is run?


From: Eduardo Ochs
Subject: Re: How do I wait, or sit-for, until a hook is run?
Date: Fri, 30 Dec 2022 19:43:11 -0300

On Thu, 29 Dec 2022 at 18:41, Eduardo Ochs <eduardoochs@gmail.com> wrote:
> I am trying to write a function (my-sly-wait) that can be put here,
>
>   (save-window-excursion (sly) (my-sly-wait))
>
> and that only returns when the hook `sly-mrepl-hook' is run...

Hi list,

I found a solution that is not too ugly and that apparently works well.
The main part of the code is below:

  (defvar ee-wait-status nil)
  (defun  ee-wait-repl-started ()
    (setq ee-wait-status 'repl-started))

  (defun ee-wait (ntimes time)
    "Run NTIMES (sit-for TIME); aborts in some conditions."
    (catch 'stop
      (dotimes (i ntimes)
        (if (not (sit-for time))
            (throw 'stop 'got-input))
        (if ee-wait-status
            (throw 'stop 'ee-wait-status-not-nil)))
      'timeout))

  (defun find-slyprocess-reuse ()
    "Go to a Sly REPL buffer (when we want to reuse an old one).
  This is an internal function used by `find-slyprocess'."
    (find-ebuffer (sly-mrepl--find-buffer) :end))

  (defun find-slyprocess-create00 ()
    "Go to a Sly REPL buffer (when we want to create a new one).
  This is an internal function used by `find-slyprocess-create0'."
    (let ((sly-command-switch-to-existing-lisp 'never)
          (sly-auto-select-connection 'never)
          (sly-lisp-implementations '((sbcl ("sbcl"))))
          (sly-default-lisp 'sbcl))
      (sly)))

  (defun find-slyprocess-create0 ()
    "Like `find-slyprocess-create0', but only returns when the mrepl starts.
  If the mrepl doesn't start in 30 seconds this function yields an error."
    (interactive)
    (unwind-protect
        (progn
          (setq ee-wait-status nil)
          (add-hook 'sly-mrepl-hook 'ee-wait-repl-started)
          (find-slyprocess-create00)
          (ee-wait 60 0.5))
      (remove-hook 'sly-mrepl-hook 'ee-wait-repl-started))
    (if (eq ee-wait-status 'repl-started)
        "Repl started!"
      (error "ee-sly: Sly timed out")))

The rest of the code - with context and comments - is here:

  http://angg.twu.net/eev-current/eepitch.el.html#wait-for-hooks
  http://angg.twu.net/eev-current/eepitch.el.html#ee-wait
  http://angg.twu.net/eev-current/eepitch.el.html#eepitch-sly
                       (find-eev "eepitch.el"    "wait-for-hooks")
                       (find-eev "eepitch.el"    "ee-wait")
                       (find-eev "eepitch.el"    "eepitch-sly")

Links and suggestions are still welcome! =)
  Cheers & HNY =),
    Eduardo Ochs
    http://angg.twu.net/eepitch.html



reply via email to

[Prev in Thread] Current Thread [Next in Thread]