108

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?

Drew
  • 29,895
  • 7
  • 74
  • 104
thedz
  • 5,496
  • 3
  • 25
  • 29
  • 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: https://emacs.stackexchange.com/a/35449/13444 – Braham Snyder Sep 12 '17 at 01:37

7 Answers7

190

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]
dbr
  • 165,801
  • 69
  • 278
  • 343
jlf
  • 3,461
  • 2
  • 18
  • 14
  • 12
    Which invokes `what-cursor-position`. – viam0Zah Aug 10 '09 at 09:12
  • 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. – davidA Aug 02 '10 at 22:06
  • 2
    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 – Miserable Variable May 17 '13 at 23:53
  • 2
    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`. – Fernando Basso Mar 02 '18 at 16:51
  • Cheesy mnemonic "user experience equals"... *groan* – Jeremy Field Mar 02 '23 at 04:52
74

M-x describe-face

Yoo
  • 17,526
  • 6
  • 41
  • 47
  • 5
    This also includes the nice link making it possible to customize the face under cursor immediately – Ev Dolzhenko Nov 25 '13 at 12:45
  • 3
    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". – Samuel Edwin Ward Mar 09 '16 at 16:57
  • 2
    This shows me a prompt where I can enter something. What would I need to enter, in order to describe the font under cursor? – Zelphir Kaltstahl Oct 02 '17 at 09:31
  • 1
    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’): `. – Mallory-Erik Feb 18 '18 at 11:11
44

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.)

Community
  • 1
  • 1
Trey Jackson
  • 73,529
  • 11
  • 197
  • 229
  • 3
    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 https://gist.github.com/Wilfred/f7d61b7cdf9fdbb1d11c – Wilfred Hughes Oct 22 '14 at 09:24
  • 2
    [Karl Fogel](http://stackoverflow.com/users/247145/karl-fogel) pointed out a bug in this code [in a separate answer](http://stackoverflow.com/a/20844370/578288): 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`. – Rory O'Kane Apr 26 '17 at 15:48
  • 1
    This doesn't works, you can use "M-x describe-face" instead. – luochen1990 Oct 10 '18 at 05:23
  • 4
    `pos` is not a function; in order make the snippet work, you should replace `(pos)` with `pos` on lines 3 and 4 – cebola May 02 '20 at 17:02
8

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))))
thedz
  • 5,496
  • 3
  • 25
  • 29
2

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.

Karl Fogel
  • 21
  • 3
0

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).
ig-perez
  • 31
  • 4
0

In emacs-lisp,

(face-at-point t)

which is what M-x describe-face uses.

John32ma
  • 41
  • 2