42.20.3 创建按钮

按钮与一段文本相关联,通过覆盖层或文本属性 保存按钮专属信息,所有属性均从按钮类型初始化 (默认使用内置按钮类型 button)。 与所有 Emacs 文本一样,按钮的外观由 face 属性控制; 默认情况下(通过从 button 类型继承的 face 属性) 显示为简单下划线,类似常见网页链接。

为方便使用,提供两类按钮创建函数: 一类是为缓冲区中已有区域添加按钮属性,命名为 make-...button; 另一类会同时插入按钮文本,命名为 insert-...button

所有按钮创建函数均接受 &rest 参数 properties, 它是一系列 property value 键值对, 用于指定要添加到按钮的属性;见 按钮属性。 此外,可以使用关键字参数 :type 指定要继承属性的按钮类型;见 按钮类型。 创建时未显式指定的属性会从按钮类型继承(如果该类型定义了该属性)。

以下函数使用覆盖层(see 覆盖层)保存按钮属性:

Function: make-button beg end &rest properties

在当前缓冲区中从 begend 创建一个按钮,并返回该按钮。

Function: insert-button label &rest properties

在光标位置插入一个标签为 label 的按钮,并返回该按钮。

以下函数功能类似,但使用文本属性(see 文本属性) 保存按钮属性。这类按钮不会向缓冲区添加标记, 因此即使按钮数量极大,缓冲区编辑也不会变慢。 不过,如果文本上已存在文本视觉样式属性 (例如字体锁定模式设置的样式),按钮样式可能无法正常显示。 这两个函数均返回新按钮的起始位置。

Function: make-text-button beg end &rest properties

在当前缓冲区中从 begend 使用文本属性创建按钮。

Function: insert-text-button label &rest properties

在光标位置使用文本属性插入标签为 label 的按钮。

Function: buttonize string callback &optional data

有时更适合先将字符串转为按钮,而不立即插入缓冲区, 例如在创建后续可能插入缓冲区的数据结构时。 该函数将 string 转为这类按钮字符串, 用户点击按钮时会调用 callback。 可选参数 data 会作为调用 callback 时的参数。 如果为 nil,则使用按钮本身作为参数。

Function: buttonize-region start end callback &optional data help-echo

有时更适合将缓冲区中已有的文本转为按钮,而非插入新文本。 该函数将 startend 的区域转为按钮。 参数 callbackdata 的含义与 buttonize 相同。 可选参数 help-echo 用作按钮的 help-echo 属性。