* 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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).