在 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-cursor-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 中获取光标下的字体的主要内容,如果未能解决你的问题,请参考以下文章