是否可以在Emacs中设置每个模式/缓冲区和每个字符集的字体?

是否可以在Emacs中设置每个模式/缓冲区和每个字符集的字体?,emacs,elisp,org-mode,Emacs,Elisp,Org Mode,我想根据Emacs中的主模式和字符集设置字体,例如,当我打开一个org文件时,我希望看到ASCII字符显示为字体“Consolas”,中文或日文字符显示为字体“Microsoft Yahei” 目前我使用一种称为缓冲面部模式的次要模式,可以根据主要模式更改字体: (add-hook 'org-mode-hook (lambda () (setq buffer-face-mode-face '(:font "Consolas-10.5"))

我想根据Emacs中的主模式和字符集设置字体,例如,当我打开一个org文件时,我希望看到ASCII字符显示为字体“Consolas”,中文或日文字符显示为字体“Microsoft Yahei”

目前我使用一种称为
缓冲面部模式的次要模式
,可以根据主要模式更改字体:

(add-hook 'org-mode-hook (lambda ()
                           (setq buffer-face-mode-face '(:font "Consolas-10.5"))
                           (buffer-face-mode)))
我查看过,但似乎没有任何可以设置或更改的面部字符集属性,因此我无法继续根据不同的字符集设置字体

我知道还有另一个函数
set fontset font
可以根据字符集设置字体,但它只能应用于帧,不能应用于缓冲区或模式

那么,有没有一种方法可以通过
缓冲面模式
将不同的字体设置为不同的字符集,或者有一种解决方法来实现我的原始请求

提前感谢,


开尔文(Kelvin)

这里有一些搜索线索:在我使用Emacs2定义一些个人字体集之前,我不确定这是否仍然是一种有效的方法

  • 创建一个新的字体集,该字体集描述编码列表和呈现每个编码的字体之间的映射
  • 将该字体/字体集与默认帧列表一起使用,我不知道如何仅将其与特定模式相关联
(从fontset规范创建fontset
“-*-consolas-*-*-*-*-*-12-*-*-*-*-*-*-fontset consolas,
ascii:-*-consolas-*-*-*-*-*-*-12-*-*-*-*-*-*-*-iso8859-1,
拉丁语-iso8859-1:-*-consolas-*-*-*-*-*-12-*-*-*-*-*-*-*-iso8859-1,
拉丁语-iso8859-15:-*-consolas-*-*-*-*-*-12-*-*-*-*-*-*-*-iso8859-15”)
(setq默认帧列表’((宽度.100)
(高度44)
(顶部50);像素
(左。50);像素
(字体:“fontset控制台”)
))

在这里,我总是将同一字体关联到多个编码中,但您可以使用不同的字体。

首先感谢您的回答,我尝试了这个方法,但字体没有改变,然后我评估了
(帧参数nil'font)
,发现字体集仍然是默认字体(而不是“字体集控制台”)。并且,假设这可以生效,我认为它会将所有缓冲区设置为上面定义的字体集,而不仅仅是主模式为“组织模式”的缓冲区,那么是否有一个函数可以只将缓冲区设置为特定的字体集,而不是帧?@KelvinHu:是的,
默认帧列表的定义在my
.emacs
中完成,并在启动后的第一帧中生效,与模式无关。我对elisp不够流利,无法告诉您如何在任何时候和特定模式下使其有效。对不起,我试了很多次,在谷歌上搜索了很多,发现这可能无法用通常的方式完成,我能想到的是定义一个建议,
切换到buffer
,并更改那里的字体大小/字体系列,但这也会更改边框大小。所以现在我想为所有缓冲区设置字体,这不是完美的,但也是可以接受的。不过,谢谢你的回答。