From: Eli Zaretskii <eliz@gnu.org>
To: Tassilo Horn <tsdh@gnu.org>
Cc: monnier@iro.umontreal.ca, 21747@debbugs.gnu.org, storm@cua.dk
Subject: bug#21747: 25.0.50; while-no-input breaks kbd event handling when called from post-command-hook
Date: Sat, 24 Oct 2015 13:35:41 +0300 [thread overview]
Message-ID: <83wpucwo3m.fsf@gnu.org> (raw)
In-Reply-To: <8737x0egvm.fsf@gnu.org>
> From: Tassilo Horn <tsdh@gnu.org>
> Cc: Stefan Monnier <monnier@iro.umontreal.ca>, 21747@debbugs.gnu.org, Kim F. Storm <storm@cua.dk>
> Date: Sat, 24 Oct 2015 11:49:01 +0200
>
> Eli Zaretskii <eliz@gnu.org> writes:
>
> >> From: Tassilo Horn <tsdh@gnu.org>
> >> Cc: 21747@debbugs.gnu.org
> >> Date: Sat, 24 Oct 2015 10:53:12 +0200
> >>
> >> > Given that, maybe I'm missing something, but what did you expect? The
> >> > above literally says that Emacs shall loop indefinitely after
> >> > performing each command until there's more input. And that's what you
> >> > get. Right?
> >>
> >> Correct, but when the input eventually arrives, I expect to see its
> >> effects as if it had arrived outside of the `while-no-input'.
> >
> > That effect was not yet produced, because the arriving input was not
> > yet consumed by the time while-no-input returns, that input is still
> > "pending". For it to be consumed and acted upon, you need another
> > crank of the Emacs main loop and another redisplay cycle (which is
> > again delayed by the while-no-input loop). So the one-character delay
> > goes on forever.
>
> Ah, ok. I changed `while-no-input' locally to
>
> (defmacro while-no-input (&rest body)
> "Execute BODY only as long as there's no pending input.
> If input arrives, that ends the execution of BODY,
> and `while-no-input' returns t. Quitting makes it return nil.
> If BODY finishes, `while-no-input' returns whatever value BODY produced."
> (declare (debug t) (indent 0))
> (let ((catch-sym (make-symbol "input")))
> `(with-local-quit
> (catch ',catch-sym
> (let ((throw-on-input ',catch-sym))
> (or (input-pending-p)
> (progn
> (sit-for 0) ;; <== just inserted that
> ,@body)))))))
>
> which seems to fix the issue somehow. With your description, what I
> think it does is that it forces the display of the effects of the
> command which has interrupted the `while-no-input' in the previous
> cycle.
More accurately, it invokes redisplay without waiting for more input
to arrive.
> >> So the question is: should `while-no-input' call (sit-for 0) as the
> >> first statement in the `progn' or should functions using
> >> `while-no-input' do that on their own? I'd prefer the former because
> >> the current behavior is not really obvious (at least not to me nor
> >> Artur).
> >
> > I don't have enough experience in using while-no-input to answer that.
> > Perhaps others could chime in and voice their opinions. Maybe we
> > should have a discussion on emacs-devel about this (because many
> > people who read emacs-devel don't read the bug list).
>
> Yes, I think that would be a good idea. Originally, `while-no-input'
> used (not (sit-for 0 0 t)) instead of (input-pending-p) which I think is
> pretty equivalent except that the former forces a redisplay. I've added
> Kim to the Cc, so maybe he can speak up.
>
> --8<---------------cut here---------------start------------->8---
> commit 790e0ef78e306edc0664b8fa5a584c62ec01b444
> Author: Kim F. Storm <storm@cua.dk>
> Date: Mon Sep 11 22:21:55 2006 +0000
>
> (sit-for): Rework to use input-pending-p and cond.
> Return nil input is pending on entry also for SECONDS <= 0.
> (while-no-input): Use input-pending-p instead of sit-for.
This discussion on emacs-devel might be relevant (I think it was the
motivation for this change):
http://lists.gnu.org/archive/html/emacs-devel/2006-09/msg00300.html
prev parent reply other threads:[~2015-10-24 10:35 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-24 7:42 bug#21747: 25.0.50; while-no-input breaks kbd event handling when called from post-command-hook Tassilo Horn
2015-10-24 8:02 ` Eli Zaretskii
2015-10-24 8:53 ` Tassilo Horn
2015-10-24 9:14 ` Eli Zaretskii
2015-10-24 9:49 ` Tassilo Horn
2015-10-24 10:30 ` Artur Malabarba
2015-10-24 10:52 ` Eli Zaretskii
2015-10-24 12:13 ` Tassilo Horn
2015-10-24 12:45 ` Eli Zaretskii
2015-10-24 13:30 ` Tassilo Horn
2015-10-24 13:57 ` Artur Malabarba
2015-10-24 14:06 ` Eli Zaretskii
2015-10-24 14:05 ` Eli Zaretskii
2015-10-25 7:19 ` Tassilo Horn
2015-10-25 8:10 ` Tassilo Horn
2015-10-25 9:25 ` Tassilo Horn
2015-10-25 18:45 ` Eli Zaretskii
2015-10-25 18:49 ` Tassilo Horn
2015-10-25 20:10 ` Stefan Monnier
2015-10-26 6:57 ` Tassilo Horn
2015-10-25 18:43 ` Eli Zaretskii
2015-10-24 12:46 ` Tassilo Horn
2015-10-25 14:43 ` Artur Malabarba
2015-10-25 18:50 ` Eli Zaretskii
2015-10-26 0:27 ` Artur Malabarba
2015-10-26 3:32 ` Eli Zaretskii
2015-10-26 13:43 ` Tassilo Horn
2015-10-24 10:35 ` Eli Zaretskii [this message]
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=83wpucwo3m.fsf@gnu.org \
--to=eliz@gnu.org \
--cc=21747@debbugs.gnu.org \
--cc=monnier@iro.umontreal.ca \
--cc=storm@cua.dk \
--cc=tsdh@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.