我花了很多时间搞清楚我的代码出了什么问题。它在ert单元测试中运行得很好,但是当我在更大的环境中运行它时失败了。以下是一个有效的代码示例:
(defun func (my-var)
(with-temp-buffer
(message my-var)))
(func "z")
按预期打印z。现在我正在编写一个主模式,它有一些缓冲区局部变量。其中一个是my-var。此代码演示了我的问题:
(make-local-variable 'my-var)
(setq my-var "y")
(defun func (my-var)
(with-temp-buffer
(message my-var)))
(func "z")
输出?没有,只有这个错误消息:
eval-buffer: Symbol's value as variable is void: my-var
在这个例子中,很容易看到缓冲区局部变量以某种方式干扰动态绑定的my-var。当我有多个屏幕值的代码时,这并不容易: - )
所以我的问题是这里到底发生了什么?很明显,temp-buffer以某种方式从“父”缓冲区继承了一个变量,但为什么它有一个void值呢?我会理解它是否会以某种方式获得值“y”,但这种行为对我来说就像一个错误。
PS。我正在运行最新的Aquamacs
答案 0 :(得分:3)
有几件事。
首先,您的代码不能按原样运行。您应该在新的Emacs调用中尝试这个。完成后,您将看到需要传递make-local-variable
符号,如下所示:
(make-local-variable 'my-var)
注意```。
其次,您已经将缓冲区局部变量定义为与func
的参数同名,因此任何答案都需要区分这两者。
所以,这是我的例子的清理版本:
(make-local-variable 'my-var)
(setq my-var "y")
(defun func (my-param)
(with-temp-buffer
(message my-param)))
(func "z")
这很好用。
这让我相信您所看到的错误来自于make-local-variable
,而my-var
前没有引用。
下面提供了原始答案,但它没有解决问题:
查看make-local-variable
的文档。 doc字符串是:
make-local-variable是`C源代码中的交互式内置函数 代码”。
(make-local-variable VARIABLE)
Make VARIABLE在当前缓冲区中有一个单独的值。其他 缓冲区将继续共享一个共同的默认值。 (该 VARIABLE的缓冲区本地值以相同的值VARIABLE开始 以前有过。如果VARIABLE无效,它仍然无效。)返回 变量。
关键部分是最后一句话。 If the variable was void, it remains void.
这意味着如果尚未全局定义,则仍未全局定义。换句话说,它只在已明确设置的缓冲区中有一个绑定。
如果您希望它具有全局值,请使用setq-default
,如下所示:
(setq-default my-var "some-default-value")