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."。