错误 运行 计时器: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 -*-
为什么我得到 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 -*-