1.8.5 message 函数

类似于+函数,message函数接受可变数量的参数。它用于向用户发送消息,非常实用,我们将在这里描述它。

消息将被打印在回显区。例如,通过评估以下列表,您可以在回显区中打印一条消息:

(message "This message appears in the echo area!")

双引号之间的整个字符串是一个单一的参数,并被整体打印出来。(请注意,在这个例子中,消息本身将在回显区中用双引号括起来;这是因为您看到了message函数返回的值。在您编写的程序中,message的大多数用法将作为副作用将文本在回显区中打印出来,而不带引号。See multiply-by-seven in detail, 了解其中的一个示例。)

然而,如果在带引号的字符字符串中有一个‘%s’,message函数不会像这样打印‘%s’,而是查看跟随字符串的参数。它评估第二个参数,并在字符串中‘%s’的位置打印该值。

您可以通过将光标定位在以下表达式之后,然后键入C-x C-e来查看这一点:

(message "The name of this buffer is: %s." (buffer-name))

在Info中,"The name of this buffer is: *info*." 将出现在回显区。函数 buffer-name 返回缓冲区的名称作为字符串,message 函数将其插入到 %s 的位置。

要将值以整数形式打印,可以使用 ‘%d’,与 ‘%s’ 的使用方式相同。例如,要在回显区中打印一条消息,指出 fill-column 的值,请评估以下内容:

(message "The value of fill-column is %d." fill-column)

在我的系统上,当我评估这个列表时,"The value of fill-column is 72." 将出现在我的回显区5

如果在引用的字符串中有多个 ‘%s’,则在第一个 ‘%s’ 的位置打印跟在引用字符串后的第一个参数的值,并在第二个 ‘%s’ 的位置打印第二个参数的值,依此类推。

例如,如果你评估以下内容,

(message "There are %d %s in the office!"
         (- fill-column 14) "pink elephants")

你的回显区将显示一条相当奇特的消息。在我的系统上,它会显示,"There are 58 pink elephants in the office!"

表达式(- fill-column 14)被评估,生成的数字插入到‘%d’的位置;双引号中的字符串"pink elephants"被视为单个参数,插入到‘%s’的位置。(也就是说,双引号之间的字符串评估为它本身,就像一个数字一样。)

最后,这里有一个稍微复杂的例子,不仅说明了一个数字的计算,而且还展示了如何在一个表达式中使用另一个表达式来生成替代‘%s’的文本:

(message "He saw %d %s"
         (- fill-column 32)
         (concat "red "
                 (substring
                  "The quick brown foxes jumped." 16 21)
                 " leaping."))

在这个例子中,message有三个参数:字符串"He saw %d %s",表达式(- fill-column 32),以及以concat函数开头的表达式。通过评估(- fill-column 32)生成的值插入到‘%d’的位置;以及通过评估以concat开头的表达式生成的值插入到‘%s’的位置。

当你的填充列为70时,评估这个表达式,消息"He saw 38 red foxes leaping."将出现在你的回显区。


Footnotes

(5)

实际上,你可以使用 %s 打印一个数字。它是非具体的。%d 只打印小数点左边的数字部分,而不包括任何非数字内容。