在Emacs中,是否可以针对模式/缓冲区和字符集设置字体?

3
我希望能够在Emacs中根据主模式和字符集设置字体。例如,当我打开一个org文件时,我希望看到ASCII字符显示为“Consolas”字体,中文或日文字符显示为“Microsoft Yahei”字体。
目前,我使用了一个名为“buffer-face-mode”的辅助模式,并且可以使字体更改与主模式相对应:
(add-hook 'org-mode-hook (lambda ()
                           (setq buffer-face-mode-face '(:font "Consolas-10.5"))
                           (buffer-face-mode)))

我查看了 这个页面,但似乎没有任何一个面的字符集属性可以设置或更改,因此我无法根据不同的字符集继续设置字体。
我知道还有另一个函数set-fontset-font可以根据字符集设置字体,但它只能应用于框架,而不能应用于缓冲区或模式。
那么,有没有办法使用buffer-face-mode为不同的字符集设置不同的字体,或者找到一个解决方案来实现我的原始请求?
提前感谢您的帮助,
Kelvin
1个回答

0

以下是一些搜索线索:在Emacs22之前,我曾经定义过一些个人字体集,但我不确定这是否仍然是有效的方法。

  • 创建一个新的字体集,描述编码列表和渲染每个编码所使用的字体之间的映射关系
  • 使用该字体/字体集与default-frame-alist,我不知道如何将其仅关联到特定模式
(create-fontset-from-fontset-spec
    "-*-consolas-*-*-*-*-12-*-*-*-*-*-fontset-consolas,
    ascii:-*-consolas-*-*-*-*-12-*-*-*-*-*-iso8859-1,
    latin-iso8859-1:-*-consolas-*-*-*-*-12-*-*-*-*-*-iso8859-1,
    latin-iso8859-15:-*-consolas-*-*-*-*-12-*-*-*-*-*-iso8859-15")

(setq default-frame-alist '((width . 100) 
   (height . 44) 
   (top . 50) ;pixels
   (left . 50) ;pixels
   (font . "fontset-consolas")
   ))

在这里,我总是将同一字体与多种编码关联起来,但您可以使用不同的字体。


首先感谢您的回答,我尝试了这个方法,但是字体没有改变。然后我评估了(frame-parameter nil 'font),发现字体集仍然是默认值(而不是"fontset-consolas")。 - Kelvin Hu
假设这个能生效,我认为它会将所有缓冲区设置为上面定义的字体集,而不仅仅是主模式为“org-mode”的缓冲区,那么是否有一个函数可以将一个缓冲区设置为特定的字体集,而不是整个框架? - Kelvin Hu
@KelvinHu:是的,default-frame-alist 的定义在我的 .emacs 文件中完成,在启动后的第一个框架中生效,并且与模式无关。我不太熟悉 elisp,无法告诉如何使其随时有效并适用于特定模式。抱歉。 - Seki
我尝试了很多并进行了谷歌搜索,发现可能无法以通常的方式完成,我能想到的是定义一个switch-to-buffer的建议,并在那里更改字体大小/字族,但这也会改变框架大小。所以现在我想为所有缓冲区设置字体,虽然不完美,但也可以接受。无论如何,感谢您的答案。 - Kelvin Hu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接