From: Alexandre Garreau <galex-713@galex-713.eu>
To: rms@gnu.org
Cc: Eli Zaretskii <eliz@gnu.org>, larsi@gnus.org, emacs-devel@gnu.org
Subject: Re: Future of display engine and lines
Date: Thu, 28 Oct 2021 17:03:37 +0200 [thread overview]
Message-ID: <2364365.nKfNrZnynm@galex-713.eu> (raw)
In-Reply-To: <E1mg4Nh-0000Dg-2T@fencepost.gnu.org>
Le jeudi 28 octobre 2021, 14:19:41 CEST Richard Stallman a écrit :
> [[[ To any NSA and FBI agents reading my email: please consider ]]]
> [[[ whether defending the US Constitution against all enemies, ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
> > > > It could have multiple segments for each display line, and
> > > > fill up
> > > > one series of segments going vertically down from point A,
> > > > then the next series of segments going vertically down from
> > > > point B,
> > > > and so on.
> I am thinking about non-graphics terminals. For graphics terminals,
> the data structure will have to be different. (They already use a
> different data structure.)
I think both need to use a tree, afaik even ncurses uses a tree for such
things.
> The point is, there is no need to change the representation of buffers.
>
>
> In principle there might be a more efficient representation of
> buffers. But I am skeptical about that. When I tried to look for a
> better representation that would allow for multiple gaps, I couldn't
> see a good answer about how to use them and gain any benefits.
The question is not to have multiple gaps (although that would actually be
useful for some extensions like multiple-cursors (which btw is pretty nice
and emacs is the only editor to support that)), but to fragment the buffer
differently than as a stream.
We’re talking about making it a tree. It does not have to be a binary
tree of course (most graphical trees aren’t), and insertion as well as
lookup should be as fast as possible, since it’s for editing, so a gapped-
array is still useful, what would be useful is instead to store chars in
that array, rather store some recursive datastructure that could be either
again this gapped-array (possibly with metadata such as vertical/
horizontal direction), either something else (a character, an image, any
kind of weird-behaving space/glue, etc. like TeX, like TeXmacs, like any
web engine, like LibreOffice).
So it would be recursive gapped-arrays, that’s different from a gapped-
array of chars, but there still is one gap, and it works similarly, but
the functionality is different: it also stores some fragmentation of the
content (possibly none, in the case of plain text).
> I am simply trying to argue that the buffer representation and the
> redisplay algorithm are modularly separate. We can keep the issues
> separate and this issue much simpler.
Modularly in the sense our problem is solvable without having to change
the buffer datastructure. But that’s merely because the improvement
proposed doesn’t change functionality but efficience, they would merely
provide a sort of “cache” for certain functions. It would theorically
possible to keep everything modular by “advicing” (not with elisp advices,
sorry for the confusion, but the comparison comes to my mind) the C
datastructure of the buffer with some other separate (hence “modular”)
datastructure that’s only used by redisplay, and stores some computation
whose value is strictly related to the buffer’s content and its semantic.
But that’s rather hairy and academic to do. We could just as well
complexify a little the buffer datastructure, or, like I proposed,
introduce some new datastructure *in addition* to the legacy buffer, that
could be used instead, and be more efficient for graphical redisplay,
notably for tree layouts (something non-linear and more complicated than a
2D grid of columns × line).
And anyway we should store some semantical information (= functionality),
somewhere… but where would you want to store that? within text properties?
with markers (aren’t they slow?)? we’re not anymore talking about
something that’s inconvenient splitting and then rejoining ambiguously,
such as face, but a real tree (because we could have (that’s hairy but
imaginable) a multicolumn at the middle of one column of a multicolumn),
here emacs need a tree, just as a DOM, just as with overlays, but efficient,
and very very important to redisplay.
next prev parent reply other threads:[~2021-10-28 15:03 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-20 13:27 Future of display engine and lines Alexandre Garreau
2021-10-21 3:16 ` Lars Ingebrigtsen
2021-10-22 23:47 ` Richard Stallman
2021-10-23 7:10 ` Eli Zaretskii
2021-10-24 12:38 ` Lars Ingebrigtsen
2021-10-24 13:17 ` Alan Mackenzie
2021-10-25 2:18 ` Richard Stallman
2021-10-25 12:05 ` Eli Zaretskii
2021-10-25 12:20 ` Alexandre Garreau
2021-10-25 12:50 ` Eli Zaretskii
2021-10-25 13:01 ` Alexandre Garreau
2021-10-28 12:19 ` Richard Stallman
2021-10-28 12:19 ` Richard Stallman
2021-10-28 13:19 ` Eli Zaretskii
2021-10-28 15:03 ` Alexandre Garreau [this message]
2021-11-09 23:13 ` chad
2021-11-10 19:24 ` Eli Zaretskii
2021-11-13 4:08 ` Richard Stallman
2021-10-23 10:32 ` Alexandre Garreau
2021-10-21 22:43 ` Richard Stallman
2021-10-22 11:56 ` Alexandre Garreau
2021-10-22 12:45 ` Eli Zaretskii
2021-10-23 13:55 ` Ihor Radchenko
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=2364365.nKfNrZnynm@galex-713.eu \
--to=galex-713@galex-713.eu \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=larsi@gnus.org \
--cc=rms@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.