Emacs 能够在支持 freedesktop.org 桌面通知规范、MS-Windows、Haiku 以及 Android 系统上发送 通知(notifications)。
要在 POSIX 主机上使用该功能,Emacs 必须在编译时启用 D-Bus 支持,并且必须加载 notifications 库。See D-Bus in D-Bus integration in Emacs. 当支持 D-Bus 时,以下函数可用:
该函数通过 D-Bus 向桌面发送一条通知,内容由参数 params 指定。这些参数应为成对出现的关键字与值。支持的关键字与取值如下:
:bus bus使用的 D-Bus 总线。仅当需要使用非 :session 总线时才需要此参数。
:title title通知标题。
:body text通知正文文本。根据通知服务端的实现,文本可包含 HTML 标记,如 ‘"<b>bold text</b>"’、超链接或图片。HTML 特殊字符必须转义,例如 ‘"Contact <postmaster@localhost>!"’。
:app-name name发送通知的应用名称。默认值为 notifications-application-name。
:replaces-id id本条通知所要替换的通知 id。id 必须是之前调用 notifications-notify 返回的结果。
:app-icon icon-file通知图标的文件名。设为 nil 则不显示图标。默认值为 notifications-application-icon。
若值为字符串,函数会将其视为文件名并通过 expand-file-name 转为绝对路径;若为符号,则使用其名称(在遵循图标命名规范时非常有用 34)。
:actions (key title key title ...)要应用的操作列表。key 与 title 均为字符串。默认操作(通常通过点击通知触发)应使用名为 ‘"default"’ 的键。标题可以任意设置,不过具体实现可以选择不显示它。
:timeout timeout通知显示后自动关闭的超时时间,单位为毫秒。若为 −1,通知过期时间由通知服务端设置决定,并可能因通知类型不同而变化。若为 0,通知永不过期。默认值为 −1。
:urgency urgency通知优先级。可为 low、normal 或 critical。
:action-items指定此关键字时,操作的 title 字符串将被解析为图标名称。
:category category通知类型,为字符串。标准分类列表请参见 Desktop Notifications Specification。
:desktop-entry filename指定代表调用程序的桌面文件名,例如 ‘"emacs"’。
:image-data (width height rowstride has-alpha bits channels data)原始图像数据格式,依次描述宽度、高度、行跨度、是否包含透明通道、每样本位数、通道数与图像数据。
:image-path path可以是 URI(目前仅支持 ‘file://’ 协议)或 ‘$XDG_DATA_DIRS/icons’ 中符合 freedesktop.org 规范的图标主题名称。
:sound-file filename通知弹出时要播放的声音文件路径。
:sound-name name来自 ‘$XDG_DATA_DIRS/sounds’、遵循 freedesktop.org 声音命名规范的主题化声音名称,在通知弹出时播放。与图标名称类似,仅用于声音。例如 ‘"message-new-instant"’。
:suppress-sound使服务端禁止播放任何声音(如果支持该功能)。
:resident设置后,服务端在操作被触发时不会自动移除通知。通知将一直保留,直到被用户或发送方显式移除。此提示通常仅在服务端支持 :persistence 能力时有效。
:transient设置后,服务端会将通知视为临时通知,并忽略其持久化能力(如果存在)。
:x position:y position指定通知在屏幕上指向的 X、Y 坐标。两个参数必须同时使用。
:on-action function操作被触发时调用的函数。通知 id 与操作 key 将作为参数传入该函数。
:on-close function通知因超时或用户操作关闭时调用的函数。函数接收通知 id 与关闭 reason 作为参数:
expired:通知已过期
dismissed:用户已关闭通知
close-notification:通过调用 notifications-close-notification 关闭通知
undefined:通知服务端未提供原因
通知服务端支持哪些参数可通过 notifications-get-capabilities 查询。
该函数返回一个整数类型的通知 ID,可用于通过 notifications-close-notification 或另一次 notifications-notify 调用的 :replaces-id 参数管理该通知。示例:
(defun my-on-action-function (id key)
(message "Message %d, key \"%s\" pressed" id key))
⇒ my-on-action-function
(defun my-on-close-function (id reason)
(message "Message %d, closed due to \"%s\"" id reason))
⇒ my-on-close-function
(notifications-notify
:title "Title"
:body "This is <b>important</b>."
:actions '("Confirm" "I agree" "Refuse" "I disagree")
:on-action 'my-on-action-function
:on-close 'my-on-close-function)
⇒ 22
A message window opens on the desktop. Press ``I agree''.
⇒ Message 22, key "Confirm" pressed
Message 22, closed due to "dismissed"
该函数关闭标识为 id 的通知。bus 可为表示 D-Bus 连接的字符串,默认为 :session。
返回通知服务端的能力,为一个符号列表。bus 可为表示 D-Bus 连接的字符串,默认为 :session。可用能力如下:
:actions服务端会向用户提供指定的操作。
:body支持通知正文。
:body-hyperlinks服务端支持通知中的超链接。
:body-images服务端支持通知中的图片。
:body-markup支持正文文本中的标记。
:icon-multi服务端会渲染给定图像数组中所有帧的动画。
:icon-static支持显示任意图像数组的恰好一帧。与 :icon-multi 互斥。
:persistence服务端支持通知持久化。
:sound服务端支持通知声音。
其他厂商专属能力以 :x-vendor 开头,例如 :x-gnome-foo-cap。
返回通知服务端信息,为字符串列表。bus 可为表示 D-Bus 连接的字符串,默认为 :session。返回列表格式为 (name vendor version spec-version)。
服务端产品名称。
厂商名称。例如 ‘"KDE"’、‘"GNOME"’。
服务端版本号。
服务端兼容的规范版本。
若 spec_version 为 nil,表示服务端支持 ‘"1.0"’ 之前的规范。
当 Emacs 在 MS-Windows 上以图形界面运行时,通过原生接口支持一小部分 D-Bus 通知功能:
该函数根据 params 显示一条 MS-Windows 托盘通知。Windows 托盘通知以气泡形式从任务栏通知区域的图标弹出。
返回值为通知的唯一整数 ID,可用于通过下文介绍的 w32-notification-close 移除通知。若函数失败,返回 nil。
参数 params 以关键字/值对形式指定。所有参数均为可选,但如果未指定任何参数,函数将不执行任何操作并返回 nil。
支持以下参数:
:icon icon在系统托盘显示 icon。若 icon 为字符串,应指定要加载图标的文件名;文件应为 Windows .ico 图标文件。若 icon 不是字符串,或未指定此参数,则使用标准 Emacs 图标。
:tip tip将 tip 用作通知的工具提示。若 tip 为字符串,鼠标悬停在通知添加的托盘图标上时将显示该文本。若 tip 不是字符串,或未指定此参数,默认工具提示为 ‘Emacs notification’。提示文本最长 127 个字符(W2K 之前的 Windows 版本为 63 个),超长会被截断。
:level level通知严重级别,可为 info、warning 或 error。若指定,该值决定通知标题左侧显示的图标,但仅当同时指定了字符串类型的 :title 参数时有效。
:title title通知标题。若 title 为字符串,将以较大字体显示在正文上方。标题最长 63 个字符,超长会被截断。
:body body通知正文。若 body 为字符串,指定通知消息文本。可使用内嵌换行符控制分行。正文最长 255 个字符,超长会被截断。与 D-Bus 不同,正文仅支持纯文本,不支持标记。
注意:W2K 之前的 Windows 版本仅支持 :icon 与 :tip。其他参数可以传入,但会被旧系统忽略。
同一时间最多只能有一个活跃通知。显示新通知前,必须先通过 w32-notification-close 移除当前活跃通知。
要从任务栏移除通知及其图标,使用以下函数:
该函数根据唯一 id 移除托盘通知。
当 Emacs 在 Haiku 系统上以图形程序运行时,也提供了一套简化版、风格类似前述 D-Bus 桌面通知的接口。下述函数缺少的主要能力是回调函数,如 :actions、:on-action 与 :on-close。
该函数向桌面通知服务发送通知,支持的部分参数与 notifications-notify 类似。参数包括:
:title title:body body:replaces-id replaces-id:urgency urgency含义与 notifications-notify 中一致。
:app-icon app-icon应为用作通知图标的图像文件名。若为 nil,则使用 Emacs 应用图标。
返回值为标识该通知的数字,可在后续调用本函数时作为 :replaces-id 参数使用。
当 Emacs 编译为 Android 应用包时,可通过 android-notifications-notify 显示通知。与 notifications-notify 相比,该函数不支持回调,且存在一些特有行为。
该函数显示一条桌面通知。params 是与 notifications-notify 类似的参数列表。参数包括:
:title title:body body:replaces-id replaces-id:on-action on-action:on-cancel on-close:actions actions:timeout timeout:resident resident含义与 notifications-notify 中一致,但最多只显示三个非默认操作。
:urgency urgency支持的取值与 notifications-notify 相同,但优先级会应用到同一 group 下的所有通知(Android 7.1 及更早版本除外)。
:group group字符串类型,指定本条通知所属的分类。该分类会出现在系统通知设置菜单中,但在 Android 7.1 及更早版本中被忽略。
若 group 为 nil 或未指定,将使用字符串 ‘"Desktop Notifications"’。
调用方应为每种通知提供固定的 urgency 与 group 组合,因为如果优先级与该分组之前的通知不一致,系统可能会忽略该设置。
:icon icon控制通知显示的图标。值为字符串,指定 android.R.drawable 系统包中的图标。可用图标列表请参见 R.drawable | Android Developers。
若未指定或图标不存在,默认使用 ‘"ic_dialog_alert"’。
返回值为标识该通知的数字,可在后续调用本函数时作为 :replaces-id 参数使用。
在 Android 13 及更高版本中,如果 Emacs 未被授予显示通知的权限(see Android Environment in The GNU Emacs Manual),发送的所有通知将被静默忽略。