错误 运行 计时器:Emacs 中的(无效变量消息)init.el

Error running timer: (void-variable message) in Emacs init.el

为什么我得到 Error running timer: (void-variable message) 在我的 `init.el - Emacs?

下面的函数中
(defun cypher/cowsayx-sclock (in-minutes message)
  (interactive "nSet the time from now - min.: \nsWhat: ")
  (run-at-time (* in-minutes 60)
               nil
               (lambda ()
                 (message "%S" message)
                 (shell-command (format "xcowsay %s" (shell-quote-argument
                                                      message))))))

您需要打开 lexical-binding,因为 lambda 中出现的 message 不会被视为自由变量。它是函数局部的词法变量 cypher/cowsayx-sclock,但在 lambda 中它是自由的。

否则,您需要在 lambda 表达式中替换变量 message,并将其用作列表。这是一个反引号表达式,它为您提供替换了 message 值的列表。

`(lambda ()
   (message "%S" ',message)
   (shell-command (format "xcowsay %s" (shell-quote-argument ',message)))

但这比使用 lexical-binding 的性能要差,它会为 lambda 生成一个闭包,封装 message.

的值

参见 Elisp 手册,节点 Using Lexical Binding

例如,您可以将其放在注释行的末尾作为文件的第一行:

  -*- lexical-binding:t -*-

例如,如果您的代码在文件 foo.el 中,那么它的第一行可能是:

;;; foo.el --- Code that does foo things.   -*- lexical-binding:t -*-