在 Emacs 中获取光标下的字体面

我一直在开发自己的自定义颜色主题,如果我能得到一个影响光标下文本的字体面孔列表,那将是非常有用的。

比如 Textmate 的 show current scope command。

这样我就省去了做 M-x 定制脸和查看可用选项的麻烦,猜测哪个选项会影响我正在使用的单词。

有什么想法吗?

26467 次浏览

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

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

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]

M-x describe-face

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.

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