42.4.3 在 *Messages* 中记录信息

几乎所有在回显区显示的信息都会同时记录到 *Messages* 缓冲区,方便用户后续查阅。这包括所有通过 message 输出的信息。默认情况下该缓冲区为只读,并使用主模式 messages-buffer-mode。用户可以关闭 *Messages* 缓冲区,但下次显示信息时会重新创建。任何需要直接访问 *Messages* 缓冲区并确保其存在的 Lisp 代码,都应使用函数 messages-buffer

Function: messages-buffer

该函数返回 *Messages* 缓冲区。若缓冲区不存在,则创建它并将其切换至 messages-buffer-mode

User Option: message-log-max

该变量指定 *Messages* 缓冲区保留的最大行数。值为 t 表示无行数限制;值为 nil 则完全禁用信息记录。以下代码可显示信息但禁止记录:

(let (message-log-max)
  (message ...))
Variable: messages-buffer-name

该变量为记录信息的缓冲区名称,默认值为 *Messages*。部分程序包可能需要临时将输出重定向至其他缓冲区(例如后续写入日志文件),此时可将该变量绑定为其他缓冲区名。(注意:若该缓冲区不存在,会被自动创建并设为 messages-buffer-mode。)

为方便用户使用,记录机制会合并连续的相同信息。它还会在两种情况下合并连续相关信息:提问与回答、以及一系列进度信息。

提问后跟回答的形式包含两条信息,类似 y-or-n-p 产生的内容:第一条为 ‘question’,第二条为 ‘question...answer’。第一条信息相比第二条无额外内容,因此记录第二条时会从日志中移除第一条。

一系列进度信息类似 make-progress-reporter 产生的连续内容,格式为 ‘base...how-far’,其中 base 保持不变而 how-far 变化。若这些信息连续出现,记录新信息时会丢弃上一条。

make-progress-reportery-or-n-p 无需执行特殊操作即可启用信息日志合并功能。只要连续两条记录的信息共享以 ‘...’ 结尾的公共前缀,该功能就会自动生效。