LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2751|回复: 16

emacs23,不同encodings设不同xft字体?

[复制链接]
发表于 2007-8-13 18:26:44 | 显示全部楼层 |阅读模式
大家普遍用的是create-fontset-from-fontset-spec,但这个写法好像都是用传统X核心字体来设置不同字体不同encoding的,不知如何做到不同encoding设不同xft字体?

有几个函数是与set-font有关的,不知如何使用,网上搜用的人不多,要不就是一个default font,再设一个雅黑对应gbk,不知多encodings的写法是什么?
谢谢!

我目前用的是:
  (set-default-font "consolas-12")
  (set-fontset-font "fontset-default"
                    'han '("Microsoft YaHei" . "unicode-bmp"))
发表于 2007-8-14 21:07:04 | 显示全部楼层
如果你所说的 encoding 是指 LANG、LC_CTYPE 这样的环境变量的话,这样是不是可以:
  1. (let ((encoding (getenv "LANG")))
  2.   (cond ((equal encoding "zh_CN")
  3.          t)))
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-16 12:05:06 | 显示全部楼层
谢谢回复,我指的encoding是gbk, gb2312, gb18030之类。

比如我要设gbk的字体为xft的yahei,是不是可以再多写一行:
  (set-fontset-font "fontset-default"
                    'gbk '("Microsoft YaHei" . "unicode-bmp"))
这样呢?还有,我也不知这样的写法是不是对的。


