我正在为响应交互式命令而创建的缓冲区编写主模式。换句话说,只有一个缓冲区在此主模式下有效。类似于messages-mode-buffer
或Magit的状态缓冲区。
问题在于,即使在我的主要模式的缓冲区被杀死之后,我用defvar
定义的变量仍然存在它们的最后一个值。
这是正常的吗?随机查看其他一些模式,我也没有看到他们收集他们曾经使用但不再需要的变量。
如果我要清理它们,我该怎么做?
答案 0 :(得分:1)
如果变量在每个缓冲区中具有相同的值,那么当缓冲区被杀死时,它显然需要存活。它可能适用于其他现有缓冲区,即使此模式下的所有缓冲区都被终止,它也将应用于该模式下的新缓冲区。因此,该问题仅适用于具有可能在每个缓冲区中不同的本地值的变量。
为了在缓冲区中具有本地值,变量需要为explicitly made local。这通常通过调用make-local-variable
来完成,如果变量需要在给定缓冲区中是本地的,或者在make-variable-buffer-local
之后立即调用defvar
来声明对该变量的所有赋值(除了set-default
等等将是本地的。
如果埋藏了缓冲区,那么它不会以任何方式影响其变量。埋藏缓冲区只是显示它的窗口的可见性。
如果缓冲区被终止,则其所有局部变量值都将停止存在。
仅在现有缓冲区更改其主模式时才会出现这种情况。所有major mode functions必须致电kill-all-local-variables
。这将删除对先前模式有意义的任何局部变量值。