unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Feature proposal/request: Indentation driven by display engine
@ 2008-05-24 12:15 Carsten Dominik
  2008-05-24 18:48 ` Stefan Monnier
  2008-05-24 23:02 ` Stephen Berman
  0 siblings, 2 replies; 6+ messages in thread
From: Carsten Dominik @ 2008-05-24 12:15 UTC (permalink / raw)
  To: emacs-devel Mailinglist

Hi,

I have a proposal to make:

Recently, I have experimented with an idea, to create
indentation on the Emacs display.

For example, in an outline structure

* level 1
text under level 1
** Level 2
text under level 1


I would like to display this as:

* level 1
   text under level 1
** Level 2
    text under level 1

without actually inserting white space at the beginning of
each line.  So effectively I would like to shift the location
of the left margin on a per-line basis.

I have been trying to implement this using display properties
on each newline characters, displaying "\n   " instead of
just "\n".  This basically works, but it interacts badly
with outlining:  If I fold the text below a headline, the
first indentation is still displayed.

The next thing I tried was using overlays over each "\n",
with an after-string property carrying the indentations.
This works correctly with outline, but when I add thousands
of overlays to a buffer this becomes slow and redisplay and
editing become sluggish, probably because to the huge
amount of markers in the buffer.

It then occurred to me that it might be useful to support
such a feature directly in the display engine.
For example, if the line contains text with an `indentation'
property, the display engine would add this amount of white
space to before the beginning of the line, maybe also a vertical
line indicating the location of the margin.

Would that be something useful to add?  Anyone who would
volunteer to implement this, because I frankly have no
idea how the display engine works internally.

Or are there other comments, for example how this dynamic
indentation could be implemented in a different way?

Thanks for listening.

- Carsten








^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Feature proposal/request: Indentation driven by display engine
  2008-05-24 12:15 Feature proposal/request: Indentation driven by display engine Carsten Dominik
@ 2008-05-24 18:48 ` Stefan Monnier
  2008-05-24 20:22   ` Carsten Dominik
  2008-05-24 23:02 ` Stephen Berman
  1 sibling, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2008-05-24 18:48 UTC (permalink / raw)
  To: Carsten Dominik; +Cc: emacs-devel Mailinglist

> I have been trying to implement this using display properties
> on each newline characters, displaying "\n   " instead of
> just "\n".  This basically works, but it interacts badly
> with outlining:  If I fold the text below a headline, the
> first indentation is still displayed.

Can't you remove the display property when you fold to avoid the problem?

> The next thing I tried was using overlays over each "\n",
> with an after-string property carrying the indentations.
> This works correctly with outline, but when I add thousands
> of overlays to a buffer this becomes slow and redisplay and
> editing become sluggish, probably because to the huge
> amount of markers in the buffer.

Yes, we need to improve the implementation of markers to eliminate the
O(N) complexity.  Ideally, there'd be some clever way to store the
markers directly inside the text-properties tree.

> It then occurred to me that it might be useful to support
> such a feature directly in the display engine.
> For example, if the line contains text with an `indentation'
> property, the display engine would add this amount of white
> space to before the beginning of the line, maybe also a vertical
> line indicating the location of the margin.

This property would still need to be added to every line.  So basically
all you're asking is a "before-string" text-property, maybe?

> Or are there other comments, for example how this dynamic
> indentation could be implemented in a different way?

How 'bout modifying the actual buffer text directly?


        Stefan




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Feature proposal/request: Indentation driven by display engine
  2008-05-24 18:48 ` Stefan Monnier
@ 2008-05-24 20:22   ` Carsten Dominik
  2008-05-26 21:02     ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Carsten Dominik @ 2008-05-24 20:22 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel Mailinglist

Hi Stefan, thanks for your reply.

On May 24, 2008, at 8:48 PM, Stefan Monnier wrote:

>> I have been trying to implement this using display properties
>> on each newline characters, displaying "\n   " instead of
>> just "\n".  This basically works, but it interacts badly
>> with outlining:  If I fold the text below a headline, the
>> first indentation is still displayed.
>
> Can't you remove the display property when you fold to avoid the  
> problem?

I could, but then I would have to add and remove text properties during
each fold/unfold, quite some unnecessary overhead.

>> The next thing I tried was using overlays over each "\n",
>> with an after-string property carrying the indentations.
>> This works correctly with outline, but when I add thousands
>> of overlays to a buffer this becomes slow and redisplay and
>> editing become sluggish, probably because to the huge
>> amount of markers in the buffer.
>
> Yes, we need to improve the implementation of markers to eliminate the
> O(N) complexity.  Ideally, there'd be some clever way to store the
> markers directly inside the text-properties tree.

Yes, it would certainly be nice to get rid of this old problem.

>
>
>> It then occurred to me that it might be useful to support
>> such a feature directly in the display engine.
>> For example, if the line contains text with an `indentation'
>> property, the display engine would add this amount of white
>> space to before the beginning of the line, maybe also a vertical
>> line indicating the location of the margin.
>
> This property would still need to be added to every line.  So  
> basically
> all you're asking is a "before-string" text-property, maybe?

