* Request for pointers and advice: displaying several buffers inside a single window @ 2020-04-03 11:54 Dmitrii Korobeinikov 2020-04-03 13:07 ` Eli Zaretskii 2020-04-03 18:30 ` [SPAM UNSURE] " Stephen Leake 0 siblings, 2 replies; 41+ messages in thread From: Dmitrii Korobeinikov @ 2020-04-03 11:54 UTC (permalink / raw) To: emacs-devel Hi all, I want to explore the feasibility of displaying two (indirect) buffers inside a single window, one after another. Each buffer has to look like it's rendered in its own mode. For the starters, each buffer can start on its own new line in the window. No interaction w/ text is required for now. I have been entertaining the idea since my proposal for lenses [1], and now that I have some desire to get hacking a little, I want to see if I can get onto this first ladder step to the goal. What concerns me now is how to approach the problem. So, I come here to ask for your advice and comments. You know, "it's dangerous to go alone, take this!" sort of deal. I guess I would first have to learn how the renderer functions. Any good resources on that besides the source code? Eventually, I would have to explore beyond the renderer and get to play with the data structures, so I can do the interaction w/ text possible. But that doesn't concern me all that much until I get to actually draw some buffers together. Any man-hour estimates? : ) Best, DK [1] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=35419 ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-03 11:54 Request for pointers and advice: displaying several buffers inside a single window Dmitrii Korobeinikov @ 2020-04-03 13:07 ` Eli Zaretskii 2020-04-04 22:44 ` Dmitrii Korobeinikov 2020-04-05 22:55 ` Dmitrii Korobeinikov 2020-04-03 18:30 ` [SPAM UNSURE] " Stephen Leake 1 sibling, 2 replies; 41+ messages in thread From: Eli Zaretskii @ 2020-04-03 13:07 UTC (permalink / raw) To: Dmitrii Korobeinikov; +Cc: emacs-devel > From: Dmitrii Korobeinikov <dim1212k@gmail.com> > Date: Fri, 3 Apr 2020 17:54:07 +0600 > > I guess I would first have to learn how the renderer functions. Any > good resources on that besides the source code? Basically, none besides the source code. The large comment at the beginning of xdisp.c should get you started. Feel free to ask questions here, if something is unclear. Good luck! ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-03 13:07 ` Eli Zaretskii @ 2020-04-04 22:44 ` Dmitrii Korobeinikov 2020-04-05 14:08 ` Adam Porter 2020-04-05 22:55 ` Dmitrii Korobeinikov 1 sibling, 1 reply; 41+ messages in thread From: Dmitrii Korobeinikov @ 2020-04-04 22:44 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel That's a quite informative intro, thanks for the reference! пт, 3 апр. 2020 г. в 19:08, Eli Zaretskii <eliz@gnu.org>: > > > From: Dmitrii Korobeinikov <dim1212k@gmail.com> > > Date: Fri, 3 Apr 2020 17:54:07 +0600 > > > > I guess I would first have to learn how the renderer functions. Any > > good resources on that besides the source code? > > Basically, none besides the source code. The large comment at the > beginning of xdisp.c should get you started. Feel free to ask > questions here, if something is unclear. > > Good luck! ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-04 22:44 ` Dmitrii Korobeinikov @ 2020-04-05 14:08 ` Adam Porter 0 siblings, 0 replies; 41+ messages in thread From: Adam Porter @ 2020-04-05 14:08 UTC (permalink / raw) To: emacs-devel FYI, I've started gathering resources about transclusion in Emacs here: https://github.com/alphapapa/transclusion-in-emacs The topic comes up frequently, and there are quite a few resources about it, but they're scattered, so this tries to collect them in one place. Patches welcome to add more links! ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-03 13:07 ` Eli Zaretskii 2020-04-04 22:44 ` Dmitrii Korobeinikov @ 2020-04-05 22:55 ` Dmitrii Korobeinikov 2020-04-10 14:45 ` Yuan Fu 1 sibling, 1 reply; 41+ messages in thread From: Dmitrii Korobeinikov @ 2020-04-05 22:55 UTC (permalink / raw) To: Eli Zaretskii; +Cc: adam, emacs-devel > https://github.com/alphapapa/transclusion-in-emacs Never knew about most of the stuff linked there, thanks for organizing this! Will make sure to send a patch if I stumble upon something not there already. PS I don't know how to reply to your message since it hasn't landed in my inbox (for it not to end up as a seperate thread), so using one of the previous messages. пт, 3 апр. 2020 г. в 19:08, Eli Zaretskii <eliz@gnu.org>: > > > From: Dmitrii Korobeinikov <dim1212k@gmail.com> > > Date: Fri, 3 Apr 2020 17:54:07 +0600 > > > > I guess I would first have to learn how the renderer functions. Any > > good resources on that besides the source code? > > Basically, none besides the source code. The large comment at the > beginning of xdisp.c should get you started. Feel free to ask > questions here, if something is unclear. > > Good luck! ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-05 22:55 ` Dmitrii Korobeinikov @ 2020-04-10 14:45 ` Yuan Fu 2020-04-10 15:35 ` Ihor Radchenko 0 siblings, 1 reply; 41+ messages in thread From: Yuan Fu @ 2020-04-10 14:45 UTC (permalink / raw) To: Dmitrii Korobeinikov; +Cc: adam, Eli Zaretskii, emacs-devel Following mode plus atomic windows seems doable. But it wouldn’t be transparent, AFAIK follow-mode needs to add special handlers for things like isearch and query-replace. OTOH, it would be much more difficult to implement in xdisp.c. I wonder if there is an intermediate layer that’s higher level than redisplay (in lisp, or at least not in redisplay) but still more or less transparent. Yuan ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 14:45 ` Yuan Fu @ 2020-04-10 15:35 ` Ihor Radchenko 2020-04-10 16:43 ` Eli Zaretskii 2020-04-10 19:09 ` Dmitrii Korobeinikov 0 siblings, 2 replies; 41+ messages in thread From: Ihor Radchenko @ 2020-04-10 15:35 UTC (permalink / raw) To: Yuan Fu, Dmitrii Korobeinikov; +Cc: adam, Eli Zaretskii, emacs-devel > Following mode plus atomic windows seems doable. But it wouldn’t be > transparent, AFAIK follow-mode needs to add special handlers for > things like isearch and query-replace. OTOH, it would be much more > difficult to implement in xdisp.c. I wonder if there is an > intermediate layer that’s higher level than redisplay (in lisp, or at > least not in redisplay) but still more or less transparent. What about extending the idea of indirect buffers? In indirect buffers, the buffer strings are associated with the same memory address storing the text (if I understand correctly). Similar thing (theoretically) can be done for individual segments of text. Indeed, there will still be a question on how the fontification is done, if the overlays should be shared, and how the key bindings should behave on such segments, but the basic functionality of automatically sharing text segments between buffers may be a good framework to start considering more complicated cases. Best, Ihor Yuan Fu <casouri@gmail.com> writes: > Following mode plus atomic windows seems doable. But it wouldn’t be transparent, AFAIK follow-mode needs to add special handlers for things like isearch and query-replace. OTOH, it would be much more difficult to implement in xdisp.c. I wonder if there is an intermediate layer that’s higher level than redisplay (in lisp, or at least not in redisplay) but still more or less transparent. > > Yuan -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yantar92@gmail.com, ihor_radchenko@alumni.sutd.edu.sg ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 15:35 ` Ihor Radchenko @ 2020-04-10 16:43 ` Eli Zaretskii 2020-04-10 17:46 ` Ihor Radchenko 2020-04-10 19:09 ` Dmitrii Korobeinikov 1 sibling, 1 reply; 41+ messages in thread From: Eli Zaretskii @ 2020-04-10 16:43 UTC (permalink / raw) To: Ihor Radchenko; +Cc: dim1212k, adam, casouri, emacs-devel > From: Ihor Radchenko <yantar92@gmail.com> > Cc: adam@alphapapa.net, Eli Zaretskii <eliz@gnu.org>, emacs-devel > <emacs-devel@gnu.org> > Date: Fri, 10 Apr 2020 23:35:12 +0800 > > What about extending the idea of indirect buffers? In indirect buffers, > the buffer strings are associated with the same memory address storing > the text (if I understand correctly). Similar thing (theoretically) can > be done for individual segments of text. I don't think I understand what you mean by "segments of text". Buffer text is just a long C array of 'char' in Emacs. ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 16:43 ` Eli Zaretskii @ 2020-04-10 17:46 ` Ihor Radchenko 2020-04-10 18:07 ` Eli Zaretskii 0 siblings, 1 reply; 41+ messages in thread From: Ihor Radchenko @ 2020-04-10 17:46 UTC (permalink / raw) To: Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > I don't think I understand what you mean by "segments of text". > Buffer text is just a long C array of 'char' in Emacs. I mean that buffer text in indirect buffer is a pointer to the first element of the C array containing the text in master buffer (or something similar). Similarly, the pointer can be created to nth element of array. Thus, "segment" of text starting from some non-zero position in the master buffer can be automatically synchronised with the master buffer. Eli Zaretskii <eliz@gnu.org> writes: >> From: Ihor Radchenko <yantar92@gmail.com> >> Cc: adam@alphapapa.net, Eli Zaretskii <eliz@gnu.org>, emacs-devel >> <emacs-devel@gnu.org> >> Date: Fri, 10 Apr 2020 23:35:12 +0800 >> >> What about extending the idea of indirect buffers? In indirect buffers, >> the buffer strings are associated with the same memory address storing >> the text (if I understand correctly). Similar thing (theoretically) can >> be done for individual segments of text. > > I don't think I understand what you mean by "segments of text". > Buffer text is just a long C array of 'char' in Emacs. -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yantar92@gmail.com, ihor_radchenko@alumni.sutd.edu.sg ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 17:46 ` Ihor Radchenko @ 2020-04-10 18:07 ` Eli Zaretskii 2020-04-10 18:37 ` Ihor Radchenko 0 siblings, 1 reply; 41+ messages in thread From: Eli Zaretskii @ 2020-04-10 18:07 UTC (permalink / raw) To: Ihor Radchenko; +Cc: dim1212k, adam, casouri, emacs-devel > From: Ihor Radchenko <yantar92@gmail.com> > Cc: casouri@gmail.com, dim1212k@gmail.com, adam@alphapapa.net, > emacs-devel@gnu.org > Date: Sat, 11 Apr 2020 01:46:59 +0800 > > > I don't think I understand what you mean by "segments of text". > > Buffer text is just a long C array of 'char' in Emacs. > > I mean that buffer text in indirect buffer is a pointer to the first > element of the C array containing the text in master buffer (or > something similar). Similarly, the pointer can be created to nth element > of array. Thus, "segment" of text starting from some non-zero position > in the master buffer can be automatically synchronised with the master > buffer. So a "segment" is a part of buffer text that starts from some offset, and then goes on until the end of the buffer text? IOW, the beginning is different, but the end is the same? If so, how is this different from narrowing in indirect buffers that we have now? ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 18:07 ` Eli Zaretskii @ 2020-04-10 18:37 ` Ihor Radchenko 2020-04-10 19:01 ` Drew Adams 2020-04-10 19:12 ` Eli Zaretskii 0 siblings, 2 replies; 41+ messages in thread From: Ihor Radchenko @ 2020-04-10 18:37 UTC (permalink / raw) To: Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > So a "segment" is a part of buffer text that starts from some offset, > and then goes on until the end of the buffer text? IOW, the beginning > is different, but the end is the same? I would rather say that "segment" is a text between two markers in an arbitrary buffer. Just like narrowing. > If so, how is this different from narrowing in indirect buffers that > we have now? The difference is that text in a single buffer must not always be coming from a single buffer (possibly narrowed), but can as well be a list of "segments". Instead of storing all the buffer text in a single char array, the buffer text could be represented by a list of "segments". In a normal buffer, this list will just contain a single element pointing to the buffer's char array containing its text. However, the list can be extended with "segments" from other buffers. Eli Zaretskii <eliz@gnu.org> writes: >> From: Ihor Radchenko <yantar92@gmail.com> >> Cc: casouri@gmail.com, dim1212k@gmail.com, adam@alphapapa.net, >> emacs-devel@gnu.org >> Date: Sat, 11 Apr 2020 01:46:59 +0800 >> >> > I don't think I understand what you mean by "segments of text". >> > Buffer text is just a long C array of 'char' in Emacs. >> >> I mean that buffer text in indirect buffer is a pointer to the first >> element of the C array containing the text in master buffer (or >> something similar). Similarly, the pointer can be created to nth element >> of array. Thus, "segment" of text starting from some non-zero position >> in the master buffer can be automatically synchronised with the master >> buffer. > > So a "segment" is a part of buffer text that starts from some offset, > and then goes on until the end of the buffer text? IOW, the beginning > is different, but the end is the same? > > If so, how is this different from narrowing in indirect buffers that > we have now? -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yantar92@gmail.com, ihor_radchenko@alumni.sutd.edu.sg ^ permalink raw reply [flat|nested] 41+ messages in thread
* RE: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 18:37 ` Ihor Radchenko @ 2020-04-10 19:01 ` Drew Adams 2020-04-10 19:19 ` Ihor Radchenko 2020-04-10 19:12 ` Eli Zaretskii 1 sibling, 1 reply; 41+ messages in thread From: Drew Adams @ 2020-04-10 19:01 UTC (permalink / raw) To: Ihor Radchenko, Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > I would rather say that "segment" is a text between two markers in an > arbitrary buffer. Just like narrowing. > > > If so, how is this different from narrowing in indirect buffers that > > we have now? > > The difference is that text in a single buffer must not always be > coming from a single buffer (possibly narrowed), but can as well be a list of > "segments". Instead of storing all the buffer text in a single char > array, the buffer text could be represented by a list of "segments". In > a normal buffer, this list will just contain a single element pointing > to the buffer's char array containing its text. However, the list can > be extended with "segments" from other buffers. FWIW, this is what library zones.el offers. The zones ("segments") in a given set of zones can be for the same buffer or different buffers. But if your question/request is about displaying text from different buffers in the same Emacs window then zones.el won't help you. See also library narrow-indirect.el. https://www.emacswiki.org/emacs/download/zones.el https://www.emacswiki.org/emacs/download/narrow-indirect.el ^ permalink raw reply [flat|nested] 41+ messages in thread
* RE: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 19:01 ` Drew Adams @ 2020-04-10 19:19 ` Ihor Radchenko 2020-04-10 20:29 ` Drew Adams 0 siblings, 1 reply; 41+ messages in thread From: Ihor Radchenko @ 2020-04-10 19:19 UTC (permalink / raw) To: Drew Adams, Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > FWIW, this is what library zones.el offers. The zones ("segments") in a given set of zones can be for the same buffer or different buffers. Thanks for the reference. I tried zones once, but abandoned exactly because I was looking for showing all zones at once (not cycling through them). > But if your question/request is about displaying text from different buffers in the same Emacs window then zones.el won't help you. Yep. Displaying and editing (with synchronised changes in those buffers). Drew Adams <drew.adams@oracle.com> writes: >> I would rather say that "segment" is a text between two markers in an >> arbitrary buffer. Just like narrowing. >> >> > If so, how is this different from narrowing in indirect buffers that >> > we have now? >> >> The difference is that text in a single buffer must not always be >> coming from a single buffer (possibly narrowed), but can as well be a list of >> "segments". Instead of storing all the buffer text in a single char >> array, the buffer text could be represented by a list of "segments". In >> a normal buffer, this list will just contain a single element pointing >> to the buffer's char array containing its text. However, the list can >> be extended with "segments" from other buffers. > > FWIW, this is what library zones.el offers. The zones ("segments") in a given set of zones can be for the same buffer or different buffers. > > But if your question/request is about displaying text from different buffers in the same Emacs window then zones.el won't help you. > > See also library narrow-indirect.el. > > https://www.emacswiki.org/emacs/download/zones.el > > https://www.emacswiki.org/emacs/download/narrow-indirect.el -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yantar92@gmail.com, ihor_radchenko@alumni.sutd.edu.sg ^ permalink raw reply [flat|nested] 41+ messages in thread
* RE: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 19:19 ` Ihor Radchenko @ 2020-04-10 20:29 ` Drew Adams 2020-04-11 8:11 ` Ihor Radchenko 0 siblings, 1 reply; 41+ messages in thread From: Drew Adams @ 2020-04-10 20:29 UTC (permalink / raw) To: Ihor Radchenko, Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > I tried zones once, but abandoned exactly > because I was looking for showing all zones at once (not cycling > through them). To be clear, there's no need to cycle among zones. No need to see only one at a time. You can see all of them all of the time, as well as see the other, non-zone text, of any and all buffers. What zones.el does not offer is showing the text of more than one buffer in the same Emacs window. > > But if your question/request is about displaying text from different > buffers in the same Emacs window then zones.el won't help you. > > Yep. Displaying and editing (with synchronised changes in those > buffers). See above. You can display and edit all zones at the same time. And there's no synchronization needed. What you can't do with zones is show and edit the text of more than one buffer in the same Emacs window. I say all of this only in case it helps somehow. My intention is not to have you use zones.el. Maybe consider this feedback as just letting you know that I, at least, don't quite understand what you're trying to do (or why). Emacs doesn't let you use the same window for multiple buffers, as far as I know. You can finagle ways to show text from multiple buffers in the same window, e.g. by copying it. And if you do that, and you then want to edit the copies, then, yes, you'll need to then sync up the original buffers with your edits. Maybe there's a library that does that for you. There are libraries that let you put different parts of the same buffer in different major modes (in effect). But that too is different from having multiple buffers in the same window. I wonder what your reason is for wanting that? That "why" might help explain your request. ^ permalink raw reply [flat|nested] 41+ messages in thread
* RE: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 20:29 ` Drew Adams @ 2020-04-11 8:11 ` Ihor Radchenko 2020-04-11 17:23 ` Drew Adams 0 siblings, 1 reply; 41+ messages in thread From: Ihor Radchenko @ 2020-04-11 8:11 UTC (permalink / raw) To: Drew Adams, Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > To be clear, there's no need to cycle among zones. > No need to see only one at a time. You can see all > of them all of the time, as well as see the other, > non-zone text, of any and all buffers. > > What zones.el does not offer is showing the text > of more than one buffer in the same Emacs window. I was not able to achieve this. Do you mean that zones located more than one screen away in the same buffer can be shown all together resulting in a narrowing with multiple zones shown one after other without text between them? > Maybe consider this feedback as just letting you > know that I, at least, don't quite understand > what you're trying to do (or why). > > Emacs doesn't let you use the same window for > multiple buffers, as far as I know. I am trying to suggest something for displaying text from multiple buffers in a single window. My idea is to modify Emacs buffer internals to achieve this. > Emacs doesn't let you use the same window for > multiple buffers, as far as I know. > > You can finagle ways to show text from multiple > buffers in the same window, e.g. by copying it. > And if you do that, and you then want to edit > the copies, then, yes, you'll need to then sync > up the original buffers with your edits. > > Maybe there's a library that does that for you. I am not aware of such library, except the one I am working on. However, any lisp level implementation is likely to slow Emacs more than if it is done on C level. > I wonder what your reason is for wanting that? > That "why" might help explain your request. I think the reasons were discussed in https://debbugs.gnu.org/cgi/bugreport.cgi?bug=35419 and popped up several times in internet: - https://github.com/alphapapa/transclusion-in-emacs/ - https://lists.gnu.org/archive/html/emacs-devel/2018-07/msg00863.html - https://www.reddit.com/r/orgmode/comments/fimdf7/nesting_many_org_source_files_into_the_same_window/ For me, the reasons are mostly related to org mode. For example, it would be cool to have the same org heading in multiple places (and be able to edit the heading from any of those places). Drew Adams <drew.adams@oracle.com> writes: >> I tried zones once, but abandoned exactly >> because I was looking for showing all zones at once (not cycling >> through them). > > To be clear, there's no need to cycle among zones. > No need to see only one at a time. You can see all > of them all of the time, as well as see the other, > non-zone text, of any and all buffers. > > What zones.el does not offer is showing the text > of more than one buffer in the same Emacs window. > >> > But if your question/request is about displaying text from different >> buffers in the same Emacs window then zones.el won't help you. >> >> Yep. Displaying and editing (with synchronised changes in those >> buffers). > > See above. You can display and edit all zones at > the same time. And there's no synchronization > needed. What you can't do with zones is show and > edit the text of more than one buffer in the same > Emacs window. > > I say all of this only in case it helps somehow. > My intention is not to have you use zones.el. > > Maybe consider this feedback as just letting you > know that I, at least, don't quite understand > what you're trying to do (or why). > > Emacs doesn't let you use the same window for > multiple buffers, as far as I know. > > You can finagle ways to show text from multiple > buffers in the same window, e.g. by copying it. > And if you do that, and you then want to edit > the copies, then, yes, you'll need to then sync > up the original buffers with your edits. > > Maybe there's a library that does that for you. > > There are libraries that let you put different > parts of the same buffer in different major > modes (in effect). But that too is different > from having multiple buffers in the same window. > > I wonder what your reason is for wanting that? > That "why" might help explain your request. -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yantar92@gmail.com, ihor_radchenko@alumni.sutd.edu.sg ^ permalink raw reply [flat|nested] 41+ messages in thread
* RE: Request for pointers and advice: displaying several buffers inside a single window 2020-04-11 8:11 ` Ihor Radchenko @ 2020-04-11 17:23 ` Drew Adams 2020-04-12 2:42 ` Richard Stallman 2020-04-12 14:25 ` Ihor Radchenko 0 siblings, 2 replies; 41+ messages in thread From: Drew Adams @ 2020-04-11 17:23 UTC (permalink / raw) To: Ihor Radchenko, Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > > To be clear, there's no need to cycle among zones. > > No need to see only one at a time. You can see all > > of them all of the time, as well as see the other, > > non-zone text, of any and all buffers. > > > > What zones.el does not offer is showing the text > > of more than one buffer in the same Emacs window. > > I was not able to achieve this. Do you mean that zones > located more than one screen away in the same buffer > can be shown all together resulting in a narrowing with > multiple zones shown one after other without text > between them? No, not exactly; not a multi-narrowing. I meant only that you need not access a zone or make it visible only by narrowing to it. Without narrowing, zones are still defined, and you can use them and act on them in an infinite number of ways. Zones are just defined areas of a buffer. But as for your question about seeing only some (or all) zones, and hiding the text between them: That's indeed possible, but it's not about narrowing. It's instead about making a set of zones (or its complement) _invisible_. For this you also need library `isearch-prop.el'. If you load that library then you can use these keys on prefix key C-x n M-=: v - isearchp-toggle-anti-zones-invisible V - isearchp-toggle-zones-invisible ~ - isearchp-toggle-complementing-domain d - isearchp-toggle-dimming-outside-search-area The first of these toggles hiding (making invisible) the complement of (the union of) the current set of zones, that is, the anti-zones. With a prefix arg it also toggles visibility of the zones themselves the other way (e.g. makes them visible when it makes the anti-zones invisible, and vice versa). Invisibility, here, is the usual Emacs invisibility of text. So for example, if you have a bunch of zones in a given buffer, and you use `C-x n M-= v', then all of the text outside those zones (the anti-zones) is made invisible (disappears). You see the zones right next to each other, with no intervening text. Repeating `C-x n M-= v' shows the anti-zones again. > > Maybe consider this feedback as just letting you > > know that I, at least, don't quite understand > > what you're trying to do (or why). > > > > Emacs doesn't let you use the same window for > > multiple buffers, as far as I know. > > I am trying to suggest something for displaying > text from multiple buffers in a single window. > My idea is to modify Emacs buffer internals > to achieve this. I understand that. > > Emacs doesn't let you use the same window for > > multiple buffers, as far as I know. > > > > You can finagle ways to show text from multiple > > buffers in the same window, e.g. by copying it. > > And if you do that, and you then want to edit > > the copies, then, yes, you'll need to then sync > > up the original buffers with your edits. > > > I wonder what your reason is for wanting that? > > That "why" might help explain your request. > > I think the reasons were discussed in ... and > popped up several times in internet... Yes, I've seen those. FWIW, I agree that being able to do arbitrary editing (e.g. search-&-replace) in such a context would be useful. That we're talking about a single window here in effect means we're talking about having a window that shows a buffer that is like an indirect buffer that refers to parts of multiple buffers. One way to think of it could be as an extension of the notion of indirect buffer. zones.el doesn't help with this. It does let you do such things for zones in the _same_ buffer. And it does let you work on sets of zones across multiple buffers. But it doesn't let you work on the latter in the same window (i.e., the same ~indirect buffer for multiple buffers). > For me, the reasons are mostly related to org > mode. For example, it would be cool to have > the same org heading in multiple places (and be > able to edit the heading from any of those places). I can see that use case. But I'd encourage people to think beyond Org mode use cases for the kind of thing being discussed. Being able to have, in effect, an indirect buffer that refers to multiple buffers is _much_ more general than any Org mode uses. (I'm saying "indirect buffer" here, but I know that indirect buffers currently are limited. They are in some ways too tightly related to their base buffers.) In a way, Org mode tries to give you some similar behavior, by delimiting buffer areas using plain-text tags (similar to what XML tags do). The approach taken by zones.el is better in this regard, I think. It defines zones only by buffer and positions (which can be markers or Lisp-readable markers). A zone is like an overlay, but it has an identifier, it can be Lisp-readable and persistent, and it can be buffer-independent (used in different buffers). Anyway, good luck with your project. I hope it will ultimately be general enough to help with _all_ of the various uses people have envisioned for acting on areas of different buffers in the same Emacs window / indirect buffer. I wouldn't like to see something that is limited to something like Org mode, or is limited to use with multiple major modes. I'd like to see something very general and flexible. ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-11 17:23 ` Drew Adams @ 2020-04-12 2:42 ` Richard Stallman 2020-04-12 5:09 ` Drew Adams 2020-04-12 23:54 ` Juri Linkov 2020-04-12 14:25 ` Ihor Radchenko 1 sibling, 2 replies; 41+ messages in thread From: Richard Stallman @ 2020-04-12 2:42 UTC (permalink / raw) To: Drew Adams; +Cc: casouri, dim1212k, yantar92, emacs-devel, adam, eliz [[[ 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. ]]] > If you load that library > then you can use these keys on prefix key C-x n M-=: > v - isearchp-toggle-anti-zones-invisible > V - isearchp-toggle-zones-invisible > ~ - isearchp-toggle-complementing-domain > d - isearchp-toggle-dimming-outside-search-area Can anyone come up with a simpler interface for this? One that reduces the amount that a user needs to memorize before using the feature? -- Dr Richard Stallman Chief GNUisance of the GNU Project (https://gnu.org) Founder, Free Software Foundation (https://fsf.org) Internet Hall-of-Famer (https://internethalloffame.org) ^ permalink raw reply [flat|nested] 41+ messages in thread
* RE: Request for pointers and advice: displaying several buffers inside a single window 2020-04-12 2:42 ` Richard Stallman @ 2020-04-12 5:09 ` Drew Adams 2020-04-12 5:15 ` Drew Adams 2020-04-13 2:21 ` Richard Stallman 2020-04-12 23:54 ` Juri Linkov 1 sibling, 2 replies; 41+ messages in thread From: Drew Adams @ 2020-04-12 5:09 UTC (permalink / raw) To: rms; +Cc: casouri, dim1212k, yantar92, emacs-devel, adam, eliz > > If you load that library then you can use > > these keys on prefix key C-x n M-=: > > > > v - isearchp-toggle-anti-zones-invisible > > V - isearchp-toggle-zones-invisible > > ~ - isearchp-toggle-complementing-domain > > d - isearchp-toggle-dimming-outside-search-area > > Can anyone come up with a simpler interface for this? > One that reduces the amount that a user needs to memorize > before using the feature? You don't need to memorize anything. And certainly not in order to be able to use the feature. The predefined keys are just for convenience. And you can bind any of the commands to whatever keys you like. By default, the zone commands are on prefix key `C-x n', which Emacs uses for narrowing commands (Emacs binds it to keymap `narrow-map'). (If you use isearch-prop.el or highlight.el then zones.el adds additional zone commands to the same keymap.) I chose that keymap and prefix key for zones mainly because zones.el optionally advises the standard narrowing commands (`narrow-region' etc.), so they automatically add a narrowing (restriction) as a zone. (You can then cycle among restrictions etc.) But you can use any other keymap or prefix key. I decided to put all of the toggle commands for use with zones on keymap `zz-toggles-map'. And I put that map on prefix key `M-=' in `narrow-map'. But you can use a different prefix key for that map, or ignore it. If you do want to use the predefined bindings, and you don't remember some, using either `C-x n C-h' or `C-h M-k narrow-map' (`describe-keymap') tells you: narrow-map ---------- Keymap for narrowing commands. key binding --- ------- C-d zz-delete-zone C-r isearchp-zones-backward C-s isearchp-zones-forward ESC Prefix Command # zz-select-zone-by-id-and-text A zz-add-zone-and-unite C zz-clone-and-unite-zones D isearchp-remove-dimming H hlt-highlight-regions-in-buffers L zz-set-zones-from-highlighting P isearchp-put-prop-on-zones R zz-set-zones-matching-regexp a zz-add-zone c zz-clone-zones d narrow-to-defun h hlt-highlight-regions l zz-add-zones-from-highlighting n narrow-to-region p narrow-to-page r zz-add-zones-matching-regexp s zz-select-zone-repeat u zz-unite-zones v zz-set-izones-var w widen x zz-narrow-repeat C-M-r isearchp-zones-backward-regexp C-M-s isearchp-zones-forward-regexp M-% zz-query-replace-zones M-= zz-toggles-map C-M-% zz-query-replace-regexp-zones M-= V isearchp-toggle-zones-invisible M-= d isearchp-toggle-dimming-outside-search-area M-= v isearchp-toggle-anti-zones-invisible M-= ~ isearchp-toggle-complementing-domain ^ permalink raw reply [flat|nested] 41+ messages in thread
* RE: Request for pointers and advice: displaying several buffers inside a single window 2020-04-12 5:09 ` Drew Adams @ 2020-04-12 5:15 ` Drew Adams 2020-04-13 2:21 ` Richard Stallman 1 sibling, 0 replies; 41+ messages in thread From: Drew Adams @ 2020-04-12 5:15 UTC (permalink / raw) To: rms; +Cc: casouri, dim1212k, yantar92, emacs-devel, adam, eliz I meant to include links to these Emacs-Wiki pages, which describe the keys/commands a bit and the relation to narrowing. https://www.emacswiki.org/emacs/Zones https://www.emacswiki.org/emacs/MultipleNarrowings ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-12 5:09 ` Drew Adams 2020-04-12 5:15 ` Drew Adams @ 2020-04-13 2:21 ` Richard Stallman 2020-04-13 5:23 ` Drew Adams 1 sibling, 1 reply; 41+ messages in thread From: Richard Stallman @ 2020-04-13 2:21 UTC (permalink / raw) To: Drew Adams; +Cc: casouri, dim1212k, yantar92, emacs-devel, adam, eliz [[[ 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. ]]] > You don't need to memorize anything. And certainly > not in order to be able to use the feature. The > predefined keys are just for convenience. > And you can bind any of the commands to whatever > keys you like. I think we are miscommunicating. All Emacs key bindings are "just for convenience" and each user can rebind them. Notwithstanding that, it is important for default bindings to be convenient. C-x n M-= v is not going to be easy to remember. If a command is worth giving a key binding to, can someone propose a more convenient default binding? -- Dr Richard Stallman Chief GNUisance of the GNU Project (https://gnu.org) Founder, Free Software Foundation (https://fsf.org) Internet Hall-of-Famer (https://internethalloffame.org) ^ permalink raw reply [flat|nested] 41+ messages in thread
* RE: Request for pointers and advice: displaying several buffers inside a single window 2020-04-13 2:21 ` Richard Stallman @ 2020-04-13 5:23 ` Drew Adams 0 siblings, 0 replies; 41+ messages in thread From: Drew Adams @ 2020-04-13 5:23 UTC (permalink / raw) To: rms; +Cc: casouri, dim1212k, yantar92, emacs-devel, adam, eliz >> You don't need to memorize anything. And certainly >> not in order to be able to use the feature. The >> predefined keys are just for convenience. > >> And you can bind any of the commands to whatever >> keys you like. > > I think we are miscommunicating. All Emacs key bindings are "just for > convenience" and each user can rebind them. Notwithstanding that, it > is important for default bindings to be convenient. C-x n M-= v is > not going to be easy to remember. If a command is worth giving a key > binding to, can someone propose a more convenient default binding? I'm the one who decided that the commands are worth giving key bindings to. I believe it's convenient enough to put all zone keys on `narrow-map', and I believe it's convenient enough to put all toggle commands for zones on their own keymap, and to put that on `narrow-map'. Putting the toggle keys on their own map makes it easy for someone to move them, together, to another prefix key. Putting all zone keys on an _existing_ prefix key means saving another prefix key for some other use. `narrow-map' makes sense for that, because it's about multiple different buffer areas: ~zones. Where we may be miscommunicating is perhaps that it's up to me to decide which keys I think best to predefine for zones.el and isearch-prop.el. I'm quite open to user feedback, including about predefined key bindings. But I'm not convinced by the argument that `C-x n M-=' shouldn't be used as a default prefix key because it's not convenient. My priorities here are not just for quick keys or individually memorable keys. I expect users to pick their own keys for that, if they like, based on their use. My priorities for this are instead: 1. Group all zone keys on a prefix key. 2. Don't waste a new prefix key - use existing key. 2. Use `C-x n', because: (a) it's relevant - logical association between zones and buffer restrictions (b) it doesn't already have many keys on it 3. Group the toggle keys on their own prefix key (which is on `C-x n'). #2 and #3 do help memory, but for key _groups_, not for individual keys. For individual toggle keys there are also mnemonics: `v', `V' for visibility toggles `~' ("not") for complementing the domain `d' for dimming Similarly for the other zone keys, these mnemonics: `#' for selecting zones by ID number `a', `A' for adding zones `c', `C' for cloning zones `C-d' for deleting zones from the current zones set `D' for deleting text-dimming `h', `H' for highlighting zones `l', `L' for adding/setting zones from (high)lighting `P' for property-putting on zones `r', `R' for adding/setting zones from regexp matches `s' for selecting zones as the region `u' for uniting (coalescing) zones `v' for changing the current zones variable And these, which follow the usual search keys: `C-s', `C-M-s', `C-r', `C-M-r' for search `M-%', `C-M-%' for query-replace The one key that's not really mnemonic, but which gets used a lot, is `x', which cycles among narrowings (`C-x n x x x...). I would have picked `n' for that, which _is_ mnemonic, but that's already `narrow-to-region' (not especially mnemonic within the set of narrowing keys, but it was perhaps the first such). I picked `D' for dimming because `d' was already `narrow-to-defun'. I picked `P' for property-putting because `p' was already `narrow-to-page'. ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-12 2:42 ` Richard Stallman 2020-04-12 5:09 ` Drew Adams @ 2020-04-12 23:54 ` Juri Linkov 2020-04-13 5:23 ` Drew Adams 1 sibling, 1 reply; 41+ messages in thread From: Juri Linkov @ 2020-04-12 23:54 UTC (permalink / raw) To: Richard Stallman Cc: casouri, dim1212k, yantar92, emacs-devel, adam, eliz, Drew Adams > > v - isearchp-toggle-anti-zones-invisible > > V - isearchp-toggle-zones-invisible > > ~ - isearchp-toggle-complementing-domain > > d - isearchp-toggle-dimming-outside-search-area > > Can anyone come up with a simpler interface for this? > One that reduces the amount that a user needs to memorize > before using the feature? Isearch keybindings could be on the M-s prefix key. query-replace already supports zones (as a subset of rectangular regions), so isearch could as well. ^ permalink raw reply [flat|nested] 41+ messages in thread
* RE: Request for pointers and advice: displaying several buffers inside a single window 2020-04-12 23:54 ` Juri Linkov @ 2020-04-13 5:23 ` Drew Adams 0 siblings, 0 replies; 41+ messages in thread From: Drew Adams @ 2020-04-13 5:23 UTC (permalink / raw) To: Juri Linkov, Richard Stallman Cc: casouri, dim1212k, yantar92, emacs-devel, adam, eliz > > > v - isearchp-toggle-anti-zones-invisible > > > V - isearchp-toggle-zones-invisible > > > ~ - isearchp-toggle-complementing-domain > > > d - isearchp-toggle-dimming-outside-search-area > > > > Can anyone come up with a simpler interface for this? > > One that reduces the amount that a user needs to memorize > > before using the feature? > > Isearch keybindings could be on the M-s prefix key. Kind of you to worry about this. But the library that defines those toggle commands, isearch-prop.el, already binds the two non-zone ones to keys in `isearch-mode-map': (define-key isearch-mode-map (kbd "C-M-~") 'isearchp-toggle-complementing-domain) (define-key isearch-mode-map (kbd "C-M-S-d") 'isearchp-toggle-dimming-outside-search-area) Those two commands are not only for zones. They apply also to search, so they deserve `isearch-mode-map' keys. I gave them bindings in the zones toggle keymap because they're also useful for zones, not just for searching. Both sets of bindings are useful. (Dimming the areas outside zones and dimming the areas not being searched have the same behavior. I defined it first for searching, which is why its toggle command still has the name `...outside-search-area'. Maybe I should rename it.) Yes, I'm the one who decided which of the zones.el and isearch-prop.el commands deserve keys, and in which maps. ^ permalink raw reply [flat|nested] 41+ messages in thread
* RE: Request for pointers and advice: displaying several buffers inside a single window 2020-04-11 17:23 ` Drew Adams 2020-04-12 2:42 ` Richard Stallman @ 2020-04-12 14:25 ` Ihor Radchenko 2020-04-12 16:38 ` Drew Adams 1 sibling, 1 reply; 41+ messages in thread From: Ihor Radchenko @ 2020-04-12 14:25 UTC (permalink / raw) To: Drew Adams, Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > But as for your question about seeing only some (or > all) zones, and hiding the text between them: That's > indeed possible, but it's not about narrowing. Got it. > It's instead about making a set of zones (or its > complement) _invisible_. For this you also need > library `isearch-prop.el'. If you load that library > then you can use these keys on prefix key C-x n M-=: I missed it when reading commentary. Probably because I was mostly looking at key bindings part. I guess that it would be helpful to add these key bindings to **Keys** section of the commentary, similarly to highlight.el-related bindings. > I can see that use case. But I'd encourage > people to think beyond Org mode use cases for > the kind of thing being discussed. Being able > to have, in effect, an indirect buffer that > refers to multiple buffers is _much_ more > general than any Org mode uses. I agree that the discussed concept can be used far beyond org-mode scope. (Otherwise, there would be little reason to discuss adding it to Emacs core.) I just shared my personal use case (in addition to the provided links). > Anyway, good luck with your project. I hope > it will ultimately be general enough to help > with _all_ of the various uses people have > envisioned for acting on areas of different > buffers in the same Emacs window / indirect > buffer. I wouldn't like to see something that > is limited to something like Org mode, or is > limited to use with multiple major modes. I'd > like to see something very general and flexible. FYI, my pre-alpha implementation of synchronised text is in github (https://github.com/yantar92/mirror-text). If you (or anyone else in the thread) is interested, feedback is welcome. Drew Adams <drew.adams@oracle.com> writes: >> > To be clear, there's no need to cycle among zones. >> > No need to see only one at a time. You can see all >> > of them all of the time, as well as see the other, >> > non-zone text, of any and all buffers. >> > >> > What zones.el does not offer is showing the text >> > of more than one buffer in the same Emacs window. >> >> I was not able to achieve this. Do you mean that zones >> located more than one screen away in the same buffer >> can be shown all together resulting in a narrowing with >> multiple zones shown one after other without text >> between them? > > No, not exactly; not a multi-narrowing. > > I meant only that you need not access a zone or > make it visible only by narrowing to it. Without > narrowing, zones are still defined, and you can use > them and act on them in an infinite number of ways. > Zones are just defined areas of a buffer. > > But as for your question about seeing only some (or > all) zones, and hiding the text between them: That's > indeed possible, but it's not about narrowing. > > It's instead about making a set of zones (or its > complement) _invisible_. For this you also need > library `isearch-prop.el'. If you load that library > then you can use these keys on prefix key C-x n M-=: > > v - isearchp-toggle-anti-zones-invisible > V - isearchp-toggle-zones-invisible > ~ - isearchp-toggle-complementing-domain > d - isearchp-toggle-dimming-outside-search-area > > The first of these toggles hiding (making invisible) > the complement of (the union of) the current set of > zones, that is, the anti-zones. > > With a prefix arg it also toggles visibility of the > zones themselves the other way (e.g. makes them > visible when it makes the anti-zones invisible, and > vice versa). > > Invisibility, here, is the usual Emacs invisibility > of text. > > So for example, if you have a bunch of zones in a > given buffer, and you use `C-x n M-= v', then all > of the text outside those zones (the anti-zones) > is made invisible (disappears). You see the zones > right next to each other, with no intervening text. Repeating `C-x n M-= v' shows the anti-zones again. > >> > Maybe consider this feedback as just letting you >> > know that I, at least, don't quite understand >> > what you're trying to do (or why). >> > >> > Emacs doesn't let you use the same window for >> > multiple buffers, as far as I know. >> >> I am trying to suggest something for displaying >> text from multiple buffers in a single window. >> My idea is to modify Emacs buffer internals >> to achieve this. > > I understand that. > >> > Emacs doesn't let you use the same window for >> > multiple buffers, as far as I know. >> > >> > You can finagle ways to show text from multiple >> > buffers in the same window, e.g. by copying it. >> > And if you do that, and you then want to edit >> > the copies, then, yes, you'll need to then sync >> > up the original buffers with your edits. >> >> > I wonder what your reason is for wanting that? >> > That "why" might help explain your request. >> >> I think the reasons were discussed in ... and >> popped up several times in internet... > > Yes, I've seen those. > > FWIW, I agree that being able to do arbitrary > editing (e.g. search-&-replace) in such a > context would be useful. > > That we're talking about a single window here > in effect means we're talking about having a > window that shows a buffer that is like an > indirect buffer that refers to parts of > multiple buffers. One way to think of it > could be as an extension of the notion of > indirect buffer. > > zones.el doesn't help with this. It does let > you do such things for zones in the _same_ > buffer. And it does let you work on sets of > zones across multiple buffers. But it doesn't > let you work on the latter in the same window > (i.e., the same ~indirect buffer for multiple > buffers). > >> For me, the reasons are mostly related to org >> mode. For example, it would be cool to have >> the same org heading in multiple places (and be >> able to edit the heading from any of those places). > > I can see that use case. But I'd encourage > people to think beyond Org mode use cases for > the kind of thing being discussed. Being able > to have, in effect, an indirect buffer that > refers to multiple buffers is _much_ more > general than any Org mode uses. > > (I'm saying "indirect buffer" here, but I > know that indirect buffers currently are > limited. They are in some ways too tightly > related to their base buffers.) > > In a way, Org mode tries to give you some > similar behavior, by delimiting buffer areas > using plain-text tags (similar to what XML > tags do). > > The approach taken by zones.el is better in > this regard, I think. It defines zones only > by buffer and positions (which can be markers > or Lisp-readable markers). A zone is like an > overlay, but it has an identifier, it can be > Lisp-readable and persistent, and it can be > buffer-independent (used in different buffers). > > Anyway, good luck with your project. I hope > it will ultimately be general enough to help > with _all_ of the various uses people have > envisioned for acting on areas of different > buffers in the same Emacs window / indirect > buffer. I wouldn't like to see something that > is limited to something like Org mode, or is > limited to use with multiple major modes. I'd > like to see something very general and flexible. -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yantar92@gmail.com, ihor_radchenko@alumni.sutd.edu.sg ^ permalink raw reply [flat|nested] 41+ messages in thread
* RE: Request for pointers and advice: displaying several buffers inside a single window 2020-04-12 14:25 ` Ihor Radchenko @ 2020-04-12 16:38 ` Drew Adams 0 siblings, 0 replies; 41+ messages in thread From: Drew Adams @ 2020-04-12 16:38 UTC (permalink / raw) To: Ihor Radchenko, Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > > It's instead about making a set of zones (or its > > complement) _invisible_. For this you also need > > library `isearch-prop.el'. If you load that library > > then you can use these keys on prefix key C-x n M-=: > > I missed it when reading commentary. Probably because I was mostly > looking at key bindings part. I guess that it would be helpful to add > these key bindings to **Keys** section of the commentary, similarly to > highlight.el-related bindings. Thanks for that reminder. I'll do that. Some other bindings were also missing from that list. > FYI, my pre-alpha implementation of synchronised text is in github > (https://urldefense.com/v3/__https://github.com/yantar92/mirror- > text__;!!GqivPVa7Brio!NAEaJYE8jQeeMRKcdlSgwbLH9MHO7fBjwT6Ut37aw2uL39Bao > pDCQxxPeOErp4Sy$ ). If you (or anyone else in the > thread) is interested, feedback is welcome. Thanks. I'll take a look. ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 18:37 ` Ihor Radchenko 2020-04-10 19:01 ` Drew Adams @ 2020-04-10 19:12 ` Eli Zaretskii 2020-04-10 19:25 ` Ihor Radchenko 2020-04-10 19:34 ` Ihor Radchenko 1 sibling, 2 replies; 41+ messages in thread From: Eli Zaretskii @ 2020-04-10 19:12 UTC (permalink / raw) To: Ihor Radchenko; +Cc: dim1212k, adam, casouri, emacs-devel > From: Ihor Radchenko <yantar92@gmail.com> > Cc: casouri@gmail.com, dim1212k@gmail.com, adam@alphapapa.net, > emacs-devel@gnu.org > Date: Sat, 11 Apr 2020 02:37:13 +0800 > > > So a "segment" is a part of buffer text that starts from some offset, > > and then goes on until the end of the buffer text? IOW, the beginning > > is different, but the end is the same? > > I would rather say that "segment" is a text between two markers in an > arbitrary buffer. So there's one more parameter, in addition to the offset? > > If so, how is this different from narrowing in indirect buffers that > > we have now? > > The difference is that text in a single buffer must not always be coming > from a single buffer (possibly narrowed), but can as well be a list of > "segments". Instead of storing all the buffer text in a single char > array, the buffer text could be represented by a list of "segments". In > a normal buffer, this list will just contain a single element pointing > to the buffer's char array containing its text. However, the list can be > extended with "segments" from other buffers. Sounds like a thorough surgery of all the low-level functions that handle insertion, deletion, replacement etc. And what do you suggest to do with the gap? ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 19:12 ` Eli Zaretskii @ 2020-04-10 19:25 ` Ihor Radchenko 2020-04-10 19:34 ` Ihor Radchenko 1 sibling, 0 replies; 41+ messages in thread From: Ihor Radchenko @ 2020-04-10 19:25 UTC (permalink / raw) To: Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > So there's one more parameter, in addition to the offset? Sure, there should be at least two parameters to define segment. I am thinking aloud here. Started with rough idea. I think Dmitrii just described similar approach and also did some source code lookup. > Sounds like a thorough surgery of all the low-level functions that > handle insertion, deletion, replacement etc. Yeah. Also, regions, markers, and point motion. Eli Zaretskii <eliz@gnu.org> writes: >> From: Ihor Radchenko <yantar92@gmail.com> >> Cc: casouri@gmail.com, dim1212k@gmail.com, adam@alphapapa.net, >> emacs-devel@gnu.org >> Date: Sat, 11 Apr 2020 02:37:13 +0800 >> >> > So a "segment" is a part of buffer text that starts from some offset, >> > and then goes on until the end of the buffer text? IOW, the beginning >> > is different, but the end is the same? >> >> I would rather say that "segment" is a text between two markers in an >> arbitrary buffer. > > So there's one more parameter, in addition to the offset? > >> > If so, how is this different from narrowing in indirect buffers that >> > we have now? >> >> The difference is that text in a single buffer must not always be coming >> from a single buffer (possibly narrowed), but can as well be a list of >> "segments". Instead of storing all the buffer text in a single char >> array, the buffer text could be represented by a list of "segments". In >> a normal buffer, this list will just contain a single element pointing >> to the buffer's char array containing its text. However, the list can be >> extended with "segments" from other buffers. > > Sounds like a thorough surgery of all the low-level functions that > handle insertion, deletion, replacement etc. > > And what do you suggest to do with the gap? -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yantar92@gmail.com, ihor_radchenko@alumni.sutd.edu.sg ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 19:12 ` Eli Zaretskii 2020-04-10 19:25 ` Ihor Radchenko @ 2020-04-10 19:34 ` Ihor Radchenko 2020-04-11 7:34 ` Eli Zaretskii 1 sibling, 1 reply; 41+ messages in thread From: Ihor Radchenko @ 2020-04-10 19:34 UTC (permalink / raw) To: Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > And what do you suggest to do with the gap? This is where the buffer text is stored internally right? I think a "segment" may as well refer to a substring from the gap. In the simplest case the list of "segments" would contain a single element referring to the whole gap. Then, if one adds another "segment", the list will hold 3 elements: (<segment from beginning of the gap to pos> <added segment> <segment referring to the remaining part of the gap>). Eli Zaretskii <eliz@gnu.org> writes: >> From: Ihor Radchenko <yantar92@gmail.com> >> Cc: casouri@gmail.com, dim1212k@gmail.com, adam@alphapapa.net, >> emacs-devel@gnu.org >> Date: Sat, 11 Apr 2020 02:37:13 +0800 >> >> > So a "segment" is a part of buffer text that starts from some offset, >> > and then goes on until the end of the buffer text? IOW, the beginning >> > is different, but the end is the same? >> >> I would rather say that "segment" is a text between two markers in an >> arbitrary buffer. > > So there's one more parameter, in addition to the offset? > >> > If so, how is this different from narrowing in indirect buffers that >> > we have now? >> >> The difference is that text in a single buffer must not always be coming >> from a single buffer (possibly narrowed), but can as well be a list of >> "segments". Instead of storing all the buffer text in a single char >> array, the buffer text could be represented by a list of "segments". In >> a normal buffer, this list will just contain a single element pointing >> to the buffer's char array containing its text. However, the list can be >> extended with "segments" from other buffers. > > Sounds like a thorough surgery of all the low-level functions that > handle insertion, deletion, replacement etc. > > And what do you suggest to do with the gap? -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yantar92@gmail.com, ihor_radchenko@alumni.sutd.edu.sg ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 19:34 ` Ihor Radchenko @ 2020-04-11 7:34 ` Eli Zaretskii 2020-04-11 8:35 ` Ihor Radchenko 0 siblings, 1 reply; 41+ messages in thread From: Eli Zaretskii @ 2020-04-11 7:34 UTC (permalink / raw) To: Ihor Radchenko; +Cc: dim1212k, adam, casouri, emacs-devel > From: Ihor Radchenko <yantar92@gmail.com> > Cc: casouri@gmail.com, dim1212k@gmail.com, adam@alphapapa.net, > emacs-devel@gnu.org > Date: Sat, 11 Apr 2020 03:34:30 +0800 > > > And what do you suggest to do with the gap? > > This is where the buffer text is stored internally right? That's not the definition I'd use. The gap is a way of making text insertion less expensive. If you insert characters one by one, each insertion needs to move the characters after the insertion point, which is expensive. Having the gap allows us to perform this movement only after relatively large amounts of text were inserted; for smaller insertions we just make the gap smaller. > I think a > "segment" may as well refer to a substring from the gap. In the simplest > case the list of "segments" would contain a single element referring to > the whole gap. Then, if one adds another "segment", the list will hold 3 > elements: (<segment from beginning of the gap to pos> <added segment> > <segment referring to the remaining part of the gap>). My question was how you handle insertion in a segment? Move the gap to the segment, or have a separate gap for each segment? ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-11 7:34 ` Eli Zaretskii @ 2020-04-11 8:35 ` Ihor Radchenko 2020-04-11 9:25 ` Eli Zaretskii 0 siblings, 1 reply; 41+ messages in thread From: Ihor Radchenko @ 2020-04-11 8:35 UTC (permalink / raw) To: Eli Zaretskii; +Cc: dim1212k, adam, casouri, emacs-devel > That's not the definition I'd use. The gap is a way of making text > insertion less expensive. If you insert characters one by one, each > insertion needs to move the characters after the insertion point, > which is expensive. Having the gap allows us to perform this movement > only after relatively large amounts of text were inserted; for smaller > insertions we just make the gap smaller. Do you mean that the gap is specially allocated memory space associated with buffer point where you can insert characters without a need to shift the tail of the char array containing buffer string? > My question was how you handle insertion in a segment? Move the gap > to the segment, or have a separate gap for each segment? A segment could mean two thing as I imagine: (1) pointer to original char array associated with current buffer. you can think about it as about narrowed buffer for current buffer implementation; (2) a pair of markers in different buffer. The second type of segment may refer to a char array in different buffer (just like case (1), but the char array from different buffer). Alternatively, it may refer to several other segments (if other buffer contains several segments between the markers). The last case can be reduced to a list of char arrays in different buffers. If we think about insertion, the point may be within a single segment or just between two segments. If it is within a single segment, we can identify (maybe recursively) what is the basic char array corresponding to the point. The gap will be that gap associated with that char array. In the other case, when the point is in between two segments, it narrows down to point position between two char arrays. One of this arrays (and the associated gap) will be selected depending on some criteria (maybe, something similar to what we have for overlays/sticky text properties). I hope that my explanation is clear enough. Eli Zaretskii <eliz@gnu.org> writes: >> From: Ihor Radchenko <yantar92@gmail.com> >> Cc: casouri@gmail.com, dim1212k@gmail.com, adam@alphapapa.net, >> emacs-devel@gnu.org >> Date: Sat, 11 Apr 2020 03:34:30 +0800 >> >> > And what do you suggest to do with the gap? >> >> This is where the buffer text is stored internally right? > > That's not the definition I'd use. The gap is a way of making text > insertion less expensive. If you insert characters one by one, each > insertion needs to move the characters after the insertion point, > which is expensive. Having the gap allows us to perform this movement > only after relatively large amounts of text were inserted; for smaller > insertions we just make the gap smaller. > >> I think a >> "segment" may as well refer to a substring from the gap. In the simplest >> case the list of "segments" would contain a single element referring to >> the whole gap. Then, if one adds another "segment", the list will hold 3 >> elements: (<segment from beginning of the gap to pos> <added segment> >> <segment referring to the remaining part of the gap>). > > My question was how you handle insertion in a segment? Move the gap > to the segment, or have a separate gap for each segment? -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yantar92@gmail.com, ihor_radchenko@alumni.sutd.edu.sg ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-11 8:35 ` Ihor Radchenko @ 2020-04-11 9:25 ` Eli Zaretskii 0 siblings, 0 replies; 41+ messages in thread From: Eli Zaretskii @ 2020-04-11 9:25 UTC (permalink / raw) To: Ihor Radchenko; +Cc: dim1212k, adam, casouri, emacs-devel > From: Ihor Radchenko <yantar92@gmail.com> > Cc: casouri@gmail.com, dim1212k@gmail.com, adam@alphapapa.net, > emacs-devel@gnu.org > Date: Sat, 11 Apr 2020 16:35:58 +0800 > > > That's not the definition I'd use. The gap is a way of making text > > insertion less expensive. If you insert characters one by one, each > > insertion needs to move the characters after the insertion point, > > which is expensive. Having the gap allows us to perform this movement > > only after relatively large amounts of text were inserted; for smaller > > insertions we just make the gap smaller. > > Do you mean that the gap is specially allocated memory space associated > with buffer point where you can insert characters without a need to > shift the tail of the char array containing buffer string? Yes. Except that point doesn't need to be at that place, because we can insert at position that is not necessarily that of point; we move the gap to the insertion place when we need. ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 15:35 ` Ihor Radchenko 2020-04-10 16:43 ` Eli Zaretskii @ 2020-04-10 19:09 ` Dmitrii Korobeinikov 2020-04-11 0:05 ` chad 2020-04-11 7:30 ` Eli Zaretskii 1 sibling, 2 replies; 41+ messages in thread From: Dmitrii Korobeinikov @ 2020-04-10 19:09 UTC (permalink / raw) To: Ihor Radchenko; +Cc: adam, Yuan Fu, Eli Zaretskii, emacs-devel > Following mode plus atomic windows seems doable. But it wouldn’t be > transparent, AFAIK follow-mode needs to add special handlers for > things like isearch and query-replace. OTOH, it would be much more > difficult to implement in xdisp.c. I wonder if there is an > intermediate layer that’s higher level than redisplay (in lisp, or at > least not in redisplay) but still more or less transparent. I have come to the conclusion that extending the underlying data structure for the storage is unavoidable and, really, the simplest + most efficient method to achieve transclusion / islands / seamless mode regions / buffer lenses / whatever, and to avoid having to deal with a whole lotta bugs, corner cases and synchronization trickery. Emacs uses gap buffer for storing text (a c array with some semantics, basically). What I have in mind is to keep it that way, but to have a list of references to other buffers along with their intended positions. From what I saw, there's not a unified core interface on top of that c array. So, would need to modify each place that makes a use of it. (for a couple of examples, see text_outside_line_unchanged_p in xdisp.c, looking_at_1 in search.c) I tried to eyeball the effected landscape by looking at where GPT (position of the gap) is referenced. There are 287 occurences of GPT in the src directory, most of them are in buffer.c, buffer.h, insdel.c. The distribution is: coding.c(24), syntax.c(10), changelog(17), xdisp(8), insdel(131), buffer(35), editfns/fns/w32xfns(11), search(7), marker(6), xml(1), charset(3), composite(3), decompress(1), pdumper(1), process(1), character(3), json(1), fileio(11), indent(3), sysdep(2). The good news is: I believe xdisp.c wouldn't have to be modified all that much if the regions are enforced to start on different lines. This whole ordeal could easily take a few months. I, unfortunately, am unlikely to find the time to do it this year. PS A possibly useful outcome of this is the possibility to mitigate extremely long gap motions by breaking up a big buffer into several smaller ones. пт, 10 апр. 2020 г. в 21:38, Ihor Radchenko <yantar92@gmail.com>: > > > Following mode plus atomic windows seems doable. But it wouldn’t be > > transparent, AFAIK follow-mode needs to add special handlers for > > things like isearch and query-replace. OTOH, it would be much more > > difficult to implement in xdisp.c. I wonder if there is an > > intermediate layer that’s higher level than redisplay (in lisp, or at > > least not in redisplay) but still more or less transparent. > > What about extending the idea of indirect buffers? In indirect buffers, > the buffer strings are associated with the same memory address storing > the text (if I understand correctly). Similar thing (theoretically) can > be done for individual segments of text. Indeed, there will still be a > question on how the fontification is done, if the overlays should be > shared, and how the key bindings should behave on such segments, but the > basic functionality of automatically sharing text segments between > buffers may be a good framework to start considering more complicated > cases. > > Best, > Ihor > > Yuan Fu <casouri@gmail.com> writes: > > > Following mode plus atomic windows seems doable. But it wouldn’t be transparent, AFAIK follow-mode needs to add special handlers for things like isearch and query-replace. OTOH, it would be much more difficult to implement in xdisp.c. I wonder if there is an intermediate layer that’s higher level than redisplay (in lisp, or at least not in redisplay) but still more or less transparent. > > > > Yuan > > -- > Ihor Radchenko, > PhD, > Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) > State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China > Email: yantar92@gmail.com, ihor_radchenko@alumni.sutd.edu.sg ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 19:09 ` Dmitrii Korobeinikov @ 2020-04-11 0:05 ` chad 2020-04-11 8:22 ` Eli Zaretskii 2020-04-11 7:30 ` Eli Zaretskii 1 sibling, 1 reply; 41+ messages in thread From: chad @ 2020-04-11 0:05 UTC (permalink / raw) To: Dmitrii Korobeinikov Cc: Adam Porter, Yuan Fu, Eli Zaretskii, Ihor Radchenko, emacs-devel [-- Attachment #1: Type: text/plain, Size: 4855 bytes --] These are deep potential changes to emacs, but reading it today reminded me of an article I read recently from the people who implement VS Code: https://code.visualstudio.com/blogs/2018/03/23/text-buffer-reimplementation This article describes a series of choices, revisions, and reasoning leading up to VS Code's internal representation of the buffer text. In particular, the way the found and added caching of line starts seemed like something that could help emacs' problems with very long lines, and perhaps also the concerns with parsing large files for highlighting and indenting. ~Chad On Fri, Apr 10, 2020 at 12:10 PM Dmitrii Korobeinikov <dim1212k@gmail.com> wrote: > > Following mode plus atomic windows seems doable. But it wouldn’t be > > transparent, AFAIK follow-mode needs to add special handlers for > > things like isearch and query-replace. OTOH, it would be much more > > difficult to implement in xdisp.c. I wonder if there is an > > intermediate layer that’s higher level than redisplay (in lisp, or at > > least not in redisplay) but still more or less transparent. > > I have come to the conclusion that extending the underlying data > structure for the storage is unavoidable and, really, the simplest + > most efficient method to achieve transclusion / islands / seamless > mode regions / buffer lenses / whatever, and to avoid having to deal > with a whole lotta bugs, corner cases and synchronization trickery. > > Emacs uses gap buffer for storing text (a c array with some semantics, > basically). What I have in mind is to keep it that way, but to have a > list of references to other buffers along with their intended > positions. > > From what I saw, there's not a unified core interface on top of that c > array. So, would need to modify each place that makes a use of it. > (for a couple of examples, see text_outside_line_unchanged_p in > xdisp.c, looking_at_1 in search.c) > > I tried to eyeball the effected landscape by looking at where GPT > (position of the gap) is referenced. There are 287 occurences of GPT > in the src directory, most of them are in buffer.c, buffer.h, > insdel.c. The distribution is: coding.c(24), syntax.c(10), > changelog(17), xdisp(8), insdel(131), buffer(35), > editfns/fns/w32xfns(11), search(7), marker(6), xml(1), charset(3), > composite(3), decompress(1), pdumper(1), process(1), character(3), > json(1), fileio(11), indent(3), sysdep(2). > > The good news is: I believe xdisp.c wouldn't have to be modified all > that much if the regions are enforced to start on different lines. > > This whole ordeal could easily take a few months. I, unfortunately, am > unlikely to find the time to do it this year. > > PS A possibly useful outcome of this is the possibility to mitigate > extremely long gap motions by breaking up a big buffer into several > smaller ones. > > пт, 10 апр. 2020 г. в 21:38, Ihor Radchenko <yantar92@gmail.com>: > > > > > Following mode plus atomic windows seems doable. But it wouldn’t be > > > transparent, AFAIK follow-mode needs to add special handlers for > > > things like isearch and query-replace. OTOH, it would be much more > > > difficult to implement in xdisp.c. I wonder if there is an > > > intermediate layer that’s higher level than redisplay (in lisp, or at > > > least not in redisplay) but still more or less transparent. > > > > What about extending the idea of indirect buffers? In indirect buffers, > > the buffer strings are associated with the same memory address storing > > the text (if I understand correctly). Similar thing (theoretically) can > > be done for individual segments of text. Indeed, there will still be a > > question on how the fontification is done, if the overlays should be > > shared, and how the key bindings should behave on such segments, but the > > basic functionality of automatically sharing text segments between > > buffers may be a good framework to start considering more complicated > > cases. > > > > Best, > > Ihor > > > > Yuan Fu <casouri@gmail.com> writes: > > > > > Following mode plus atomic windows seems doable. But it wouldn’t be > transparent, AFAIK follow-mode needs to add special handlers for things > like isearch and query-replace. OTOH, it would be much more difficult to > implement in xdisp.c. I wonder if there is an intermediate layer that’s > higher level than redisplay (in lisp, or at least not in redisplay) but > still more or less transparent. > > > > > > Yuan > > > > -- > > Ihor Radchenko, > > PhD, > > Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) > > State Key Laboratory for Mechanical Behavior of Materials, Xi'an > Jiaotong University, Xi'an, China > > Email: yantar92@gmail.com, ihor_radchenko@alumni.sutd.edu.sg > > [-- Attachment #2: Type: text/html, Size: 5845 bytes --] ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-11 0:05 ` chad @ 2020-04-11 8:22 ` Eli Zaretskii 0 siblings, 0 replies; 41+ messages in thread From: Eli Zaretskii @ 2020-04-11 8:22 UTC (permalink / raw) To: chad; +Cc: dim1212k, adam, casouri, yantar92, emacs-devel > From: chad <yandros@gmail.com> > Date: Fri, 10 Apr 2020 17:05:00 -0700 > Cc: Ihor Radchenko <yantar92@gmail.com>, Adam Porter <adam@alphapapa.net>, Yuan Fu <casouri@gmail.com>, > Eli Zaretskii <eliz@gnu.org>, emacs-devel <emacs-devel@gnu.org> > > In particular, the way the found and added caching of line starts seemed like > something that could help emacs' problems with very long lines, and perhaps also the concerns with parsing > large files for highlighting and indenting. I don't think so, because finding the next newline is not the expensive part of the Emacs redisplay when lines are very long. In fact, we look for newlines by calling the memchr library function, and the result is lightning-fast, because Emacs represents buffer text as linear array of bytes, and memchr expands to a small number of machine instructions in an optimized build. With today's fast CPU clocks, searching for the next newline in even a very large buffer is a non-issue. The expensive part of redisplay is finding the correspondence between buffer positions and screen coordinates. Every display update needs some operation which has to find such correspondence. For example, take the simple C-n key, which by default moves to the next visual line. Long lines are normally wrapped on display, so the character below the current one on the next visual line is likely to be some place in the same physical line, but where exactly is that? What Emacs does internally is traverse all the characters after the current one, calculating their metrics and making pixel-level layout decisions, including the line wrapping, until it gets to the character whose screen coordinates indicate it is directly below the current cursor position. Then Emacs puts point at that place. C-p is similar, but more expensive, because moving back requires to start from the beginning of a physical line (which might be far away). C-v and M-v are also similar, because they need to calculate where to put the window-start to display the next screen-full of text with some overlap with what is currently shown. Etc. etc. -- it is this task of finding what buffer position corresponds to certain screen coordinates is what makes redisplay painfully slow when there are very long lines. Emacs before v21 supported only fixed-pitch fonts, where such calculations were much easier, but we nowadays support variables fonts in the same buffer. ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-10 19:09 ` Dmitrii Korobeinikov 2020-04-11 0:05 ` chad @ 2020-04-11 7:30 ` Eli Zaretskii 2020-04-11 7:56 ` Dmitrii Korobeinikov 1 sibling, 1 reply; 41+ messages in thread From: Eli Zaretskii @ 2020-04-11 7:30 UTC (permalink / raw) To: Dmitrii Korobeinikov; +Cc: adam, casouri, yantar92, emacs-devel > From: Dmitrii Korobeinikov <dim1212k@gmail.com> > Date: Sat, 11 Apr 2020 01:09:08 +0600 > Cc: Yuan Fu <casouri@gmail.com>, adam@alphapapa.net, Eli Zaretskii <eliz@gnu.org>, > emacs-devel <emacs-devel@gnu.org> > > >From what I saw, there's not a unified core interface on top of that c > array. So, would need to modify each place that makes a use of it. > (for a couple of examples, see text_outside_line_unchanged_p in > xdisp.c, looking_at_1 in search.c) I'm not sure why you came to that conclusion. Emacs's internals access buffer text directly when needed, for speed. Interfaces like BEG_UNCHANGED/END_UNCHANGED, BYTE_POS_ADDR, GPT, and others are no less "core interfaces" for accessing buffer text than functions in insdel.c. I would even consider insdel.c as a layer _above_ the low-level interfaces such as BYTE_POS_ADDR. And looking_at_1 does what it does because it needs to pass buffer text as 2 C 'char' arrays to regex routines, so I don't think it's any evidence to anything. It's just a trick to pass non-contiguous text to a function that needs contiguous text. > The good news is: I believe xdisp.c wouldn't have to be modified all > that much if the regions are enforced to start on different lines. How so? The display code accesses the buffer text directly, using BYTE_POS_ADDR. ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-11 7:30 ` Eli Zaretskii @ 2020-04-11 7:56 ` Dmitrii Korobeinikov 2020-04-11 8:26 ` Eli Zaretskii 0 siblings, 1 reply; 41+ messages in thread From: Dmitrii Korobeinikov @ 2020-04-11 7:56 UTC (permalink / raw) To: Eli Zaretskii; +Cc: adam, Yuan Fu, Ihor Radchenko, emacs-devel > > From what I saw, there's not a unified core interface on top of that c > > array. So, would need to modify each place that makes a use of it. > > (for a couple of examples, see text_outside_line_unchanged_p in > > xdisp.c, looking_at_1 in search.c) > > I'm not sure why you came to that conclusion. Emacs's internals > access buffer text directly when needed, for speed. Interfaces like > BEG_UNCHANGED/END_UNCHANGED, BYTE_POS_ADDR, GPT, and others are no > less "core interfaces" for accessing buffer text than functions in > insdel.c. I would even consider insdel.c as a layer _above_ the > low-level interfaces such as BYTE_POS_ADDR. By "unified core interface", I meant something like an OOP-style public interface done in a way so the users don't have to know about the implementation and underlying data structures, in which case modifications could've been simpler. I am not saying that's what it should have been or even could have been, just stating the fact that a different approach is used. > Emacs's internals > access buffer text directly when needed, for speed. That's exactly the point I was making. > > The good news is: I believe xdisp.c wouldn't have to be modified all > > that much if the regions are enforced to start on different lines. > > How so? The display code accesses the buffer text directly, using > BYTE_POS_ADDR. I didn't say it wouldn't have to be touched at all : ) xdisp.c has only 8 occurences of BYTE_POS_ADDR, that doesn't appear too bad. BTW What I am not sure about is if "different lines" enforcement would make for a noticeably easier implementation, now I am thinking, it probably wouldn't matter that much. сб, 11 апр. 2020 г. в 13:30, Eli Zaretskii <eliz@gnu.org>: > > > From: Dmitrii Korobeinikov <dim1212k@gmail.com> > > Date: Sat, 11 Apr 2020 01:09:08 +0600 > > Cc: Yuan Fu <casouri@gmail.com>, adam@alphapapa.net, Eli Zaretskii <eliz@gnu.org>, > > emacs-devel <emacs-devel@gnu.org> > > > > >From what I saw, there's not a unified core interface on top of that c > > array. So, would need to modify each place that makes a use of it. > > (for a couple of examples, see text_outside_line_unchanged_p in > > xdisp.c, looking_at_1 in search.c) > > I'm not sure why you came to that conclusion. Emacs's internals > access buffer text directly when needed, for speed. Interfaces like > BEG_UNCHANGED/END_UNCHANGED, BYTE_POS_ADDR, GPT, and others are no > less "core interfaces" for accessing buffer text than functions in > insdel.c. I would even consider insdel.c as a layer _above_ the > low-level interfaces such as BYTE_POS_ADDR. > > And looking_at_1 does what it does because it needs to pass buffer > text as 2 C 'char' arrays to regex routines, so I don't think it's any > evidence to anything. It's just a trick to pass non-contiguous text > to a function that needs contiguous text. > > > The good news is: I believe xdisp.c wouldn't have to be modified all > > that much if the regions are enforced to start on different lines. > > How so? The display code accesses the buffer text directly, using > BYTE_POS_ADDR. ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-11 7:56 ` Dmitrii Korobeinikov @ 2020-04-11 8:26 ` Eli Zaretskii 2020-04-11 10:01 ` Dmitrii Korobeinikov 0 siblings, 1 reply; 41+ messages in thread From: Eli Zaretskii @ 2020-04-11 8:26 UTC (permalink / raw) To: Dmitrii Korobeinikov; +Cc: adam, casouri, yantar92, emacs-devel > From: Dmitrii Korobeinikov <dim1212k@gmail.com> > Date: Sat, 11 Apr 2020 13:56:07 +0600 > Cc: Ihor Radchenko <yantar92@gmail.com>, Yuan Fu <casouri@gmail.com>, adam@alphapapa.net, > emacs-devel <emacs-devel@gnu.org> > > By "unified core interface", I meant something like an OOP-style > public interface done in a way so the users don't have to know about > the implementation and underlying data structures You will find that in buffer.h. Modify those interfaces, and you are done. > > > The good news is: I believe xdisp.c wouldn't have to be modified all > > > that much if the regions are enforced to start on different lines. > > > > How so? The display code accesses the buffer text directly, using > > BYTE_POS_ADDR. > > I didn't say it wouldn't have to be touched at all : ) xdisp.c has > only 8 occurences of BYTE_POS_ADDR, that doesn't appear too bad. Why does it matter how many times BYTE_POS_ADDR is used? If you change the implementation of BYTE_POS_ADDR, the replacement is a mechanical job, no matter if there are 8 places or 800 to make the change. ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Request for pointers and advice: displaying several buffers inside a single window 2020-04-11 8:26 ` Eli Zaretskii @ 2020-04-11 10:01 ` Dmitrii Korobeinikov 0 siblings, 0 replies; 41+ messages in thread From: Dmitrii Korobeinikov @ 2020-04-11 10:01 UTC (permalink / raw) To: Eli Zaretskii; +Cc: adam, Yuan Fu, Ihor Radchenko, emacs-devel > Why does it matter how many times BYTE_POS_ADDR is used? If you > change the implementation of BYTE_POS_ADDR, the replacement is a > mechanical job, no matter if there are 8 places or 800 to make the > change. True, but BYTE_POS_ADDR turns out to be a bad example and not a good estimator of the needed changes at all, since it's a part of the interface. I only now looked and saw it was a function and not a field. But, for instance, GPT is, because extra logic needs to be written to accomodate multiple GPTs (one for the buffer, and one for each of the referenced buffers recursively). To give an example, search.c has this lines: > p1 = BEGV_ADDR; > s1 = GPT_BYTE - BEGV_BYTE; > p2 = GAP_END_ADDR; > s2 = ZV_BYTE - GPT_BYTE; This would need to turn into an array of n boundaries, instead of 2. And re_match_2 would need to become a re_match_n. Next, indent.c L362: > else if (PT <= GPT || BEGV > GPT) But there isn't just one GPT now, so, expect changes around this place as well. I didn't look at the code very thoroughly, but I am pretty sure other places aren't too different. Besides GPT, obviously, boundaries of the referenced buffers now have to be accounted for, with their contents. A supposedly ordinary loop job, but still. All of these changes are conceptually simple, but do involve a bunch of legwork. There are some exceptions of course. Like "where to insert a character at the boundary", mentioned above. One natural solution for this, by the way, could be to simply look at the previous position of the point, i.e. if the boundary was approached from the right, insert to the rightmost buffer. сб, 11 апр. 2020 г. в 14:26, Eli Zaretskii <eliz@gnu.org>: > > > From: Dmitrii Korobeinikov <dim1212k@gmail.com> > > Date: Sat, 11 Apr 2020 13:56:07 +0600 > > Cc: Ihor Radchenko <yantar92@gmail.com>, Yuan Fu <casouri@gmail.com>, adam@alphapapa.net, > > emacs-devel <emacs-devel@gnu.org> > > > > By "unified core interface", I meant something like an OOP-style > > public interface done in a way so the users don't have to know about > > the implementation and underlying data structures > > You will find that in buffer.h. Modify those interfaces, and you are > done. > > > > > The good news is: I believe xdisp.c wouldn't have to be modified all > > > > that much if the regions are enforced to start on different lines. > > > > > > How so? The display code accesses the buffer text directly, using > > > BYTE_POS_ADDR. > > > > I didn't say it wouldn't have to be touched at all : ) xdisp.c has > > only 8 occurences of BYTE_POS_ADDR, that doesn't appear too bad. > > Why does it matter how many times BYTE_POS_ADDR is used? If you > change the implementation of BYTE_POS_ADDR, the replacement is a > mechanical job, no matter if there are 8 places or 800 to make the > change. ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [SPAM UNSURE] Request for pointers and advice: displaying several buffers inside a single window 2020-04-03 11:54 Request for pointers and advice: displaying several buffers inside a single window Dmitrii Korobeinikov 2020-04-03 13:07 ` Eli Zaretskii @ 2020-04-03 18:30 ` Stephen Leake 2020-04-05 13:18 ` Robert Pluim 1 sibling, 1 reply; 41+ messages in thread From: Stephen Leake @ 2020-04-03 18:30 UTC (permalink / raw) To: emacs-devel Dmitrii Korobeinikov <dim1212k@gmail.com> writes: > Hi all, > > I want to explore the feasibility of displaying two (indirect) buffers > inside a single window, one after another. Each buffer has to look > like it's rendered in its own mode. For the starters, each buffer can > start on its own new line in the window. No interaction w/ text is > required for now. This would look the same as two windows each displaying one buffer, if you could eliminate the mode line in betweeen them. That should be much easier. Hmm. Currently, the bottom line in a window is only partially displayed. So you'd also have to adjust the top window height to allow displaying the full last line. Or not; depends on what you want. -- -- Stephe ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [SPAM UNSURE] Request for pointers and advice: displaying several buffers inside a single window 2020-04-03 18:30 ` [SPAM UNSURE] " Stephen Leake @ 2020-04-05 13:18 ` Robert Pluim 2020-04-05 20:35 ` Dmitrii Korobeinikov 0 siblings, 1 reply; 41+ messages in thread From: Robert Pluim @ 2020-04-05 13:18 UTC (permalink / raw) To: Stephen Leake; +Cc: Dmitrii Korobeinikov, emacs-devel >>>>> On Fri, 03 Apr 2020 10:30:38 -0800, Stephen Leake <stephen_leake@stephe-leake.org> said: Stephen> Dmitrii Korobeinikov <dim1212k@gmail.com> writes: >> Hi all, >> >> I want to explore the feasibility of displaying two (indirect) buffers >> inside a single window, one after another. Each buffer has to look >> like it's rendered in its own mode. For the starters, each buffer can >> start on its own new line in the window. No interaction w/ text is >> required for now. Stephen> This would look the same as two windows each displaying one buffer, if Stephen> you could eliminate the mode line in betweeen them. That should be much Stephen> easier. (setq mode-line-format nil) and then make the second window display an indirect buffer to the buffer displayed in the first window, so you can change the major mode, then enable follow-mode so that scrolling one scrolls the other. Untested :-) Stephen> Hmm. Currently, the bottom line in a window is only partially displayed. Stephen> So you'd also have to adjust the top window height to allow displaying Stephen> the full last line. Or not; depends on what you want. I think that only happens if you have one or more of the various *pixelwise* variables non-nil; the default is to do everything in multiples of line-height. Robert ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [SPAM UNSURE] Request for pointers and advice: displaying several buffers inside a single window 2020-04-05 13:18 ` Robert Pluim @ 2020-04-05 20:35 ` Dmitrii Korobeinikov 0 siblings, 0 replies; 41+ messages in thread From: Dmitrii Korobeinikov @ 2020-04-05 20:35 UTC (permalink / raw) To: Robert Pluim; +Cc: Stephen Leake, emacs-devel I don't know why, but I never received the email from Stephen in my inbox (Robert's I have). I replied via "reply via e-mail to" button on the tracker, but my reply was filed into a seperate thread [1]. I wonder how not to make that happen again... But, first of all, sorry, I think I have miscommunicated my general intent in the OP. What I meant to say is that in the end I will want the two buffers behave as if they were two regions of the same master buffer (implying, for instance, the possibility of point seamlessly jumping across their borders), and I thought that ommiting the interactivity part and hacking up the renderer would be a good start. That, admittedly, wasn't very far-sighted of me. And now I am beginning to embrace the inevitability of having to extend upon the gap buffer. [1] https://lists.gnu.org/archive/html/emacs-devel/2020-04/msg00260.html вс, 5 апр. 2020 г. в 19:18, Robert Pluim <rpluim@gmail.com>: > > >>>>> On Fri, 03 Apr 2020 10:30:38 -0800, Stephen Leake <stephen_leake@stephe-leake.org> said: > > Stephen> Dmitrii Korobeinikov <dim1212k@gmail.com> writes: > >> Hi all, > >> > >> I want to explore the feasibility of displaying two (indirect) buffers > >> inside a single window, one after another. Each buffer has to look > >> like it's rendered in its own mode. For the starters, each buffer can > >> start on its own new line in the window. No interaction w/ text is > >> required for now. > > Stephen> This would look the same as two windows each displaying one buffer, if > Stephen> you could eliminate the mode line in betweeen them. That should be much > Stephen> easier. > > (setq mode-line-format nil) > > and then make the second window display an indirect buffer to the buffer > displayed in the first window, so you can change the major mode, then > enable follow-mode so that scrolling one scrolls the other. Untested :-) > > Stephen> Hmm. Currently, the bottom line in a window is only partially displayed. > Stephen> So you'd also have to adjust the top window height to allow displaying > Stephen> the full last line. Or not; depends on what you want. > > I think that only happens if you have one or more of the various > *pixelwise* variables non-nil; the default is to do everything in > multiples of line-height. > > Robert ^ permalink raw reply [flat|nested] 41+ messages in thread
end of thread, other threads:[~2020-04-13 5:23 UTC | newest] Thread overview: 41+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-04-03 11:54 Request for pointers and advice: displaying several buffers inside a single window Dmitrii Korobeinikov 2020-04-03 13:07 ` Eli Zaretskii 2020-04-04 22:44 ` Dmitrii Korobeinikov 2020-04-05 14:08 ` Adam Porter 2020-04-05 22:55 ` Dmitrii Korobeinikov 2020-04-10 14:45 ` Yuan Fu 2020-04-10 15:35 ` Ihor Radchenko 2020-04-10 16:43 ` Eli Zaretskii 2020-04-10 17:46 ` Ihor Radchenko 2020-04-10 18:07 ` Eli Zaretskii 2020-04-10 18:37 ` Ihor Radchenko 2020-04-10 19:01 ` Drew Adams 2020-04-10 19:19 ` Ihor Radchenko 2020-04-10 20:29 ` Drew Adams 2020-04-11 8:11 ` Ihor Radchenko 2020-04-11 17:23 ` Drew Adams 2020-04-12 2:42 ` Richard Stallman 2020-04-12 5:09 ` Drew Adams 2020-04-12 5:15 ` Drew Adams 2020-04-13 2:21 ` Richard Stallman 2020-04-13 5:23 ` Drew Adams 2020-04-12 23:54 ` Juri Linkov 2020-04-13 5:23 ` Drew Adams 2020-04-12 14:25 ` Ihor Radchenko 2020-04-12 16:38 ` Drew Adams 2020-04-10 19:12 ` Eli Zaretskii 2020-04-10 19:25 ` Ihor Radchenko 2020-04-10 19:34 ` Ihor Radchenko 2020-04-11 7:34 ` Eli Zaretskii 2020-04-11 8:35 ` Ihor Radchenko 2020-04-11 9:25 ` Eli Zaretskii 2020-04-10 19:09 ` Dmitrii Korobeinikov 2020-04-11 0:05 ` chad 2020-04-11 8:22 ` Eli Zaretskii 2020-04-11 7:30 ` Eli Zaretskii 2020-04-11 7:56 ` Dmitrii Korobeinikov 2020-04-11 8:26 ` Eli Zaretskii 2020-04-11 10:01 ` Dmitrii Korobeinikov 2020-04-03 18:30 ` [SPAM UNSURE] " Stephen Leake 2020-04-05 13:18 ` Robert Pluim 2020-04-05 20:35 ` Dmitrii Korobeinikov
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).