36.3 语法表函数

本节介绍用于创建、访问和修改语法表的函数。

Function: make-syntax-table &optional table

该函数创建一个新的语法表。若 tablenil,新语法表的父表为 table; 否则,父表为标准语法表。

新语法表中,所有字符初始均被指定为 “继承(inherit)” (‘@’) 语法分类,即其语法属性从父表继承而来 (see 语法类别表)。

Function: copy-syntax-table &optional table

该函数构造 table 的副本并返回。若省略 table 或其值为 nil,则返回标准语法表的副本。 若 table 不是合法的语法表,函数将抛出错误。

Command: modify-syntax-entry char syntax-descriptor &optional table

该函数根据 syntax-descriptor 设置字符 char 的语法条目。char 必须是单个字符, 或格式为 (min . max) 的 cons 单元;后者表示函数会为 minmax(包含两端)范围内的所有字符设置语法条目。

语法修改仅作用于 table(默认使用当前缓冲区的语法表),不会影响其他语法表。

参数 syntax-descriptor 是语法描述符,即一个字符串:首字符为语法分类标识,后续字符可选指定匹配字符和语法标记。See 语法描述符。 若 syntax-descriptor 不是合法的语法描述符,函数将抛出错误。

该函数始终返回 nil,表中该字符原有的语法信息会被覆盖。

Examples:

;; 将空格字符设置为空白分类。
(modify-syntax-entry ?\s " ")
     ⇒ nil

;; 将 ‘$’ 设置为左括号字符,
;;   匹配的右括号为 ‘^’。
(modify-syntax-entry ?$ "(^")
     ⇒ nil

;; 将 ‘^’ 设置为右括号字符,
;;   匹配的左括号为 ‘$’。
(modify-syntax-entry ?^ ")$")
     ⇒ nil

;; 将 ‘/’ 设置为标点字符,
;;   同时作为注释起始序列的第一个字符、
;;   注释结束序列的第二个字符。
;;   该配置用于 C 语言模式。
(modify-syntax-entry ?/ ". 14")
     ⇒ nil
Function: char-syntax character

该函数返回字符 character 的语法分类,以其标识字符表示 (see 语法类别表)。 函数仅返回语法分类,不包含匹配字符或语法标记。

以下示例适用于 C 语言模式(使用 string 便于查看 char-syntax 返回的字符)。

;; 空格字符属于空白语法分类。
(string (char-syntax ?\s))
     ⇒ " "

;; 斜杠字符属于标点语法分类。
;; 注意该 char-syntax 调用不会显示
;; 它同时属于注释起始/结束序列。
(string (char-syntax ?/))
     ⇒ "."

;; 左括号字符属于左括号语法分类。
;; 注意该 char-syntax 调用不会显示
;; 其匹配字符为 ‘)’。
(string (char-syntax ?\())
     ⇒ "("
Function: set-syntax-table table

该函数将 table 设置为当前缓冲区的语法表,并返回 table

Function: syntax-table

该函数返回当前语法表,即当前缓冲区使用的语法表。

Command: describe-syntax &optional buffer

该命令在帮助缓冲区中显示 buffer(默认为当前缓冲区)的语法表内容。

Macro: with-syntax-table table body…

该宏以 table 作为当前语法表执行 body,执行完成后恢复原语法表,并返回 body 中最后一个表达式的结果。

由于每个缓冲区都有独立的当前语法表,更精确的描述是:with-syntax-table 会临时修改宏开始执行时当前活跃缓冲区的语法表,其他缓冲区不受影响。