Hmm, nice translation of my request.  Yes, basically what I am
asking for is a working before-string text property.  I know
that adding the property sounds like a lot of effort, but I could
use the font-lock/jit-lock setup to get this done efficiently,
only for the pieces that actually get displayed.

>> Or are there other comments, for example how this dynamic
>> indentation could be implemented in a different way?
>
> How 'bout modifying the actual buffer text directly?

Yes, this is in fact what I am doing now, I use TAB, and
wrapping/paragraph-fill support to get fill prefixes.  I also modify
indentation during promotion and demotion of entries.

However, there are some disadvantages to this.  One obvious one is
this:  Org contains a publishing part, and for publishing
we allow examples like code snippets, where indentation might be
important.  So the

#+BEGIN_EXAMPLE

#+END_EXAMPLE

construct should be flush to the left margin.

Are we going to get a before-string property?  WOuld be cool.

- Carsten













>
>
>
>        Stefan





^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Feature proposal/request: Indentation driven by display engine
  2008-05-24 12:15 Feature proposal/request: Indentation driven by display engine Carsten Dominik
  2008-05-24 18:48 ` Stefan Monnier
@ 2008-05-24 23:02 ` Stephen Berman
  1 sibling, 0 replies; 6+ messages in thread
From: Stephen Berman @ 2008-05-24 23:02 UTC (permalink / raw)
  To: emacs-devel

On Sat, 24 May 2008 14:15:59 +0200 Carsten Dominik <carsten.dominik@gmail.com> wrote:

> Hi,
>
> I have a proposal to make:
>
> Recently, I have experimented with an idea, to create
> indentation on the Emacs display.
>
> For example, in an outline structure
>
> * level 1
> text under level 1
> ** Level 2
> text under level 1
>
>
> I would like to display this as:
>
> * level 1
>   text under level 1
> ** Level 2
>    text under level 1
>
> without actually inserting white space at the beginning of
> each line.  So effectively I would like to shift the location
> of the left margin on a per-line basis.
>
> I have been trying to implement this using display properties
> on each newline characters, displaying "\n   " instead of
> just "\n".  This basically works, but it interacts badly
> with outlining:  If I fold the text below a headline, the
> first indentation is still displayed.

This sounds reminiscent of a bug I reported a while ago; see
<http://permalink.gmane.org/gmane.emacs.devel/86019>.  

> The next thing I tried was using overlays over each "\n",
> with an after-string property carrying the indentations.
> This works correctly with outline, but when I add thousands
> of overlays to a buffer this becomes slow and redisplay and
> editing become sluggish, probably because to the huge
> amount of markers in the buffer.
>
> It then occurred to me that it might be useful to support
> such a feature directly in the display engine.
> For example, if the line contains text with an `indentation'
> property, the display engine would add this amount of white
> space to before the beginning of the line, maybe also a vertical
> line indicating the location of the margin.
>
> Would that be something useful to add?  Anyone who would
> volunteer to implement this, because I frankly have no
> idea how the display engine works internally.
>
> Or are there other comments, for example how this dynamic
> indentation could be implemented in a different way?

I've attempted to develop a version of longlines-mode that implements
the same sort of left margin shifting you mention, also by means of a
similar display property (I use " \n" concatented with a customizable
string).  It works fairly well (also with adaptive filling, which does
not work with current longlines-mode) but among other problems suffers
from the display bug I referred to in the above URL, which sounds like
what you are also seeing.  In an earlier version I tried using
before-string overlays and also ran into scalability problems.  I don't
know if a before-string property would solve all issues, but it would be
nice to have the possibility.

Steve Berman





^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Feature proposal/request: Indentation driven by display engine
  2008-05-24 20:22   ` Carsten Dominik
@ 2008-05-26 21:02     ` Stefan Monnier
  2008-05-27  8:24       ` Carsten Dominik
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2008-05-26 21:02 UTC (permalink / raw)
  To: Carsten Dominik; +Cc: emacs-devel Mailinglist

>> Can't you remove the display property when you fold to avoid the problem?
> I could, but then I would have to add and remove text properties during
> each fold/unfold, quite some unnecessary overhead.

