Emacs字体设置

Aug152007

由于 emacs 是个支持多语言的程序,它支持很多种字符集,而一种字体一般只覆 盖一个或几个字符集,因此只用一种字体是无法显示 emacs 支持的所有文字的。 因此在emacs中需要设置 fontset,也就是多种字体的集合,或者叫做字体集。

如果我们不指定 fontset, 那么 emacs 会使用默认的 fontset-default 来显示 字体。如果你觉得这种字体不好看,就需要自己定义 fontset。定义 fontset 有 两种方式,一种是在 ~/.emacs 中使用 create-fontset-from-fontset-spec 函 数,令一种是在 ~/.Xdefaults 中定义资源。我们分别介绍这两种方法。

使用 create-fontset-from-fontset-spec

每个 fontset 都有一个很长的正规名称,例如:

 -*-courier-medium-r-normal--14-*-*-*-*-*-fontset-courier

为了方便起见也可以使用短名称,就是最后两段:fontset-courier

那么这个名称是怎么生成的呢?首先我们用 xlsfonts 命令找到自己满意的字体, 比如:

 -adobe-courier-medium-r-normal--14-100-100-100-m-90-iso8859-1

然后把最后两段去掉,也就是把 iso8859-1 去掉,换上自己起的字体集名称, 比如 fontset-courier,最后把我们不关心的部分用 `*' 号取代就可以了, 注意,用 xlsfonts 列出来的字体名称中,有些字段为 0,这些是可缩放的矢量 字体,这些 0 不能保留,必须用数字或 `*' 号取代,例如,

 -adobe-courier-medium-r-normal--0-0-0-0-p-0-iso8859-1

要改为:

 -adobe-courier-medium-r-normal--14-*-*-*-p-*-fontset-courier

还有一点需要注意,尽量不要选用可缩放的矢量字体,因为 emacs 不支持 xft, 因此无法打开抗锯齿,这些字体会显得很毛糙,不好看。

选定了字体就可以用 create-fontset-from-fontset-spec 函数定义 fontset 了,这个函数很简单,它的参数是个字符串:

(create-fontset-from-fontset-spec
(concat
"-*-courier-medium-r-normal-*-14-*-*-*-*-*-fontset-courier,"
"chinese-gb2312:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gb2312*-*,"
"mule-unicode-0100-24ff:-*-simsun-medium-r-*-*-14-*-*-*-c-*-iso10646*-*,"
"korean-ksc5601:-*-*-medium-r-*-*-14-*-*-*-*-*-ksc5601*-*,"
"chinese-cns11643-5:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*,"
"chinese-cns11643-6:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*,"
"chinese-cns11643-7:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*,"
"sjis:-*-medium-r-normal--14-*-jisx0208*-*"))

这个字符串的第一段是 fontset 的名称,实际上也指定了英文(ascii字符集)字 体,后面的各段格式都是“字符集:字体”,分别为不同的字符集指定字体,例如 上面的定义中,ascii采用courier字体,chinese-gb2312采用simsun字体,以此 类推。

定义好了 fontset 以后,我们就可以让 emacs 使用这个fontset了:

 (set-default-font "fontset-courier")

另外,为了让 emacs 创建新的 frame 时 (C-x 5 系列命令) 采用我们指定的 fontset,还要进行下面的设置:

(setq default-frame-alist
(append
'((font . "fontset-courier")) default-frame-alist))

在 ~/.Xdefaults 中定义 fontset

第二种定义 fontset 的方法是在 ~/.Xdefualts 中定义资源字符串:

Emacs.Fontset-0:-*-courier-medium-r-normal-*-14-*-*-*-*-*-fontset-courier,\
chinese-gb2312:-*-simsun-medium-r-*-*-14-*-*-*-c-*-*-*,\
mule-unicode-0100-24ff:-*-simsun-medium-r-*-*-14-*-*-*-c-*-iso10646*-*,\
korean-ksc5601:-*-*-medium-r-*-*-14-*-*-*-*-*-ksc5601*-*,\
chinese-cns11643-5:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*,\
chinese-cns11643-6:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*,\
chinese-cns11643-7:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*,\
sjis:-*-medium-r-normal--14-*-jisx0208*-*

然后让 emacs 使用这个 fontset:

 Emacs.font: fontset-courier

更改了 ~/.Xdefaults 的内容以后要执行:

 xrdb .Xdefaults

命令,这样更改才能起作用。

上述两种方法都可以实现同样的效果。但是有一点细微的差别,采用第一种方法 时,fontset 的定义是写在 ~/.emacs 中的,而 emacs 启动过程中,是先建立了 第一个窗口,然后才读取 ~/.emacs 的,建立第一个窗口时,因为还没有读到我 们定义的 fontset, 因此它会采用 fontset-default 创建第一个窗口,当读到我 们定义的 fontset 时,再进行调整,如果我们定义的 fontset 与默认的 fontset-default 字体差别比较大,就会看到emacs进行了一个调整窗口大小的动 作,这个动作延缓了 emacs 的启动过程。而采用第二种方法则不会出现这个问题, 因此推荐使用第二种方法。