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 >>> >>>> ;; 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