当我的主要模式的缓冲区被埋没或被杀死时,我应该如何清理变量?

时间:2018-06-04 07:00:52

标签: variables emacs

我正在为响应交互式命令而创建的缓冲区编写主模式。换句话说,只有一个缓冲区在此主模式下有效。类似于messages-mode-buffer或Magit的状态缓冲区。

问题在于,即使在我的主要模式的缓冲区被杀死之后,我用defvar定义的变量仍然存在它们的最后一个值。

这是正常的吗?随机查看其他一些模式,我也没有看到他们收集他们曾经使用但不再需要的变量。

如果我要清理它们,我该怎么做?

1 个答案:

答案 0 :(得分:1)

如果变量在每个缓冲区中具有相同的值,那么当缓冲区被杀死时,它显然需要存活。它可能适用于其他现有缓冲区,即使此模式下的所有缓冲区都被终止,它也将应用于该模式下的新缓冲区。因此,该问题仅适用于具有可能在每个缓冲区中不同的本地值的变量。

为了在缓冲区中具有本地值,变量需要为explicitly made local。这通常通过调用make-local-variable来完成,如果变量需要在给定缓冲区中是本地的,或者在make-variable-buffer-local之后立即调用defvar来声明对该变量的所有赋值(除了set-default等等将是本地的。

如果埋藏了缓冲区,那么它不会以任何方式影响其变量。埋藏缓冲区只是显示它的窗口的可见性。

如果缓冲区被终止,则其所有局部变量值都将停止存在。

仅在现有缓冲区更改其主模式时才会出现这种情况。所有major mode functions必须致电kill-all-local-variables。这将删除对先前模式有意义的任何局部变量值。