emacs encoding,font,...

emacs encoding,font,... (by hanlray(at)gmail.com)

encoding

如果emacs识别的编码是错误的,可以用C-x r CODING-SYSTEM来重新指定

emacs在内部使用它自己的coding system,在读入文件时把该文件使用的coding system转换为内部使用的coding sytem,在写入文件时把内部使用的coding system转换为该文件使用的coding system。

字体

emacs用fontset指定字体。一个fontset对一组script分别指定字体。用create-fontset-from-fontset-spec来创建fontset:
(create-fontset-from-fontset-spec  (concat   "-outline-Courier New-normal-r-*-*-18-*-*-*-c-*-fontset-gbk,"   "han:-outline-新宋体-normal-r-*-*-18-*-*-*-c-*-iso10646-1")) 
fontset-gbk就是新创建的fontset的名字,当一个frame使用该fontset作为其font属性,该frame的default font name就是用iso8859-1替换该fontset名字而得到的字体名。

han是一个script name,为了向后兼容,也可以使用charset名,emacs通过变量charset-script-alist来映射charset到script

用set-fontset-font来增加或修改某个fontset,如:

(set-fontset-font "fontset-gbk" 'han "-outline-新宋体-normal-r---18----c--iso10646-1")

最后用

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

来指定使用该fontset

tips

(frame-parameter 'font)得到指定的fontset名,若为nil则为当前选择的frame

language environment

对于像unicode这种国际化的编码,某些字符是多个script共用的(比如中、日、韩在unicode里就共用了一些字符),如果判断这种字符的所属的script有误,就会出现不期望的结果:

在LC_CTYPE为非中文locale的情况下,使用UTF-8 language environment,打开一个包含“笔记”两字的utf-8编码的文件,“笔”字将会显示为一个方框(在没有安装日文字体的情况下)。

这个“笔”字就被emacs判断为日语的字符,而我们没有日文字体,所以就显示为了一个方框。

你必须告诉把你的语言信息告诉emacs,这可以通过以下方式:

  • locale:设置LC_CTYPE=zh_CN就能解决上面的问题
  • emacs的language environment:如果你不想改变locale,可以改变emacs的language environment,事实上language environment就是为此目的设立的,改变locale的方法实际上也是间接改变language environment—当没有指定language enviroment时,emacs会根据当前的locale推测一个language environment,这在LC_CTYPE=zh_CN的locale下推测的结果是Chinese-GB,正是我们想要设置的。

     

language environment还给一些编码相关的变量设置默认值,比较重要的有:

  • 优先编码列表 当读入一个文件时,以该列表的顺序来识别文件的编码,用prefer-coding-system在该列表首插入一个编码
  • default-buffer-file-coding-system 新建文件的默认编码

     

C-h L来查看当前或其他language environment的信息,使用M-x set-lanaguage-environment来修改。

C-h C查看指定的coding system,如果不指定参数则显示当前所有的coding system设置,包括优先编码列表

troubles

在en_US.UTF-8下推测的language environment是UTF-8,按理说这时相关的编码变量应该也被设置为UTF-8 language environment设置的默认值,不过在我的环境下这些变量的值似乎和UTF-8 language environment无关,于是不得不在.emacs下明确设置一下:
  (if (equal current-language-environment "UTF-8")       (prefer-coding-system 'gb2312) 	  (prefer-coding-system 'Utf-8) 	  )      )   )   (add-hook 'set-language-environment-hook 'utf8gbk)   (set-lanaguage-environment 'UTF-8) 
在UTF-8这个language environment下,emacs并不能自动识别gbk编码的文件,因为其缺省设置的优先编码列表没有gbk,上面的lisp对UTF-8 language environment做了定制,之所以又加了一次utf-8编码是因为希望在UTF-8这个language environment下首选的编码是utf-8。

tips

用C-u C-x =(describe char)查看buffer中某个字符的信息

你可能感兴趣的:(Software)