42.12.5 文本视觉样式重映射

变量 face-remapping-alist 用于对文本视觉样式的外观进行缓冲区局部或全局修改。 例如,它被用于实现 text-scale-adjust 命令(see Text Scale in The GNU Emacs Manual)。

Variable: face-remapping-alist

该变量的值是一个关联列表,元素形式为 (face . remapping)。 这会让 Emacs 在显示所有带有 face 文本视觉样式的文本时,使用 remapping 而非 face 的普通定义。

remapping 可以是任何适用于 face 文本属性的样式规范:可以是一个文本视觉样式(即样式名或属性/值对的属性列表), 或是一个文本视觉样式列表。详细说明请参考 具有特殊含义的文本属性 中对 face 文本属性的描述。 remapping 作为重映射后文本视觉样式的完整规范—它会替换 face 的普通定义,而非对其进行修改。

如果 face-remapping-alist 是缓冲区局部变量,其局部值仅在该缓冲区中生效。 如果 face-remapping-alist 中包含仅适用于特定窗口的文本视觉样式,通过使用 (:filtered (:window param valspec),该文本视觉样式仅在匹配过滤条件的窗口中生效(see 具有特殊含义的文本属性)。 要临时关闭文本视觉样式过滤,可以将 face-filters-always-match 绑定为非 nil 值,此时所有样式过滤都会匹配任意窗口。

注意:文本视觉样式重映射是非递归的。如果 remapping 直接或通过其中某个文本视觉样式的 :inherit 属性 引用了同名的 face,该引用会使用 face 的普通定义。例如,如果在 face-remapping-alist 中使用如下条目重映射 mode-line 文本视觉样式:

(mode-line italic mode-line)

那么 mode-line 文本视觉样式的新定义会继承自 italic 文本视觉样式, 以及 mode-line 文本视觉样式的 普通(未重映射)定义。

下列函数为 face-remapping-alist 实现了更高层级的接口。 大多数 Lisp 代码应使用这些函数而非直接设置 face-remapping-alist, 以避免覆盖其他地方设置的重映射。这些函数专为缓冲区局部重映射设计, 因此它们都会附带将 face-remapping-alist 设为缓冲区局部变量的副作用。 它们管理的 face-remapping-alist 条目形式如下:

  (face relative-spec-1 relative-spec-2 ... base-spec)

其中,如前所述,每个 relative-spec-Nbase-spec 既可以是文本视觉样式名称, 也可以是属性/值对的属性列表。每个 相对重映射(relative remapping) 条目 relative-spec-Nface-remap-add-relativeface-remap-remove-relative 函数管理; 它们适用于修改文本大小这类简单调整。基础重映射(base remapping) 条目 base-spec 优先级最低, 由 face-remap-set-baseface-remap-reset-base 函数管理; 主要供主模式在其控制的缓冲区中重映射文本视觉样式使用。

Function: face-remap-add-relative face &rest specs

该函数为当前缓冲区中的 face 文本视觉样式添加 specs 作为相对重映射。 specs 应为一个列表,每个元素可以是文本视觉样式名称,或是属性/值对的属性列表。

返回值是一个作为标识的 Lisp 对象;如果之后需要移除该重映射,可以将此对象作为参数传给 face-remap-remove-relative

;; Remap the 'escape-glyph' face into a combination
;; of the 'highlight' and 'italic' faces:
(face-remap-add-relative 'escape-glyph 'highlight 'italic)

;; Increase the size of the 'default' face by 50%:
(face-remap-add-relative 'default :height 1.5)

注意,缓冲区局部的文本视觉样式重映射在基础文本视觉样式的父样式上并不可靠(see 基础文本视觉样式)。 (这些样式用于模式行、标题行以及窗口和框架的其他基础装饰。)例如,mode-line-inactive 继承自 mode-line,但重映射 mode-line 通常不会对 mode-line-inactive 产生预期效果,尤其是在某些缓冲区局部设置时。你需要直接重映射 mode-line-inactive

Function: face-remap-remove-relative cookie

该函数移除之前由 face-remap-add-relative 添加的相对重映射。 cookie 应为添加重映射时 face-remap-add-relative 返回的 Lisp 对象。

Function: face-remap-set-base face &rest specs

该函数将当前缓冲区中 face 的基础重映射设为 specs。 如果 specs 为空,则恢复默认的基础重映射,效果类似于调用 face-remap-reset-base(见下文); 注意这与 specs 只包含单个值 nil 不同,后者效果相反(会忽略 face 的全局定义)。

该操作会覆盖继承自全局文本视觉样式定义的默认 base-spec,因此是否添加该继承关系由调用者自行决定。

Function: face-remap-reset-base face

该函数将 face 的基础重映射恢复为默认值,即继承自 face 的全局定义。