ChatGPT解决这个技术问题 Extra ChatGPT

Get font face under cursor in Emacs

I've been developing my own custom color theme, and it'd be really useful if I could get a list of font-faces affecting the text under the cursor.

Something like Textmate's show current scope command.

That would save me the trouble of doing M-x customize-face and looking through available options, guessing at which one affects the current word I'm on.

Any ideas?

In case you're looking for the same functionality using the mouse cursor (if, e.g., you cannot get point on the text in question), see: emacs.stackexchange.com/a/35449/13444

d
dbr

what-cursor-position with a prefix argument shows the face under point, among other information.

Keyboard shortcut is C-u C-x =

Example output (the face property is shown in the last paragraph):

             position: 5356 of 25376 (21%), column: 4
            character: r (displayed as r) (codepoint 114, #o162, #x72)
    preferred charset: ascii (ASCII (ISO646 IRV))
code point in charset: 0x72
               syntax: w    which means: word
             category: .:Base, L:Left-to-right (strong), a:ASCII, l:Latin, r:Roman
          buffer code: #x72
            file code: #x72 (encoded by coding system undecided-unix)
              display: by this font (glyph code)
    nil:-apple-Monaco-medium-normal-normal-*-12-*-*-*-m-0-iso10646-1 (#x55)

Character code properties: customize what to show
  name: LATIN SMALL LETTER R
  general-category: Ll (Letter, Lowercase)
  decomposition: (114) ('r')

There are text properties here:
  face                 org-level-2
  fontified            t

[back]

Which invokes what-cursor-position.
hmmm, sometimes it invokes what-cursor-position, sometimes it displays a list of buffer properties (including font). If I get the former behaviour, moving the cursor and repeating brings on the latter.
I am so happy I found this, with some unknown combinations of the commands and keystrokes I got emacs to display how I liked it and didn't how to get it back in my next restart
It shows the font name on Emacs GUI. On terminal, Emacs is not responsible for setting the font and therefore such information is not available when one does C-u C-x = in Emacs running on the terminal, like emacs -nw file.txt.
Y
Yoo

M-x describe-face


This also includes the nice link making it possible to customize the face under cursor immediately
This works well most of the time, but sometimes for reasons I can't figure out sometimes it doesn't suggest the face I'm looking for. For example in eshell when there is ansi color it just says "default".
This shows me a prompt where I can enter something. What would I need to enter, in order to describe the font under cursor?
This worked for me to customize code block fonts in org-mode. @Zelphir, the text before the prompt showed the face, in my case at least. You might just hit return. For example my result read Describe face (default ‘org-block-background’): .
C
Community

You can define what-face with this code:

(defun what-face (pos)
  (interactive "d")
  (let ((face (or (get-char-property (pos) 'read-face-name)
                  (get-char-property (pos) 'face))))
    (if face (message "Face: %s" face) (message "No face at %d" pos))))

After that,

M-x what-face

will print the face found at the current point.

(Thanks to thedz for pointing out that what-face wasn’t built in.)


This ignores faces set as text properties. If enable hl-line-mode you will only see hl-line as the face, not the other faces. Consider gist.github.com/Wilfred/f7d61b7cdf9fdbb1d11c
Karl Fogel pointed out a bug in this code in a separate answer: the output message says it’s describing the face at the pos parameter, but the reading of the face is actually done at (point) rather than at pos.
This doesn't works, you can use "M-x describe-face" instead.
pos is not a function; in order make the snippet work, you should replace (pos) with pos on lines 3 and 4
t
thedz

Trey's what face is on the right track. It led me to an email on a mailing list that had this:

(defun what-face (pos)
    (interactive "d")
        (let ((face (or (get-char-property (point) 'read-face-name)
            (get-char-property (point) 'face))))
    (if face (message "Face: %s" face) (message "No face at %d" pos))))

Duh, forgot it wasn't bundled with Emacs. May I put the source in my answer w/attribution? :)
K
Karl Fogel

There's a bug in the `what-face' code: the function takes "pos" as an argument but then doesn't use it when getting the face -- instead it uses "(point)", even though the message later claims pos in the "No face at %d" case.


This would be better placed as a comment on that answer.
Even better if it had a fix... +1 for spotting it anyway
i
ig-perez

I tried @tray function but it didn't work, @thedz definition does work:

(defun what-face (pos)
  (interactive "d")
  (let ((face (or (get-char-property (point) 'read-face-name)
                  (get-char-property (point) 'face))))
    (if face (message "Face: %s" face) (message "No face at %d" pos))))

After some research I found why:

(point) is a function that returns the value of point as an integer.

pos gets the value returned by (interactive "d") which will be the position of point, as an integer.

get-char-property expects a position, in this case given by the function (point).