在 Emacs 中获取光标下的字体

Posted

技术标签:

【中文标题】在 Emacs 中获取光标下的字体【英文标题】:Get font face under cursor in Emacs 【发布时间】:2010-11-17 13:26:43 【问题描述】:

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

类似于 Textmate 的 show current scope 命令。

这样可以省去我做 M-x customize-face 和查看可用选项的麻烦,猜测哪个会影响我正在使用的当前单词。

有什么想法吗?

【问题讨论】:

如果您正在使用 mouse 光标寻找相同的功能(例如,如果您无法在相关文本上找到point),请参阅:@ 987654321@ 【参考方案1】:

what-cursor-position 带有前缀参数显示点下方的面部以及其他信息。

键盘快捷键是C-u C-x =

示例输出(face 属性显示在最后一段):

             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]

【讨论】:

调用what-cursor-position hmmm,有时它会调用 what-c​​ursor-position,有时它会显示缓冲区属性列表(包括字体)。如果我得到前一种行为,移动光标并重复会带来后者。 我很高兴我找到了这个,我得到了一些未知的命令和击键组合 emacs 来显示我是多么喜欢它,但在我下次重新启动时不知道如何找回它 它在 Emacs GUI 上显示字体名称。在终端上,Emacs 不负责设置字体,因此当在终端上运行的 Emacs 中执行 C-u C-x = 时,此类信息不可用,例如 emacs -nw file.txt【参考方案2】:

M-x 描述人脸

【讨论】:

这还包括很好的链接,可以立即自定义光标下的面部 这在大多数情况下都能正常工作,但有时由于我无法弄清楚的原因,有时它并不能暗示我正在寻找的面孔。例如,在 eshell 中,当有 ansi 颜色时,它只会显示“默认”。 这显示了一个提示,我可以在其中输入内容。为了描述光标下的字体,我需要输入什么? 这对我在 org 模式下自定义代码块字体很有用。 @Zelphir,提示之前的文字显示了脸,至少在我的情况下。您可能只需点击return。例如我的结果是Describe face (default ‘org-block-background’): 【参考方案3】:

您可以使用以下代码定义what-face

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

之后,

M-x what-face

将打印在当前点找到的人脸。

(感谢thedz 指出what-face 不是内置的。)

【讨论】:

这会忽略设置为文本属性的面。如果启用hl-line-mode,您将只看到hl-line 作为面,而不是其他面。考虑gist.github.com/Wilfred/f7d61b7cdf9fdbb1d11c Karl Fogel 指出了这段代码 in a separate answer 中的一个错误:输出消息说它在 pos 参数处描述了面部,但面部的读取实际上是在 (point) 处完成的而不是pos 这个不行,你可以用“M-x describe-face”代替。 pos 不是函数;为了使 sn-p 工作,您应该在第 3 行和第 4 行将 (pos) 替换为 pos【参考方案4】:

Trey 的脸是正确的。它把我带到了一个邮件列表上的一封电子邮件,里面有这样的内容:

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

【讨论】:

呃,忘了它没有与 Emacs 捆绑在一起。我可以在我的答案中注明来源吗? :)【参考方案5】:

“what-face”代码中有一个错误:该函数将“pos”作为参数,但在获取人脸时不使用它——而是使用“(point)”,即使消息后来在“%d 没有脸”的情况下声称 pos。

【讨论】:

最好将其作为对该答案的评论。 如果有修复就更好了...+1 无论如何都可以发现它【参考方案6】:

我尝试了@tray 函数但它不起作用,@thedz 定义确实起作用:

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

经过一番研究,我找到了原因:

(point) 是一个以整数形式返回点值的函数。 pos 获取(interactive "d") 返回的值,这将是点的位置,为整数。 get-char-property 需要一个位置,在这种情况下由函数 (point) 给出。

【讨论】:

以上是关于在 Emacs 中获取光标下的字体的主要内容,如果未能解决你的问题,请参考以下文章

更改emacs中的字体设置[重复]

疲倦的眼睛的emacs字体定制

如何更改 Emacs 的默认字体大小和字体类型?

绑定键以增加/减少emacs中的字体大小

在 Emacs 中,如何在 minibuffer 中显示带有字体属性的消息?

ubuntu 20.04 上的 Emacs 27.1 找不到任何字体