help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Overriding inherited face attributes


From: Boris Buliga
Subject: Re: Overriding inherited face attributes
Date: Wed, 28 Nov 2018 09:39:29 +0200

Stephen,

Thank you for the answer. Indeed, adding this property to the end resolves
my
problem.

--------------------------------------------------------------------------------

Stephen and Eli,

Regarding documentation.

1. We have a part saying that 'faces occurring earlier in the list have
higher
priority'. This is super clear and easy to check. For example,

  > (setq my-test-string (propertize "hello" 'face '(:inherit (:foreground
"orange"))))
  #("hello" 0 5 (face (:inherit (:foreground "orange"))))
  > (add-face-text-property 0 5 '(:foreground "red") nil my-test-string)
  nil
  > my-test-string
  #("hello" 0 5 (face ((:foreground "red") (:inherit ...))))

Inserting this string results in the red 'hello'.

If you try you do append the property to the end, you'll get an orange
'hello'.

So far so good. Then I tried to do the same with propertize and I've got
quite
different result.

  > (propertize "hello" 'face '(:foreground "red" :inherit (:foreground
"orange")))
  #("hello" 0 5 (face (:foreground "red" :inherit (:foreground "orange"))))
  ;; results in an orange text

  > (propertize "hello" 'face '((:foreground "red") (:inherit (:foreground
"orange"))))
  #("hello" 0 5 (face ((:foreground "red") (:inherit ...))))
  ;; results in a red text

To me, it's still confusing. Why in the first example I have an orange text
and
in the second one - red?

2. And there is a part saying something I don't quite understand about
inheritance.

> Attributes from inherited faces are merged into the face like an
underlying
> face would be, with higher priority than underlying faces.

This one looks good to me. If I understand this correctly - inherited face
attributes behave as usual face attributes. Am I right?

On Tue, 27 Nov 2018 at 23:33, Stephen Berman <stephen.berman@gmx.net> wrote:

> On Tue, 27 Nov 2018 22:18:45 +0200 Boris Buliga <boris@d12frosted.io>
> wrote:
>
> > Hi everyone,
> >
> > Sorry if this question was answered somewhere before. I searched and
> didn't
> > find any working solution, so here I am.
> >
> > Problem. Override a face attribute that is defined in an inherited face.
> >
> > For example, open up a new buffer in the fundamental mode and evaulate
> the
> > following experssion:
> >
> > (insert (propertize "hello" 'face '(:foreground "red" :inherit
> (:foreground
> > "orange"))))
> >
> > I expect the word 'hello' to be red, but instead, it is orange.
> >
> > So two questions:
> >
> > 1. Am I right to expect the text to be red?
> > 2. How to achieve this?
>
> I don't know the answer to your first questions, but the answer to the
> second question appears to be: switch the order.  At least, when I
> evaluate the following in fundamental mode, 'hello' is red:
>
> (insert (propertize "hello" 'face '(:inherit (:foreground "orange")
> :foreground "red")))
>
> In (info "(elisp) Special Properties") it says this: "The value of the
> [`face'] property can be... A list of faces... Faces occurring earlier
> in the list have higher priority."  And in (info "(elisp) Face
> Attributes") it says: "Attributes from inherited faces are merged into
> the face like an underlying face would be, with higher priority than
> underlying faces."  Whether this implies the above observed behavior is
> not clear to me.
>
> Steve Berman
>


-- 
Cheers,
Boris


reply via email to

[Prev in Thread] Current Thread [Next in Thread]