自动插入字符,即用户按键时插入到缓冲区中的字符(see 用户级插入命令), 通常会继承前一个字符的相同属性。这被称为属性的继承(inheritance)。
与之相对,Lisp 程序可以选择带继承或不带继承地插入文本,具体取决于所使用的插入原语。
普通的文本插入函数(如 insert)不会继承任何属性,插入的文本仅携带被插入字符串自身的属性,
无其他附加属性。这对于在不同上下文间复制文本的程序(例如移入或移出剪切环)是合适的。
若要带继承地插入文本,请使用本节介绍的专用原语。自动插入字符之所以会继承属性,
正是因为它们通过这些原语实现。
进行带继承的插入时,哪些属性会被继承、从何处继承,取决于哪些属性是粘性(sticky)的。 在某个字符之后插入内容,会继承该字符标记为后粘性(rear-sticky)的属性。 在某个字符之前插入内容,会继承该字符标记为前粘性(front-sticky)的属性。 若同一属性在前后两侧存在不同的粘性取值,则优先使用前一个字符的值。
默认情况下,文本属性为后粘性、非前粘性;因此默认行为是继承前一个字符的全部属性, 不从后一个字符继承任何属性。
可以通过两个特定文本属性 front-sticky 和 rear-nonsticky,
以及变量 text-property-default-nonsticky 控制各类文本属性的粘性。
可以使用该变量为指定属性设置不同的默认值,也可以使用上述两个文本属性,
对文本任意位置的具体属性单独设置粘性或非粘性。
若某个字符的 front-sticky 属性为 t,则其所有属性均为前粘性。
若 front-sticky 属性为一个列表,则该字符的粘性属性为列表中出现的属性名。
例如,若某字符的 front-sticky 属性值为 (face read-only),
则在该字符前插入内容可继承其 face 属性与 read-only 属性,
其他属性不继承。
rear-nonsticky 属性作用方式相反。大多数属性默认为后粘性,
因此 rear-nonsticky 用于标记不具备后粘性的属性。
若某字符的 rear-nonsticky 属性为 t,则其所有属性均非后粘性。
若 rear-nonsticky 为列表,则属性默认为后粘性,除非其名称出现在列表中。
该变量保存一个关联列表,定义各类文本属性的默认后粘性。
每个元素格式为 (property . nonstickiness),
用于指定特定文本属性 property 的粘性。
若 nonstickiness 非 nil,表示属性 property
默认为后非粘性。由于所有属性默认均为前非粘性,这会使 property
在默认情况下双向均无粘性。
文本属性 front-sticky 与 rear-nonsticky 在使用时,
优先级高于 text-property-default-nonsticky 中指定的默认非粘性设置。
以下是带属性继承地插入文本的函数:
插入字符串 strings,用法与函数 insert 相同,
但会从相邻文本继承所有粘性属性。
插入字符串 strings,用法与函数 insert-before-markers 相同,
但会从相邻文本继承所有粘性属性。
不执行继承的普通插入函数,See 插入文本。