Not sure how much of an overhead that would be.  Doesn't seem major.
It might be inconvenient to code, tho.  Is that what you meant?

>>> It then occurred to me that it might be useful to support
>>> such a feature directly in the display engine.
>>> For example, if the line contains text with an `indentation'
>>> property, the display engine would add this amount of white
>>> space to before the beginning of the line, maybe also a vertical
>>> line indicating the location of the margin.
>> 
>> This property would still need to be added to every line.  So basically
>> all you're asking is a "before-string" text-property, maybe?

> Hmm, nice translation of my request.  Yes, basically what I am
> asking for is a working before-string text property.  I know
> that adding the property sounds like a lot of effort, but I could
> use the font-lock/jit-lock setup to get this done efficiently,
> only for the pieces that actually get displayed.

The same has been requested for display properties (e.g. to put
something in the margin without hiding any of the current text, you
need an overlay).

A `before-string' text-property might be doable, but I couldn't tell you
how easy it'd be to add.  If someone wants to implement that, I might
accept it (e.g., as a form of `display' property), but if I were you
I wouldn't hold my breath (we have enough bugs to fix and are getting
close to feature freeze).

The best I can offer for now, is to use overlays which you add via
jit-lock and which you eagerly remove in the background (so they don't
accumulate).

>> How 'bout modifying the actual buffer text directly?

> Yes, this is in fact what I am doing now, I use TAB, and
> wrapping/paragraph-fill support to get fill prefixes.  I also modify
> indentation during promotion and demotion of entries.

> However, there are some disadvantages to this.  One obvious one is
> this:  Org contains a publishing part, and for publishing
> we allow examples like code snippets, where indentation might be
> important.  So the

> #+BEGIN_EXAMPLE

> #+END_EXAMPLE

> construct should be flush to the left margin.

I'm not sure I understand why that makes any difference.

> Are we going to get a before-string property?  WOuld be cool.

Well... patches welcome,


        Stefan




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Feature proposal/request: Indentation driven by display engine
  2008-05-26 21:02     ` Stefan Monnier
@ 2008-05-27  8:24       ` Carsten Dominik
  0 siblings, 0 replies; 6+ messages in thread
From: Carsten Dominik @ 2008-05-27  8:24 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel Mailinglist

Hi Stafan,

On May 26, 2008, at 11:02 PM, Stefan Monnier wrote:

>>> Can't you remove the display property when you fold to avoid the  
>>> problem?
>> I could, but then I would have to add and remove text properties  
>> during
>> each fold/unfold, quite some unnecessary overhead.
>
> Not sure how much of an overhead that would be.  Doesn't seem major.
> It might be inconvenient to code, tho.  Is that what you meant?

Yes, mainly this.  There are many show/hide commands, some in outline  
mode, some in Org, I would need to make sure that each time the right  
thing happens.


>
>
>>>> It then occurred to me that it might be useful to support
>>>> such a feature directly in the display engine.
>>>> For example, if the line contains text with an `indentation'
>>>> property, the display engine would add this amount of white
>>>> space to before the beginning of the line, maybe also a vertical
>>>> line indicating the location of the margin.
>>>
>>> This property would still need to be added to every line.  So  
>>> basically
>>> all you're asking is a "before-string" text-property, maybe?
>
>> Hmm, nice translation of my request.  Yes, basically what I am
>> asking for is a working before-string text property.  I know
>> that adding the property sounds like a lot of effort, but I could
>> use the font-lock/jit-lock setup to get this done efficiently,
>> only for the pieces that actually get displayed.
>
> The same has been requested for display properties (e.g. to put
> something in the margin without hiding any of the current text, you
> need an overlay).
>
> A `before-string' text-property might be doable, but I couldn't tell  
> you
> how easy it'd be to add.  If someone wants to implement that, I might
> accept it (e.g., as a form of `display' property), but if I were you
> I wouldn't hold my breath (we have enough bugs to fix and are getting
> close to feature freeze).

Sure, I appreciate that.

>
>
> The best I can offer for now, is to use overlays which you add via
> jit-lock and which you eagerly remove in the background (so they don't
> accumulate).


Yes, one possible path.
>
> Well... patches welcome,

In this case, not from me, not clue where to even start.

Thanks.

- Carsten





^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-05-27  8:24 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-24 12:15 Feature proposal/request: Indentation driven by display engine Carsten Dominik
2008-05-24 18:48 ` Stefan Monnier
2008-05-24 20:22   ` Carsten Dominik
2008-05-26 21:02     ` Stefan Monnier
2008-05-27  8:24       ` Carsten Dominik
2008-05-24 23:02 ` Stephen Berman

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).