all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Eduardo Ochs <eduardoochs@gmail.com>
To: help-gnu-emacs <help-gnu-emacs@gnu.org>
Subject: Re: How do I wait, or sit-for, until a hook is run?
Date: Fri, 30 Dec 2022 19:43:11 -0300	[thread overview]
Message-ID: <CADs++6hbYcNNT2ze6jK0o4Whcd33biJswPczuR=1VnaSH99ojA@mail.gmail.com> (raw)
In-Reply-To: <CADs++6gh4YJ-Hc4yfM_e0=TVKpGXdr3xVgZSnTiw-hT9KdTBiw@mail.gmail.com>

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	other threads:[~2022-12-30 22:43 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-29 21:41 How do I wait, or sit-for, until a hook is run? Eduardo Ochs
2022-12-30 22:43 ` Eduardo Ochs [this message]
2022-12-30 23:16   ` Emanuel Berg
2022-12-30 23:25   ` Emanuel Berg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CADs++6hbYcNNT2ze6jK0o4Whcd33biJswPczuR=1VnaSH99ojA@mail.gmail.com' \
    --to=eduardoochs@gmail.com \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.