42.16.4 其他显示规范

以下是可在 display 文本属性中使用的其他类型显示规范。

string

显示 string 以替代拥有该属性的文本。

不支持递归显示规范—string 自身的 display 属性(若有)不会生效。

(image . image-props)

此类显示规范为图像描述符(see 图像描述符)。用作显示规范时,表示显示图像以替代拥有该规范的文本。

(slice x y width height)

该规范与 image 一同使用,指定要显示图像的 切片(slice)(局部区域)。更准确地说,规范应采用以下格式:

 ((slice x y width height) image-desc)

其中 image-desc 为上述图像描述符。元素 xy 指定切片在图像内的左上角坐标;widthheight 指定切片宽高。整数单位为像素。0.0–1.0 范围内的浮点数表示占整个图像宽度或高度的比例。

((margin nil) string)

此格式的显示规范表示在与原文本相同位置显示 string 以替代该文本。它等价于直接使用 string,只是作为边距显示的特例实现(see 在边距中显示)。

(left-fringe bitmap [face])
(right-fringe bitmap [face])

对某行文本的任意字符设置此显示规范,会使该行的左或右 fringe 显示指定的 bitmap,而非拥有该规范的字符。可选参数 face 指定用于位图显示颜色的文本视觉样式。详情参见 See 侧边栏位图

还可以通过 show-help-function 机制,使用 left-fringe-helpright-fringe-help 文本属性为 fringe 位图添加上下文帮助信息(see 具有特殊含义的文本属性)。

(space-width factor)

该显示规范会影响拥有此规范文本内的所有空格字符,使其显示宽度为正常宽度的 factor 倍。factor 应为整数或浮点数。空格以外的字符不受影响;特别地,该规范对制表符无作用。

(min-width (width))

该显示规范确保拥有它的文本在显示时至少占据 width 空间,若文本短于该宽度则在末尾添加空白拉伸。文本按参数标识进行划分,这也是参数为单元素列表的原因。例如:

(insert (propertize "foo" 'display '(min-width (6.0))))

这会在 ‘foo’ 后添加填充,使总宽度达到六个普通字符宽度。注意受影响字符通过显示属性中的 (6.0) 列表按 eq 比较识别。width 可以是整数或浮点数,指定文本所需最小宽度(see 空格的像素规范)。

(height height)

该显示规范用于放大或缩小文本。height 的可用形式如下:

(+ n)

表示使用大 n 级字号的字体。级(step) 由可用字体集合定义—具体为除高度外在所有属性上均匹配该文本其他指定的字体。每个存在合适字体的尺寸计为一级。n 应为整数。

(- n)

表示使用小 n 级字号的字体。

数字 factor

数字 factor 表示使用高度为默认字体 factor 倍的字体。

符号 function

符号为计算高度的函数。调用时以当前高度为参数,应返回新的使用高度。

其他形式 form

height 值不符合前述形式,则视为表达式。Emacs 会对其求值以获得新高度,求值时符号 height 绑定为当前指定字体高度。

(raise factor)

此类显示规范使作用文本相对于行基线升高或降低,主要用于支持下标与上标显示。

factor 必须为数字,按受影响文本高度的倍数解释。为正则字符上浮显示,为负则下沉显示。

注意,若文本同时设有 height 显示规范且出现在 raise 之前,后者会以像素为单位影响上浮或下沉量,因为该计算基于被提升文本的高度。因此,若要显示小于普通文本高度的下标或上标,建议在 height 之前指定 raise

你可以为任意显示规范添加条件。方法是将其包装为格式 (when condition . spec) 的列表。此时规范 spec 仅在 condition 求值为非 nil 时生效。求值期间,object 绑定为拥有该条件 display 属性的字符串或缓冲区,positionbuffer-position 分别绑定为 object 内位置与发现 display 属性的缓冲区位置。当 object 为字符串时两者可能不同。

注意 condition 仅在重绘检查该显示规范所在文本时求值,因此该特性最适合相对稳定的条件,即对每个特定缓冲区位置,每次求值结果均相同。若同一文本位置结果会改变(例如结果依赖光标位置),条件规范可能无法达到预期,因为重绘仅检查有理由认为自上一显示周期以来发生变化的缓冲区文本部分。