all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* How do I wait, or sit-for, until a hook is run?
@ 2022-12-29 21:41 Eduardo Ochs
  2022-12-30 22:43 ` Eduardo Ochs
  0 siblings, 1 reply; 4+ messages in thread
From: Eduardo Ochs @ 2022-12-29 21:41 UTC (permalink / raw)
  To: help-gnu-emacs

Hi list,

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...

How do I write that? Or, if I can ask for something nicer... how do I
write a function like that that waits for at most 30 seconds
displaying all output like a `sit-for' (?), and returns without errors
if the hook `sly-mrepl-hook' is run, but yields an error if that hook
is not run in 30 seconds?

I spent some time trying to figure out how to do that using
`add-hook', `remove-hook', `catch', `throw', `unwind-protect' and
`sit-for', and then I realized that if I asked this question here then
probably someone would answer with "look at code for foo in the
package bar"...

  Thanks in advance!
    Eduardo Ochs
    http://angg.twu.net/#eev


P.S.: my reasons for wanting/needing that are here:
https://github.com/joaotavora/sly/issues/550



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: How do I wait, or sit-for, until a hook is run?
  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
  2022-12-30 23:16   ` Emanuel Berg
  2022-12-30 23:25   ` Emanuel Berg
  0 siblings, 2 replies; 4+ messages in thread
From: Eduardo Ochs @ 2022-12-30 22:43 UTC (permalink / raw)
  To: help-gnu-emacs

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



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: How do I wait, or sit-for, until a hook is run?
  2022-12-30 22:43 ` Eduardo Ochs
@ 2022-12-30 23:16   ` Emanuel Berg
  2022-12-30 23:25   ` Emanuel Berg
  1 sibling, 0 replies; 4+ messages in thread
From: Emanuel Berg @ 2022-12-30 23:16 UTC (permalink / raw)
  To: help-gnu-emacs

Eduardo Ochs wrote:

> I found a solution that is not too ugly [...]

Never wait for anything, signal when it should happen or push
it to some queue where it will be popped when appropriate ...

In Emacs, you can for example have the function added as
a one-shot to the desired hook, or maybe do a self-removing
advice upon completion ...

-- 
underground experts united
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: How do I wait, or sit-for, until a hook is run?
  2022-12-30 22:43 ` Eduardo Ochs
  2022-12-30 23:16   ` Emanuel Berg
@ 2022-12-30 23:25   ` Emanuel Berg
  1 sibling, 0 replies; 4+ messages in thread
From: Emanuel Berg @ 2022-12-30 23:25 UTC (permalink / raw)
  To: help-gnu-emacs

(defun add-one-shot-hook (hook fun)
  (let ((name (cl-gensym)))
    (setf (symbol-function name)
      (lambda (&rest _)
        (remove-hook hook name)
        (funcall fun) ))
    (add-hook hook name) ))

By Pascal Bourguignon.

-- 
underground experts united
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-12-30 23:25 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
2022-12-30 23:16   ` Emanuel Berg
2022-12-30 23:25   ` Emanuel Berg

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.