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

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

bug#65632: 30.0.50; Proposal to improve `faces--attribute-at-point'.


From: David Ponce
Subject: bug#65632: 30.0.50; Proposal to improve `faces--attribute-at-point'.
Date: Thu, 31 Aug 2023 14:08:04 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.15.0

On 31/08/2023 10:18, David Ponce wrote:
On 31/08/2023 00:30, David Ponce wrote:
On 30/08/2023 21:22, Eli Zaretskii wrote:
Cc: 65632@debbugs.gnu.org
Date: Wed, 30 Aug 2023 21:35:11 +0300
From: Eli Zaretskii <eliz@gnu.org>

;; Display "TEST" in red, bold, italic on yellow background.
(insert
   (propertize
    "TEST" 'font-lock-face
    '(bold ((:background "yellow") "italic"
            ((foreground-color . "red") underline)))))

This is not a valid face, AFAIU.  That it works is sheer luck (because
Emacs is very lenient with this stuff).  The correct face definition
for what you want is this (see 'set-face-attribute's doc string):

   (insert
     (propertize
      "TEST" 'font-lock-face
      '(:weight bold :background "yellow" :slant italic
         :foreground "red" :underline t)))

If you use the above, foreground-color-at-point etc. will work as
expected.

I'm not sure we want to go out of our way to support the kind of face
specifications that you used.

However, if we do want that, we already have the technology:

   (face-attributes-as-vector (get-char-property (point) 'font-lock-face))

This will return a vector of face attribute values, where you can find
the value of any attribute you like.  For example, to get the
foreground color, evaluate:

   (aref 9
     (face-attributes-as-vector (get-char-property (point) 'font-lock-face)))

Hi Eli,

Thank you very much for letting me know about `face-attributes-as-vector'
(maybe its doc string could be improved?).  It is exactly the function I need 
:-)

In case you are interested, I attached an updated patch to faces.el that use
this function to lookup face attribute, which improves and simplify  the
functions `faces--attribute-at-point', `foreground-color-at-point' and
`background-color-at-point'.

Regards

Please find attached a revised patch.  I used the name
`faces-attribute' instead of `face-attribute-lookup' for consistency
with `faces--attribute-at-point'.  I simplified this new function
because `face-attributes-as-vector' always returns the symbol
`unspecified' when an attribute is not specified (according to what I
understand of the implementation in xfaces.c).  I also improved the
doc string to include a link to the Elisp manual regarding the meaning
of face specification.

Here is an updated changelog:

     * faces.el: Improve attribute lookup of face at point.
     (face--attribute-index): New constant.
     (faces-attribute): New function.
     (faces--attribute-at-point): Use it.  Remove unused argument.
     (foreground-color-at-point)
     (background-color-at-point): Call accordingly.



Regards

Sorry, my previous patch was buggy.  Here is the correct one.

Attachment: faces-attribute-lookup-V3.patch
Description: Text Data


reply via email to

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