From: Alan Mackenzie <acm@muc.de>
To: Eli Zaretskii <eliz@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: Making Emacs Lisp easier to debug
Date: Sat, 11 Nov 2023 17:23:53 +0000 [thread overview]
Message-ID: <ZU-4qfdbVJycmMeY@ACM> (raw)
In-Reply-To: <831qcwwa7v.fsf@gnu.org>
Hello, Eli.
On Sat, Nov 11, 2023 at 18:01:08 +0200, Eli Zaretskii wrote:
> > Date: Sat, 11 Nov 2023 14:56:17 +0000
> > Cc: emacs-devel@gnu.org
> > From: Alan Mackenzie <acm@muc.de>
> > > > With font lock, or any other Lisp hook called from redisplay, it should
> > > > be possible, in a recursive-edit loop, to run edebug, displaying on a
> > > > different frame. That different frame would be running in the inner
> > > > redisplay while the outer redisplay would be suspended.
> > > Why do you need an inner redisplay for that?
> > Because the outer redisplay would be the thing being debugged, and hence
> > not in a position to display the progress of edebug.
> But you don't want to debug redisplay, you want to debug the font-lock
> code called by redisplay.
Or the code called by any other hook in redisplay, including, perhaps,
the jit-lock mechanism itself.
> > > And what will that frame show, given that the outer redisplay is
> > > halfway through fontifying the text? what do you expect to see there,
> > > and why?
> > I think the scope of a redisplay operation could change from everything
> > to a single frame.
> Not really, not with the current code design.
I see 14 FOR_EACH_FRAMEs in xdisp.c. Are you saying that those loops
could not be rearranged to do everything in one frame first, followed by
doing everything in the next, and so on? Surely each frame's redisplay
is independent of all others'.
> And you don't want a separate frame, you want a separate window.
Possibly. A separate window feels like more complicated to implement,
even if not by much.
> > While stepping through a hook in edebug in the inner redisplay, the
> > outer redisplay would (I think) carry on looking like it did before the
> > outer redisplay started. Or, possibly, it might look like a bare frame,
> > I'm not sure.
> So basically, the outer redisplay doesn't exist. All you need is for
> it to call the font-lock code. Which once again brings me to the
> question: why isn't jit-lock-debug-mode not what you want?
It's rather restricted: it won't help debug a window_scroll_functions
function, for example. It won't help debug the jit-lock mechanism
itself, should it be decided to amend it. Also, as I mentioned, it's not
working for me at the moment. It gives the impression of being an
unfinished piece of code.
> > > > > Re-entering redisplay in the middle of a redisplay cycle means that
> > > > > the outer redisplay didn't finish preparing the glyph matrices, and
> > > > > what do you want the inner redisplay to do in such a case?
> > > > Work with the glyph matrices belonging to the inner redisplay whilst the
> > > > outer one is suspended.
> > > But that will immediately get you into the same problem, since the
> > > offending window will get redisplayed by the inner redisplay, and will
> > > again cause Edebug, etc., ad nauseam.
> > We could put a limit on the nesting depth of redisplay nesting that
> > edebug would cope with, a small integer (2 or 3, probably).
> That will prevent infinite recursion, but it won't solve your problem,
> because you do want the "inner" redisplay to finish, so it shows the
> window where you are running the debugger.
You're pressing me to defend a design I haven't even formulated yet. ;-)
I envisage the inner redisplay simply running, including to a finish,
whilst the outer redisplay is suspended awaiting edebug to terminate.
> > > .... and what you call "inner redisplay" is not what you want at all.
> > I don't understand why you say this.
> I'm saying that what you seem to want is an ability to display a
> single window, the one where you run the debugger. All the rest is of
> no interest to you, and can, for example, be stopped in its tracks.
> The solution to that is not a reentrant redisplay, it's something
> else.
But what? While the debugger is debugging a redisplay hook (say,
window-scroll-functions) that invocation of redisplay is stationary. The
frame or window where we're running the debugger requires a running
redisplay, however. I can't see how we can achieve this without two
instances of redisplay, one stationary waiting for its hook to finish
being debugged, the other working for and displaying edebug's progress.
What am I not seeing, here?
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2023-11-11 17:23 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-10 20:56 Making Emacs Lisp easier to debug Alan Mackenzie
2023-11-11 6:52 ` Eli Zaretskii
2023-11-11 9:01 ` Ihor Radchenko
2023-11-11 11:04 ` Alan Mackenzie
2023-11-11 11:10 ` Eli Zaretskii
2023-11-11 12:10 ` Alan Mackenzie
2023-11-11 13:47 ` Eli Zaretskii
2023-11-11 14:56 ` Alan Mackenzie
2023-11-11 16:01 ` Eli Zaretskii
2023-11-11 17:23 ` Alan Mackenzie [this message]
2023-11-11 17:54 ` Eli Zaretskii
2023-11-11 19:55 ` Alan Mackenzie
2023-11-12 7:17 ` Eli Zaretskii
2023-11-12 12:08 ` Alan Mackenzie
2023-11-12 12:28 ` Eli Zaretskii
2023-11-13 18:20 ` XY Problems (tangent, related to common discussion issue here) chad
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
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZU-4qfdbVJycmMeY@ACM \
--to=acm@muc.de \
--cc=eliz@gnu.org \
--cc=emacs-devel@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 public inbox
https://git.savannah.gnu.org/cgit/emacs.git
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).