现在网上一般的设置方法类似于:
(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*-*"))

这样的字体设定明显是老的X核心字体设定方法。我觉得正宗的XFT字体设定应该是这样:
(create-fontset-from-fontset-spec
(concat
"courier-12,"
"chinese-gb2312:simsun-12,"
"mule-unicode-0100-24ff:simsun-12,"
"korean-ksc5601:simsun-12,"
"chinese-cns11643-5:simsun-12
"chinese-cns11643-6:simsun-12
"chinese-cns11643-7:simsun-12
"sjis:simsun-12"))
但这种写法从语法上说也明显是错误的,所以我不明白应该怎么写。
回复 支持 反对

使用道具 举报

发表于 2007-8-16 14:42:57 | 显示全部楼层
首先,你要搞清楚 Emacs 正在使用的 fontset,修改那个 fontset 才有效。

  1. (frame-parameter nil 'font)
复制代码


这个可以得到当前的 frame 所使用的 fontset 的名称。为了简便,你可以使用它的简称:

  1. (assoc (frame-parameter nil 'font) fontset-alias-alist)
复制代码


这个结果的 cdr 就是 Emacs 正在使用的 fontset 的简称了。下面要做的,就是修改这个 fontset。当然,这是通过 set-fontset-font 来实现的。这里我们使用编码来作为 set-fontset-font 的参数。中文的 script 都是 han,所以调用的结构大致是这样:

  1. (set-fontset-font (cdr (assoc (frame-parameter nil 'font)
  2.                               fontset-alias-alist))
  3.                   'han
  4.                   "font-name")
复制代码


在这里将 font-name 换成特定的字体名称就可以了。例如:

  1. (set-fontset-font (cdr (assoc (frame-parameter nil 'font)
  2.                               fontset-alias-alist))
  3.                   'han
  4.                   "-outline-新宋体-*-*-*-*-*-*-*-*-*-*-gb2312.1980-0")
复制代码


如果你希望用 create-fontset-from-fontset-spec,方法是类似的,只是最终需要用 set-default-font 来将 Emacs 使用的 fontset 设置为生成的那个。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-17 06:57:14 | 显示全部楼层
非常感谢!可能是我没有表达清楚,您的写法:
        -outline-新宋体-*-*-*-*-*-*-*-*-*-*-gb2312.1980-0
这不是用的xft的字体,xft字体的写法一般就写出調用字体名就OK了,比如:
        “新宋体”
就可以了。

并且这样是不是所有汉字都用的是gb2312编码的新宋体呢?现在我不理解的是如何设置哪个编码用某个特定xft字体,汉字也有很多编码,比如gb2312和gbk,如果我想gb2312用一个字体,而gbk用另一个字体,不知该所如何设置?
不知现在表达清楚没有? ;p

难道是这样:
  (set-fontset-font (frame-parameter nil 'font)
                    'han '("Microsoft YaHei" . "gbk"))
  (set-fontset-font (frame-parameter nil 'font)
                    'han '("Microsoft YaHei" . "gb2312"))
  (set-fontset-font (frame-parameter nil 'font)
                    'han '("Microsoft jhenghei" . "big-5"))
一个编码写一行吗?
除了han的script,还有kana,symbol和cjk-misc等,kana好像对应日文,cjk-misc是不是对应汉字标点,而symbol对应的是不是英文的符号?
不知这些相关资料从哪可以查到,可以指点一下吗?
回复 支持 反对

使用道具 举报

发表于 2007-8-17 18:22:27 | 显示全部楼层
编码名称和 script 之间的对应关系定义在变量 charset-script-alist 中。通过下面的方式来得到一个编码名称对应的 script:
  1. (cdr-safe (assoc (intern "chinese-gbk") charset-script-alist))
复制代码

你的另一个需求是对不同的编码使用不同的字体。因为各种中文编码对应的 script 都是 han,所以仅仅用 han 无法实现这个需求。我想到了一个方法,但没有实验过,你可以试试。方法是这样的:首先,我们设置最大的那个字符集的字符的字体。然后,我们设置较小的字符集的字符的字体。这样,同时在两个字符集中的字符的字体就可以使用一种新的字体了,而只在较大的字符集中的字符,则使用首先指定的那个字体。下面是设置的方法:
  1. (set-fontset-font "fontset-name"
  2.                   'chinese-gbk
  3.                   "font-name-1")
  4. (set-fontset-font "fontset-name"
  5.                   'chinese-gb2312
  6.                   "font-name-2")
复制代码

你试一下,看看是否有效

最后,你可以通过查看 charset-list 来获得所有可用字符集的列表。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-18 08:45:35 | 显示全部楼层
谢谢,本来想测一下,设一个big5的字体,却发现在emacs-w3m里,繁体的网站中的繁体的编码它都识别为了gbk,而不是预期的big5,而在opera里显示的是big5,不知是emacs-w3m的问题还是其它的设定问题?
我是全系统的en_US.utf8。emacs也是

P.S. 我用
(set-fontset-font "fontset-name"                                                               
             'chinese-gbk                                                               
             "simsun")
提示:error: Fontset `fontset-name' does not exist

而用
(set-fontset-font (frame-parameter nil 'font)
                    'chinese-gbk
                    "simsun")
没有错误,但是没有效果。。。
回复 支持 反对

使用道具 举报

发表于 2007-8-18 10:58:03 | 显示全部楼层
Post by LaoLang_cool
谢谢,本来想测一下,设一个big5的字体,却发现在emacs-w3m里,繁体的网站中的繁体的编码它都识别为了gbk,而不是预期的big5,而在opera里显示的是big5,不知是emacs-w3m的问题还是其它的设定问题?
我是全系统的en_US.utf8。emacs也是


我猜想是因为 gbk 的优先级比 big5 高,而 gbk 的编码包含了 big5 的字符。
  1. (coding-system-priority-list)
  2.      => (chinese-gbk iso-2022-cn chinese-iso-8bit utf-8
  3.          iso-2022-7bit iso-2022-8bit-ss2 emacs-mule raw-text
  4.          iso-2022-jp in-is13194-devanagari utf-16
  5.          utf-16be-with-signature utf-16le-with-signature
  6.          utf-16be utf-16le japanese-shift-jis undecided)
复制代码

具体的就不太清楚了,呵呵。

Post by LaoLang_cool
P.S. 我用
(set-fontset-font "fontset-name"                                                               
             'chinese-gbk                                                               
             "simsun")
提示:error: Fontset `fontset-name' does not exist


这是自然咯,因为 fontset-name 和 font-name-? 都是例子,而不是真正的值嘛

Post by LaoLang_cool
而用
(set-fontset-font (frame-parameter nil 'font)
                    'chinese-gbk
                    "simsun")
没有错误,但是没有效果。。。


这是因为 simsun 这个字体名无效,换成有效的字体名就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-18 11:24:03 | 显示全部楼层
Thanks for your patient ;p
字体没效?
你指的有效是:
-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*
这样吗?

那启不是又回到原点了,这样的写法調用的不是xft字体,而是传统的X核心字体哦。XFT字体一般只用写一个字体名字就OK了。
回复 支持 反对

使用道具 举报

发表于 2007-8-20 09:24:52 | 显示全部楼层
试了一下,在打开 font backend 时确实是没有效果的,原因现在还不知道。在这种方式里只能用 set-default-font 才能起作用。但是不打开 font backend 时,修改就是有效果的了。(而且在打开 font backend 时,即使用 -*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-* 这样的字体名字也是没有效果的。)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表