由于字符本质上是整数,字符的打印形式是一个十进制整数。这虽然也可以作为字符的读取语法,但在 Lisp 程序中这样写字符并不清晰。你应当 始终 使用 Emacs Lisp 为字符提供的专用读取语法格式,这些语法格式以问号开头。
字母与数字字符的常用读取语法是:问号后跟字符本身。例如:‘?A’ 表示字符 A,‘?B’ 表示字符 ‘B’,‘?a’ 表示字符 a。
示例:
?Q ⇒ 81 ?q ⇒ 113
标点符号也可以使用同样的语法。但是,如果该标点在 Lisp 中具有特殊语法含义,就必须用 ‘\’ 进行转义。例如,‘?\(’ 用来表示左括号字符。同理,如果字符是 ‘\’ 本身,必须用第二个 ‘\’ 转义:‘?\\’。
可以用以下写法表示控制字符:control-g:‘?\a’、退格符:‘?\b’、制表符:‘?\t’、换行符:‘?\n’、垂直制表符:‘?\v’、换页符:‘?\f’、空格符:‘?\s’、回车符:‘?\r’、删除符:‘?\d’、转义符:‘?\e’。(‘?\s’ 后面跟一个减号时含义不同 —— 它会将 Super 修饰符应用到后面的字符上。)如下所示:
?\a ⇒ 7 ; control-g, C-g ?\b ⇒ 8 ; 退格 backspace, BS, C-h ?\t ⇒ 9 ; 制表符 tab, TAB, C-i ?\n ⇒ 10 ; 换行 newline, C-j ?\v ⇒ 11 ; 垂直制表符 vertical tab, C-k ?\f ⇒ 12 ; 换页符 formfeed character, C-l ?\r ⇒ 13 ; 回车符 carriage return, RET, C-m ?\e ⇒ 27 ; 转义符 escape character, ESC, C-[ ?\s ⇒ 32 ; 空格 space character, SPC ?\\ ⇒ 92 ; 反斜杠 backslash character, \ ?\d ⇒ 127 ; 删除符 delete character, DEL
这些以反斜杠开头的序列称为 转义序列escape sequences,因为反斜杠起到了转义字符的作用;这与 ESC 字符本身无关。‘\s’ 用于字符常量;在字符串常量中直接写空格即可。
对没有特殊转义含义的字符前面加反斜杠是允许且无害的,例如 ‘?\+’ 等价于 ‘?+’。大多数字符没有必要加反斜杠,但以下字符必须加反斜杠: ‘()[]\;"’,为避免混淆 Emacs 的 Lisp 编辑命令,以下字符建议加反斜杠:‘|'`#.,’。对于外观类似上述 ASCII 字符的 Unicode 字符,也应加反斜杠,避免阅读代码的人混淆。Emacs 会高亮一些未转义、容易混淆的字符(如‘‘’左单引号、‘’’右单引号)来提醒你。你也可以在空格、制表符等空白字符前加反斜杠。不过,更清晰的做法是使用易读的转义序列(如 ‘\t’ 或 ‘\s’),而不是直接写制表符或空格这类空白字符。(如果你确实写成「反斜杠 + 空格」的形式,应当在该字符常量后面多加一个空格,以便与后续文本分隔。)