君子剑的密室

Sunday, July 22, 2007

Emacs unicode branch(emacs23)的字体管理

Emacs从Unicode Branch(所谓的emacs23)开始支持XFT,从而实现了字体渲染的Antialias效果和新的字体描述方式(与之相对地,之前的emacs使用X Logical Font Description,一个完整的字体描述涉及到15个域,比如-adobe-courier-medium-r-normal--8-80-75-75-m-50-iso8859-1)。因此,emacs的字体配置也需要相应改变。

另外,和其他的支持XFT的程序(库)不同的是,emacs并没有采纳Fontconfig字体管理子系统,所以emacs并不能像那些程序那样把具体的字体替换管理工作交给系统(Fontconfig子系统)完成(比如,gvim可以完全放心的使用gnome/kde系统的monospace虚拟字体,而不需要关心实现的细节)。我在这里简要介绍一下Fontconfig子系统。用户的机器上往往包含有很多套字体,这些字体的风格、用途、码字集都往往各不相同。所以,针对任意一个码字,系统需要知道该用那个字体去显示(如果有多个字体包含有这个码字),或者该替换成哪个字体去显示(如果当前使用的字体并不包含这个码字)。这就是Fontconfig的功能。举个例子,因为绝大多数的中文字体都含有常见的Latin字符,同时又因为几乎所有的中文字体的Latin字符的效果都不如专门的西文字体,所以用户往往会倾向于用特定的西文字体来显示西文字符,和只使用中文字体来显示中文字符。这时,用户就需要Fontconfig(或者类似的机制)来自动完成这件事情。

Emacs的字体设置可以出现在三个地方:命令行参数、X Resources文件,以及.emacs。我这里只给出最后一种方式。字体设置的思路很简单:对于常规的西文字符使用特定的西文字体(某个用户所喜爱的mono字体),对于中文字符和中文标点使用特定的中文字体(某个用户所喜爱的中文字体),对于其他的漏网之鱼则使用其他字体来补全(往往是一些很不常见的字符)。

(set-default-font "Consolas-13")
;; 这是选定的西文字体。用户可以替换为任何自己想要的mono字体,比如
;; Bitstream Vera Sans Mono-10

(set-fontset-font (frame-parameter nil 'font) 'unicode '("Microsoft YaHei" . "unicode-bmp") 'nil 'append)
;; 类似的,可以把Yahei替换为其他中文字体
;; 'unicode表示针对所有的unicode字符集
;; 'append表示这个字体设置只作为前一个设置的补充,而非强制替代
;; 因为这个是第一个fontset设置,所以这个参数并非必要

(set-fontset-font (frame-parameter nil 'font) 'unicode '("Arial Unicode MS" . "unicode-bmp") 'nil 'append)
;; 这里使用Arial Unicode MS字体作为补漏
;; 注意最后的'append。没有这个参数的话,很多Yahei和Arial Unicode MS
;; 共有字符将会由后者显示

以上就简单地实现了模拟Fontconfig的效果:西文字符和标点用Consolas,超出的部分首先用Yahei来显示(因为Yahei含有CJK ExtA,所以这部分字符也会正常显示),剩余的某些字符再用Arial Unicode MS来显示。

0 Comments:

Post a Comment

<< Home