all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* feature request: text property to prevent font-locking
@ 2014-08-28 21:18 Drew Adams
  2014-08-30  9:27 ` Alan Mackenzie
  2014-08-31 14:31 ` Wolfgang Jenkner
  0 siblings, 2 replies; 18+ messages in thread
From: Drew Adams @ 2014-08-28 21:18 UTC (permalink / raw
  To: emacs-devel

Excuse me if I'm missing something that is already available.
And in that case, please let me know what it is, so I can use it.

I want to apply some ad-hoc highlighting with text property `face'
in a font-locked buffer (whether font-locking occurs before or after
I apply `face' for this highlighting).

I do not want font-lock to override this highlighting.  I do not want
to use `font-lock-keywords' (e.g. with KEEP) in order to create this
highlighting.  I just want to prevent font-lock from overriding it.

I want to apply some other text property to the highlighted text, to
tell font-lock not to fiddle with it ("hands off this text").

1. Does this possibility already exist in Emacs?  I looked but didn't
   find anything.

2. If not, can we please add it?

Wrt #2:

Years ago I added this feature to code that I use.  It works for me,
but I don't claim that the way I implemented it is the way to go.

The code I use is here:
http://www.emacswiki.org/emacs-en/download/font-lock%2b.el

Essentially I did this:

1. Defined function `put-text-property-unless-ignore', which is the
   same as `put-text-property' but ignores text that has property
   `font-lock-ignore'.

2. Redefined function `font-lock-default-unfontify-region' to not
   unfontify text that has property `font-lock-ignore',
   
3. Redefined these functions to use `put-text-property-unless-ignore'
   instead of `put-text-property':

   font-lock-prepend-text-property
   font-lock-append-text-property
   font-lock-fillin-text-property
   font-lock-apply-syntactic-highlight
   font-lock-fontify-syntactically-region
   font-lock-apply-highlight
   font-lock-fontify-anchored-keywords
   font-lock-fontify-keywords-region

   That is, the change to each of these functions is ONLY to use
   `put-text-property-unless-ignore' instead of `put-text-property'.

My implementation of `put-text-property-unless-ignore':

(defun put-text-property-unless-ignore (start end property value
                                        &optional object)
  "`put-text-property', but ignore text with property `font-lock-ignore'."
  (let ((here  (min start end))
        (end1  (max start end))
        chg)
    (while (< here end1)
      (setq chg  (next-single-property-change here 'font-lock-ignore
                                              object end1))
      (unless (get-text-property here 'font-lock-ignore object)
        (put-text-property here chg property value object))
      (setq here  chg))))

Perhaps there is a better way to do this.  Dunno.

In any case, my request is just for Emacs to have such a feature,
however it might be implemented.  Even better would be an answer that
Emacs already has something like this that I'm unaware of.

I use this feature for various highlighting (and unhighlighting)
commands, so that the highlighting works for font-locked text too.
This includes `facemenu-add-face' (my version).



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

* Re: feature request: text property to prevent font-locking
  2014-08-28 21:18 feature request: text property to prevent font-locking Drew Adams
@ 2014-08-30  9:27 ` Alan Mackenzie
  2014-08-30 20:15   ` Drew Adams
  2014-08-31 14:31 ` Wolfgang Jenkner
  1 sibling, 1 reply; 18+ messages in thread
From: Alan Mackenzie @ 2014-08-30  9:27 UTC (permalink / raw
  To: Drew Adams; +Cc: emacs-devel

Hi, Drew.

On Thu, Aug 28, 2014 at 02:18:28PM -0700, Drew Adams wrote:
> Excuse me if I'm missing something that is already available.
> And in that case, please let me know what it is, so I can use it.

> I want to apply some ad-hoc highlighting with text property `face'
> in a font-locked buffer (whether font-locking occurs before or after
> I apply `face' for this highlighting).

> I do not want font-lock to override this highlighting.  I do not want
> to use `font-lock-keywords' (e.g. with KEEP) in order to create this
> highlighting.  I just want to prevent font-lock from overriding it.

> I want to apply some other text property to the highlighted text, to
> tell font-lock not to fiddle with it ("hands off this text").

> 1. Does this possibility already exist in Emacs?  I looked but didn't
>    find anything.

> 2. If not, can we please add it?

[ .... ]

For this particular application of fontifying, you might be able to use
overlays, which take priority over text properties (see page "Overlay
Properties" in the Elisp manual).  You might have to define a lot of
attributes for the overlay face to prevent attributes from font-locking
"showing through".

That feels like a bit of a kludge, though.  The facility you've sketched
out (and implemented) might well be a useful one.

-- 
Alan Mackenzie (Nuremberg, Germany).



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

* RE: feature request: text property to prevent font-locking
  2014-08-30  9:27 ` Alan Mackenzie
@ 2014-08-30 20:15   ` Drew Adams
  2014-08-30 21:34     ` Thien-Thi Nguyen
  2014-08-31 12:40     ` Stefan Monnier
  0 siblings, 2 replies; 18+ messages in thread
From: Drew Adams @ 2014-08-30 20:15 UTC (permalink / raw
  To: Alan Mackenzie; +Cc: emacs-devel

> For this particular application of fontifying, you might be able to
> use overlays, which take priority over text properties (see page
> "Overlay Properties" in the Elisp manual).  You might have to define
> a lot of attributes for the overlay face to prevent attributes from
> font-locking "showing through".
> 
> That feels like a bit of a kludge, though.  The facility you've
> sketched out (and implemented) might well be a useful one.

Just in case I was not clear enough -

I do use overlays, when they are appropriate.  They are essentially
about buffer positions, not the text in the buffer.  But yes, one
can fiddle with overlays to work around the effective removal, in a
font-locked buffer, of the possibility of using `face' as a text
property for other than font-locking.  Like others, I have done that.

I suspect that people have gotten used to this behavior by font-lock
and act as if it were normal.

But font-lock does not (should not) own text-property `face', even
in font-locked buffers.  You should not need to resort to using
`face' with overlays, just to get around font-lock's effective
confiscation of it for buffer text.  You should be able to apply
`face' to any buffer text and have a way to prevent it being taken
over by font-lock there.

And yes, people sometimes try other ways to work around the
expropriation of `face' by font-lock.  They try to show links on
top of font-locked text by using property `display', for example.

And yes, people sometimes end up using font-lock itself to add
ad-hoc highlighting, not because it is particularly appropriate for
the particular use case, but because there is little choice to do
otherwise.

AFAICT, this is just a missing Emacs feature: be able to exclude
zones of text from being taken over by font-lock.  Stop font-lock
from changing property `face' from a value set by non font-lock
highlighting.

This feature is essentially what font-lock itself already provides for
given font-lock rules (keywords), via keyword `keep'.  The problem is
that Font-lock does not recognize any such protection outside
`font-lock-keywords'.

So again, I am not looking to solve a particular highlighting problem
by a workaround (overlays, other text properties such as `display',...).

I'm arguing that there should be a simple way to tell font-lock "Hands
off!" particular text.  It should be simple to indicate that property
`face' on this or that text is not open to being altered by font-lock.

And I do have a solution - a trivial patch, as I indicated.  And for
users a simple way to tell font-lock "Hands off!": just put text
property `font-lock-ignore' where you do not want font-lock to change
text properties.  I cannot see a downside to providing this.

But since your reply is the only one so far, Alan, I conclude so far
that there is no special interest in this -the problem or the
proposed solution.  That's OK by me - I'll continue to use the code
I have.  And others can continue to add a `display' property or
whatever to get around the roughshod behavior of font-lock.  Been
there, done that.

And just in case, I'll send the patch, with `report-emacs-bug'.

As I said:
 I use this feature for various highlighting (and unhighlighting)
 commands, so that the highlighting works for font-locked text too.
 This includes `facemenu-add-face' (my version).

I use it for links (`link' face), `facemenu-add-face' (any face),
`hlt-highlighter' & `hlt-eraser' (mouse-drag highlighter/eraser),
`hlt-region' (arbitrary (un)highlighting), `hlt-yank-props' (paste
copied text properties), and more.



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

* Re: feature request: text property to prevent font-locking
  2014-08-30 20:15   ` Drew Adams
@ 2014-08-30 21:34     ` Thien-Thi Nguyen
  2014-08-31  6:06       ` Drew Adams
  2014-08-31 12:40     ` Stefan Monnier
  1 sibling, 1 reply; 18+ messages in thread
From: Thien-Thi Nguyen @ 2014-08-30 21:34 UTC (permalink / raw
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1474 bytes --]

() Drew Adams <drew.adams@oracle.com>
() Sat, 30 Aug 2014 13:15:46 -0700 (PDT)

   But since your reply is the only one so far, Alan, I conclude
   so far that there is no special interest in this -the problem
   or the proposed solution.

Maybe it takes a while for answers to arrive.

As you point out, font-lock must self-gate in some manner,
especially to avoid doing useless re-work.  Have you looked at
the source?  A brief dive shows me that

 ‘font-lock-mode’ docstring mentions
 ‘font-lock-fontify-buffer’ which calls
 ‘font-lock-fontify-buffer-function’ which has the value
 ‘jit-lock-refontify’ (for me), which calls
 ‘put-text-property’ w/
 property name ‘fontified’ and
 property value ‘nil’

suggesting that property ‘fontified’ w/ non-‘nil’ value is what
jit-lock must do as testimony of its work.  Now, that took all of
two minutes.  The next twenty or two-hundred (if i were lucky
enough to have them available) would be to understand what
weirdness must mar this simple model.  Maybe you can do that?

Regardless, i like the straightforward ‘font-lock-ignore’ method
you demo.  It would be nice to have that level of friendliness in
Emacs (and documented!).

-- 
Thien-Thi Nguyen
   GPG key: 4C807502
   (if you're human and you know it)
      read my lisp: (responsep (questions 'technical)
                               (not (via 'mailing-list)))
                     => nil

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

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

* RE: feature request: text property to prevent font-locking
  2014-08-30 21:34     ` Thien-Thi Nguyen
@ 2014-08-31  6:06       ` Drew Adams
  2014-08-31 16:11         ` Drew Adams
  0 siblings, 1 reply; 18+ messages in thread
From: Drew Adams @ 2014-08-31  6:06 UTC (permalink / raw
  To: emacs-devel

>    But since your reply is the only one so far, Alan, I conclude
>    so far that there is no special interest in this -the problem
>    or the proposed solution.
> 
> Maybe it takes a while for answers to arrive.

Yes, maybe. That's why I called the conclusion tentative ("so far").

> As you point out, font-lock must self-gate in some manner,
> especially to avoid doing useless re-work.  Have you looked at
> the source?  A brief dive shows me that
> 
>  ‘font-lock-mode’ docstring mentions
>  ‘font-lock-fontify-buffer’ which calls
>  ‘font-lock-fontify-buffer-function’ which has the value
>  ‘jit-lock-refontify’ (for me), which calls
>  ‘put-text-property’ w/
>  property name ‘fontified’ and
>  property value ‘nil’
> 
> suggesting that property ‘fontified’ w/ non-‘nil’ value is what
> jit-lock must do as testimony of its work.  Now, that took all of
> two minutes.  The next twenty or two-hundred (if i were lucky
> enough to have them available) would be to understand what
> weirdness must mar this simple model.  Maybe you can do that?

I did look into that in the past (and again before my OP message).
And I did try simply setting `fontified' to non-nil, with no luck.

It's quite possible I am missing something simple, which is why
I asked about that.  I still would like to hear that that is the
case, and how.

> Regardless, i like the straightforward ‘font-lock-ignore’ method
> you demo.  It would be nice to have that level of friendliness in
> Emacs (and documented!).

Seems simple to me too.  But maybe there is something simpler
and already available.  After all, font lock was not added
yesterday.  And surely people have tried to use ad hoc
highlighting in a font-locked buffer.

If nothing else, they must have tried `facemenu-set-face'
(`M-o o') and `facemenu-add-face', which are about as old as
font-lock.  But maybe they tried and just gave up when they saw
the unfriendly message "Font-lock mode will override any faces
you set in this buffer", as if that were the final (discouraging)
word.

In any case, it is not the final word.  With the patch I sent
(bug #18367), font-lock no longer prevents you from using `M-o o'
etc.  (If the patch is accepted then that message should of
course be removed.)

That message's presence is another thing that gives me the
impression that I am maybe not missing something: if there were
already a simple way to stop font-lock from overriding facemenu
highlighting then why would we warn people that it does override
it?  Why wouldn't the `facemenu.el' code just DTRT and stop
font-lock's king-of-the-sandbox bullying ;-) for the space of
facemenu's ad hoc highlighting?



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

* Re: feature request: text property to prevent font-locking
  2014-08-30 20:15   ` Drew Adams
  2014-08-30 21:34     ` Thien-Thi Nguyen
@ 2014-08-31 12:40     ` Stefan Monnier
  2014-08-31 15:30       ` Drew Adams
  1 sibling, 1 reply; 18+ messages in thread
From: Stefan Monnier @ 2014-08-31 12:40 UTC (permalink / raw
  To: Drew Adams; +Cc: Alan Mackenzie, emacs-devel

By, the way, these kinds of problems are the reason why I suggested
adding "planes" to text-properties.

It should be relatively easy to implement.


        Stefan



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

* Re: feature request: text property to prevent font-locking
  2014-08-28 21:18 feature request: text property to prevent font-locking Drew Adams
  2014-08-30  9:27 ` Alan Mackenzie
@ 2014-08-31 14:31 ` Wolfgang Jenkner
  2014-08-31 16:03   ` Drew Adams
  1 sibling, 1 reply; 18+ messages in thread
From: Wolfgang Jenkner @ 2014-08-31 14:31 UTC (permalink / raw
  To: Drew Adams; +Cc: emacs-devel

On Thu, Aug 28 2014, Drew Adams wrote:

> I want to apply some ad-hoc highlighting with text property `face'
> in a font-locked buffer (whether font-locking occurs before or after
> I apply `face' for this highlighting).

> I do not want font-lock to override this highlighting.  I do not want
> to use `font-lock-keywords' (e.g. with KEEP) in order to create this
> highlighting.  I just want to prevent font-lock from overriding it.

So, let me try to understand the extent of the problem.

font-lock-default-unfontify-region leaves alone any "alternative"
(defined in char-property-alias-alist) of the `face' text property.

In particular, this is how the font-lock-face text property works.

Now, on the one hand, keyword fontification does not override
"alternatives" (except if the highlight pattern has an `override' flag).
This is because text-property-not-all recognizes them and thus prevents
font-lock-apply-highlight from adding a value for the `face' property.

On the other hand, some experimenting suggests that syntactic
fontification does override those "alternatives".

> I want to apply some other text property to the highlighted text,
> to tell font-lock not to fiddle with it ("hands off this text").

Remove it from the value of `font-lock-extra-managed-props'.

tl; dr: Existing facilities reduce the problem to clashes with syntactic
fontification.

Wolfgang



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

* RE: feature request: text property to prevent font-locking
  2014-08-31 12:40     ` Stefan Monnier
@ 2014-08-31 15:30       ` Drew Adams
  2014-08-31 19:57         ` Stefan Monnier
  0 siblings, 1 reply; 18+ messages in thread
From: Drew Adams @ 2014-08-31 15:30 UTC (permalink / raw
  To: Stefan Monnier; +Cc: Alan Mackenzie, emacs-devel

> By, the way, these kinds of problems are the reason why I suggested
> adding "planes" to text-properties.
> 
> It should be relatively easy to implement.

Sorry, that's too vague for me.  But I guess it further confirms that
I am not missing something simple.



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

* RE: feature request: text property to prevent font-locking
  2014-08-31 14:31 ` Wolfgang Jenkner
@ 2014-08-31 16:03   ` Drew Adams
  0 siblings, 0 replies; 18+ messages in thread
From: Drew Adams @ 2014-08-31 16:03 UTC (permalink / raw
  To: Wolfgang Jenkner; +Cc: emacs-devel

> font-lock-default-unfontify-region leaves alone any "alternative"
> (defined in char-property-alias-alist) of the `face' text property.

"Leaves alone?"  It think it does the opposite: it removes its
highlighting: it treats the alternative property like it treats
`face' (and `font-lock-face').  But perhaps I misunderstand you.

> In particular, this is how the font-lock-face text property works.

Yes, and thanks for pointing that out, as it is not obvious how
`font-lock-face' is handled by `font-lock-default-unfontify-region'.

But again, IIUC, it does not "leave alone" `font-lock-face'd text.
It does just the opposite: it unfontifies it.

That's even worse wrt unhighlighting than not doing anything.
If you do nothing, then text that you have applied `face' to
will at least appear highlighted when you turn off `font-lock-mode'.

By using your suggested "leave alone" approach, you give font-lock
control over not only highlighting but unhighlighting, so your
ad hoc highlighting will never show, whether font-lock is on or off.

> Now, on the one hand, keyword fontification does not override
> "alternatives" (except if the highlight pattern has an `override'
> flag). This is because text-property-not-all recognizes them and
> thus prevents font-lock-apply-highlight from adding a value for
> the `face' property.

Yes.  That is the point, AFAICT, of `font-lock-face': to let you
give font-lock control over some ad hoc highlighting.  And yes,
you can use an "alternative" property for the same thing.

> On the other hand, some experimenting suggests that syntactic
> fontification does override those "alternatives".

Yes, I noticed that too.

But beyond that: What you are describing is just the control that
font-lock has over highlighting, and how one can give it control
over additional, non-`font-lock-keywords' highlighting by using
`font-lock-face' (or another property besides `face', designated
as a `face' "alternative").

What I am talking about is the opposite: Not giving font-lock
control over additional, ad hoc highlighting, but taking font-lock
control away, for given ad hoc highlighting.  I don't want turning
font-lock on or off to affect the given highlighting at all.

That's the point.  It's not that I'm looking for a way to let
font-lock control some non-`font-lock-keywords' highlighting.
That we can do already, using property `font-lock-face'.

(And my guess is that the fact that this is the only feature for
ad hoc highlighting that is compatible with font-lock is a reason
that we have seen an expansion of the use of `font-lock-face'.
IOW, if you want some ad hoc highlighting, you are currently
pretty much obliged to give font-lock control over it, by using
that approach.)

> > I want to apply some other text property to the highlighted text,
> > to tell font-lock not to fiddle with it ("hands off this text").
> 
> Remove it from the value of `font-lock-extra-managed-props'.

Remove what?  The highlighting property?  It's `face', which is
already not in `font-lock-extra-managed-props'.  The default value
of `font-lock-extra-managed-props' is nil (or it should be; and
hopefully it will be again, after bug #18343 gets fixed).

That's the point: font-lock should not "own" `face'.  And it
pretty much does currently.  Whether it did in the beginning I
don't know, but I kinda doubt it.  Property `face' was not
invented for font-lock, AFAIK.  Font-lock is one application of
the feature of faces; nothing more.  But it does not play well
with other uses of that feature - it is a sandbox bully.

> tl; dr: Existing facilities reduce the problem to clashes with
> syntactic fontification.

That's your point, not mine.  But yes, the feature I proposed
lets you protect given text also from overriding by syntactic
fontification.



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

* RE: feature request: text property to prevent font-locking
  2014-08-31  6:06       ` Drew Adams
@ 2014-08-31 16:11         ` Drew Adams
  0 siblings, 0 replies; 18+ messages in thread
From: Drew Adams @ 2014-08-31 16:11 UTC (permalink / raw
  To: emacs-devel

> With the patch I sent (bug #18367), font-lock no longer prevents
> you from using `M-o o' etc.  (If the patch is accepted then that
> message ["Font-lock mode will override any faces you set in this
> buffer"] should of course be removed.)

That statement is not clear; sorry.  The patch I sent is only
for font-lock.el.  It makes it possible to allow facemenu.el
to protect its highlighting from font-locking.  It does not, by
itself, protect facemenu highlighting.

For that, another patch is needed, which I will be glad to send
if this feature is accepted.  If you want to try it now to see,
just load file facemenu+.el, in addition to file font-lock+.el.

http://www.emacswiki.org/emacs-en/download/facemenu%2b.el
http://www.emacswiki.org/emacs-en/download/font-lock%2b.el



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

* Re: feature request: text property to prevent font-locking
  2014-08-31 15:30       ` Drew Adams
@ 2014-08-31 19:57         ` Stefan Monnier
  2014-08-31 21:07           ` Drew Adams
  2014-08-31 21:43           ` Alan Mackenzie
  0 siblings, 2 replies; 18+ messages in thread
From: Stefan Monnier @ 2014-08-31 19:57 UTC (permalink / raw
  To: Drew Adams; +Cc: Alan Mackenzie, emacs-devel

>> By, the way, these kinds of problems are the reason why I suggested
>> adding "planes" to text-properties.
>> It should be relatively easy to implement.
> Sorry, that's too vague for me.  But I guess it further confirms that
> I am not missing something simple.

I suggested that there be several planes of properties, so font-lock
would place its properties in the plane `font-lock' while other packages
can use their own plane.  Then you'd separately specify rules for how to
merge the various planes (with rules that can be distinct for each kind
of property).
The merge of properties would not take place during redisplay but
instead would take place when the properties are added/removed.


        Stefan



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

* RE: feature request: text property to prevent font-locking
  2014-08-31 19:57         ` Stefan Monnier
@ 2014-08-31 21:07           ` Drew Adams
  2014-08-31 21:43           ` Alan Mackenzie
  1 sibling, 0 replies; 18+ messages in thread
From: Drew Adams @ 2014-08-31 21:07 UTC (permalink / raw
  To: Stefan Monnier; +Cc: Alan Mackenzie, emacs-devel

> >> By, the way, these kinds of problems are the reason why I
> >> suggested adding "planes" to text-properties.
> >> It should be relatively easy to implement.
> >
> > Sorry, that's too vague for me.  But I guess it further confirms
> > that I am not missing something simple.
> 
> I suggested that there be several planes of properties, so font-lock
> would place its properties in the plane `font-lock' while other
> packages can use their own plane.  Then you'd separately specify
> rules for how to merge the various planes (with rules that can
> be distinct for each kind of property). The merge of properties
> would not take place during redisplay but instead would take place
> when the properties are added/removed.

Doesn't sound particularly simple to use (can you say "usine a
gaz"?), even if it is "relatively easy to implement".  But I admit
that I have only a vague notion of what you have in mind.

While waiting for your implementation of that multifaceted feature,
perhaps we can adopt the simple change I suggested? (A bug fix, IMO.)

But again, I'm OK with just continuing to use the fix in my code,
if Emacs doesn't want it.



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

* Re: feature request: text property to prevent font-locking
  2014-08-31 19:57         ` Stefan Monnier
  2014-08-31 21:07           ` Drew Adams
@ 2014-08-31 21:43           ` Alan Mackenzie
  2014-09-01  1:37             ` Stephen J. Turnbull
  1 sibling, 1 reply; 18+ messages in thread
From: Alan Mackenzie @ 2014-08-31 21:43 UTC (permalink / raw
  To: Stefan Monnier; +Cc: Drew Adams, emacs-devel

Hi, All.

On Sun, Aug 31, 2014 at 03:57:14PM -0400, Stefan Monnier wrote:
> >> By, the way, these kinds of problems are the reason why I suggested
> >> adding "planes" to text-properties.
> >> It should be relatively easy to implement.
> > Sorry, that's too vague for me.  But I guess it further confirms that
> > I am not missing something simple.
> 
> I suggested that there be several planes of properties, so font-lock
> would place its properties in the plane `font-lock' while other packages
> can use their own plane.  Then you'd separately specify rules for how to
> merge the various planes (with rules that can be distinct for each kind
> of property).
> The merge of properties would not take place during redisplay but
> instead would take place when the properties are added/removed.
> 
> 
>         Stefan
> 

I think you mean this:

#########################################################################
From: Stefan Monnier <monnier@iro.umontreal.ca>
To: emacs-devel@gnu.org
Date: Mon, 04 Oct 2010 01:37:26 +0200
Subject: Re: Combining face and map stuff

> Which reminds me of another thing.  I would like to define some
> commands
> local to a region, which can be done with 'local-map in overlays or
> 'keymap in text properties.  But can I combine them, too, in possibly
> overlapping regions, and get the aggregate keymap?

Here's an idea with which I've beeing toying:

- rather than have just one set of text-properties per char, make it
  possible to have several.  E.g. font-lock would use its own set of
  text properties.  One way to do that is that a `property' can now be
  a cons whose car is a "plane" and whose cdr is a property.
  So for example, the special font-lock-face (which currently gets
  "mapped" to face' via char-property-alias-alist) would just be `face'
  because font-lock would use (font-lock . face).
  A property like `face' would really be equivalent to (nil . face).

- then you add property-specific merge functions.  I.e. when looking up
  `face' you'd get the merge of all the `face' properties of the various
  text-property planes.  You'd probably want those merge functions to be
  written in Elisp and customizable.  So merging `keymap' properties
  becomes easy (well, it may benefit from multiple-keymap inheritance,
  which is a completely different topic).

- now font-lock can erase all the properties of the `font-lock' plane
  without worrying about erasing properties installed by other packages.

- to avoid calling Elisp code to merge things during text-property
  lookups, the merge would take place in put-text-property (i.e. no need
  to change the redisplay code at all).

- modifying a plane other than the default (nil) one could be considered
  as "not modifying the buffer" (just like adding/removing overlays).

- we could obsolete char-property-alias-alist which is only ever used
  by/for font-lock-face.

- maybe outline-minor-mode could use text-properties rather than
  overlays to make text invisible (tho it would make it impossible(?) to
  use outline-minor-mode in an indirect buffer without affecting the
  base buffer and the other indirect buffers).  So it might reduce the
  need for overlays (which have the disadvantage of being
  algorithmically slow/costly).


        Stefan
#########################################################################

This might be "relatively simple" to implement, but relative to what,
I'm not sure.  ;-)

-- 
Alan Mackenzie (Nuremberg, Germany).



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

* Re: feature request: text property to prevent font-locking
  2014-08-31 21:43           ` Alan Mackenzie
@ 2014-09-01  1:37             ` Stephen J. Turnbull
  2014-09-01 20:45               ` Stefan Monnier
  0 siblings, 1 reply; 18+ messages in thread
From: Stephen J. Turnbull @ 2014-09-01  1:37 UTC (permalink / raw
  To: Alan Mackenzie; +Cc: Stefan Monnier, Drew Adams, emacs-devel

Alan Mackenzie writes:

 > This might be "relatively simple" to implement, but relative to what,
 > I'm not sure.  ;-)

You're well on your way to reinventing "extents", you know. :-(




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

* Re: feature request: text property to prevent font-locking
  2014-09-01  1:37             ` Stephen J. Turnbull
@ 2014-09-01 20:45               ` Stefan Monnier
  2014-09-02  2:02                 ` Stephen J. Turnbull
  2014-09-02  2:33                 ` Richard Stallman
  0 siblings, 2 replies; 18+ messages in thread
From: Stefan Monnier @ 2014-09-01 20:45 UTC (permalink / raw
  To: Stephen J. Turnbull; +Cc: Alan Mackenzie, Drew Adams, emacs-devel

>> This might be "relatively simple" to implement, but relative to what,
>> I'm not sure.  ;-)
> You're well on your way to reinventing "extents", you know. :-(

No, we did that already (except we called them overlays ;-)


        Stefan



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

* Re: feature request: text property to prevent font-locking
  2014-09-01 20:45               ` Stefan Monnier
@ 2014-09-02  2:02                 ` Stephen J. Turnbull
  2014-09-02  2:33                 ` Richard Stallman
  1 sibling, 0 replies; 18+ messages in thread
From: Stephen J. Turnbull @ 2014-09-02  2:02 UTC (permalink / raw
  To: Stefan Monnier; +Cc: Alan Mackenzie, Drew Adams, emacs-devel

Stefan Monnier writes:
 > >> This might be "relatively simple" to implement, but relative to what,
 > >> I'm not sure.  ;-)
 > > You're well on your way to reinventing "extents", you know. :-(
 > 
 > No, we did that already (except we called them overlays ;-)

Since you apparently need reminding, let me point out that Extents are
capable of providing both text property and overlay behavior, and
several useful combinations of both as well.  "Planes" of text
properties is just one example of behavior that is trivial to
implement with extents.  Drew's desired behavior is trivial to
implement given XEmacs's implementation of text properties (that seems
somewhat accidental to me).

Sure, there are few places where XEmacs implementations vary from
Emacs semantics, but IIRC that's by deliberate choice, with one
exception where XEmacs chose consistency of abstraction over 100%
Emacs compatibility.  99.44% of the time the implementations are not
distinguishable by end users.





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

* Re: feature request: text property to prevent font-locking
  2014-09-01 20:45               ` Stefan Monnier
  2014-09-02  2:02                 ` Stephen J. Turnbull
@ 2014-09-02  2:33                 ` Richard Stallman
  2014-09-02  6:04                   ` David Kastrup
  1 sibling, 1 reply; 18+ messages in thread
From: Richard Stallman @ 2014-09-02  2:33 UTC (permalink / raw
  To: Stefan Monnier; +Cc: acm, stephen, drew.adams, emacs-devel

[[[ 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. ]]]

Overlays are not the same as extents.  Extents try to be both
text properties and overlays, and I think that mixture can't
be implemented without incoherent behaviors.

-- 
Dr Richard Stallman
President, Free Software Foundation
51 Franklin St
Boston MA 02110
USA
www.fsf.org  www.gnu.org
Skype: No way! That's nonfree (freedom-denying) software.
  Use Ekiga or an ordinary phone call.




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

* Re: feature request: text property to prevent font-locking
  2014-09-02  2:33                 ` Richard Stallman
@ 2014-09-02  6:04                   ` David Kastrup
  0 siblings, 0 replies; 18+ messages in thread
From: David Kastrup @ 2014-09-02  6:04 UTC (permalink / raw
  To: emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ 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. ]]]
>
> Overlays are not the same as extents.  Extents try to be both
> text properties and overlays, and I think that mixture can't
> be implemented without incoherent behaviors.

I'm not complete sure whether extents can or cannot cover all use cases
of overlays/properties: it was some time since I last looked.  The main
problem I had when working with them is that the purported generality is
elusive since part of the difference in Emacs' semantics of overlays and
text properties is encoded in extent properties while other parts are
encoded in the parameters you pass to the subroutines for accessing
extents.  The result is that the complexity for a particular application
tends to bleed all over the place whenever you don't restrict yourself
to the Emacs abstractions, most easily done by using compatibility
functions.

However, there is no point in Emacs not supporting overlay and text
properties identically whenever a particular property is not inherently
tied to the difference between overlay and text properties.
I definitely remember being annoyed in the past by some properties
requiring the use of one and not the other.  But I don't remember the
details right now.

Having the same underlying implementation for overlays and text
properties is of course a reliable way to have the same supported set of
properties by default.

-- 
David Kastrup




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

end of thread, other threads:[~2014-09-02  6:04 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-08-28 21:18 feature request: text property to prevent font-locking Drew Adams
2014-08-30  9:27 ` Alan Mackenzie
2014-08-30 20:15   ` Drew Adams
2014-08-30 21:34     ` Thien-Thi Nguyen
2014-08-31  6:06       ` Drew Adams
2014-08-31 16:11         ` Drew Adams
2014-08-31 12:40     ` Stefan Monnier
2014-08-31 15:30       ` Drew Adams
2014-08-31 19:57         ` Stefan Monnier
2014-08-31 21:07           ` Drew Adams
2014-08-31 21:43           ` Alan Mackenzie
2014-09-01  1:37             ` Stephen J. Turnbull
2014-09-01 20:45               ` Stefan Monnier
2014-09-02  2:02                 ` Stephen J. Turnbull
2014-09-02  2:33                 ` Richard Stallman
2014-09-02  6:04                   ` David Kastrup
2014-08-31 14:31 ` Wolfgang Jenkner
2014-08-31 16:03   ` Drew Adams

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.