EmacsElispChar

字符类型

在 Emacs Lisp 中, 字符和 integer 没有区别。 也就是说字符 A 和 65 是完全一样 的。

因为字符和 integer 完全一样,那么 integer 的 read syntax 也就是字符的 read syntax 。很明显,这样表示字符不是一个好方法,任何人把 65 看作字母 A 都是很困难的。 于是有下面的read syntax 来表示一个字符。 同样道理,因为字符和 integer 没有任何区 别,下面介绍字符的 read syntax 同样也适用于integer 。我想我们都会用自然的方式来 表达我们的意思。不会用65 来表达我要写一个字母 A ,也不会用 A 来表示我要得到一个 整数 65 。

一般的表示字母的字符的 read syntax 是问号后面跟一个字母。例如 `?A' 表示字母 A , `?B' 表示字母 B , ... `?Z' 表示字母 Z ,`?a' 表示字母 a , `?b' 表示字母 b , ... `?z' 表示字母 z 。

也可以用这中方式来表达一个标点符号的字符。但是最好还是使用反斜杠的 read syntax ,这样可读性更好。例如:

  ?\,   => ,
  ?\.   => .
  ?\\   => \
  ?\:   => .

可以用下面的方法表示 ASCII 控制字符。一般情况下,对于很多的应用程序,都可以 通过组合键输入 ASCII 控制字符,例如Control + A 可以输入控制字符 ASCII 1 。

     ?\a => 7                 ; `C-g'
     ?\b => 8                 ; 退格
     ?\t => 9                 ; 制表符 tab, <TAB>, `C-i'
     ?\n => 10                ; 换行, `C-j'
     ?\v => 11                ; 垂直制表符 , `C-k'
     ?\f => 12                ; 换页
     ?\r => 13                ; 回车, <RET>, `C-m'
     ?\e => 27                ; 转义字符
     ?\\ => 92                ; 反斜杠
     ?\d => 127               ; 删除 <DEL>

除了上面的特殊字母之外,`?\' 后面跟任何其他字母,都表示哪 个字符本身,例如 `?\?' 表示问号。

下面的办法可以表示所有的控制字符。用问号开头,跟一个反斜 杠,然后一个上小尖头`^',最是一个字母,字母不区分大小写。 例如 `?\^i' 和 `?\^I' 都表示制表符。也就是说,在很多情况 下是没有办法区分 C-S-a 和 C-a 的,没有办法判断是否 shift 也参与到了组合键中。

^' ,还可以用 `C-' 。例如 `?\C-i'

 ?\^A 或者 ?\C-A  表示控制字符 1
 ?\^B 或者 ?\C-B  表示控制字符 2
 ?\^C 或者 ?\C-C  表示控制字符 3
 ?\^D 或者 ?\C-D  表示控制字符 4
 ?\^E 或者 ?\C-E  表示控制字符 5
 ?\^F 或者 ?\C-F  表示控制字符 6
 ?\^G 或者 ?\C-G  表示控制字符 7   响零
 ?\^H 或者 ?\C-H  表示控制字符 8   BS, 退格
 ?\^I 或者 ?\C-I  表示控制字符 9 , 制表符
 ?\^J 或者 ?\C-J  表示控制字符 10, 换行
 ?\^K 或者 ?\C-K  表示控制字符 11, 垂直制表符
 ?\^L 或者 ?\C-L  表示控制字符 12, 换页
 ?\^M 或者 ?\C-M  表示控制字符 13, 回车
 ?\^N 或者 ?\C-N  表示控制字符 14,
 ?\^O 或者 ?\C-O  表示控制字符 15,
 ?\^P 或者 ?\C-P  表示控制字符 16,
 ?\^Q 或者 ?\C-Q  表示控制字符 17
 ?\^R 或者 ?\C-R  表示控制字符 18
 ?\^S 或者 ?\C-S  表示控制字符 19
 ?\^T 或者 ?\C-T  表示控制字符 20
 ?\^U 或者 ?\C-U  表示控制字符 21
 ?\^V 或者 ?\C-V  表示控制字符 22
 ?\^W 或者 ?\C-W  表示控制字符 23
 ?\^X 或者 ?\C-X  表示控制字符 24
 ?\^Y 或者 ?\C-Y  表示控制字符 25
 ?\^Z 或者 ?\C-Z  表示控制字符 26
 ?\^? 或者 ?\C-?  表示控制字符 127

如果表示文件或者 string 中的控制字符,那么最好使用 `^' 的表 达方式,如果是用来表示键盘输入,那么最好使用 `C-' 。

用问号和反斜杠开头后面跟着一个八进制的数,可以表示一个字符。

   ?\012 => 10         ?\n => 10         ?\C-j => 10
   ?\101 => 65         ?A => 65

除了控制字符之外,还有 meta 字符,也就是用 meta (某些键盘上 是 alt) 加一个字母键输入的特殊字符。用这种组合键表示这种特 殊字符的时候,可以用 `\M-'。

一个 integer 有 28 个比特,从零开始记数,最高位,也就是第 27 个 bit, 是 0 或者 1 ,表示是否是 meta 字符。例如 `?\M-a' 表示 -134217631 , 十六进制是 #x8000061,可以看到 表示字母 a ,最高位是 0 ,表示是meta 的组合键。 meta 字符是可以区分大小写的。

我们知道可以用 `?\'开头表示一个字符,那么可以在 `?\' 后面插 入`M-' ,表示某个字符对应的 meta 字符。 例如

   `?\M-a' 表示 M-a ,
  `?\M-A' 表示 M-S-a , 或者 M-A
  `?\M-\101' 表示同样表示 M-S-a ,或者 M-A
  `?\M-\C-b 表示 M-C-b ,

八进制 101 是十进制的 65 ,也就是 A ASCII 。类似 meta 组合键,还有两个专门的 bit 表示 Control 和 shift 是否按下,他们分别是第 26 位和第 25 位。但是要注意到, 并不是所有的控制终端都能产生这样的组合键,只有一些 X 终端或者其他的特别的终端 才行。普通终端是不能区分这些组合键,也就没有办法向 Emacs 报告产生了这种组合键。 `C-' 和 `S-' 分别表示第26位和第25位置位。`?\C-\S-o' 或者 `?\C-\S-O' 表示 C-S-o 的组合键。

在 X Windows 系统定义了另外三个修饰比特,类似于 meta, control 和 shift , 他们 分别是 hyper , super, 和 alt 。和前面类似,他们的表示方式是 `H-' , `s-' 和 `A-' 。 对于我使用的键盘来说,ALT 表示 meta , Windows 键(control 和 ALT) 中间 的键) 表示 super 。这样,`?\H-\M-\A-x' 表示Alt-Hyper-Meta-x。 super 对应第 23 位比特,alt 对应第 22 位比特,hyper 对应第 24 位比特。