ChatGPT解决这个技术问题 Extra ChatGPT

Emacs Lisp 中 setq 和 setq-default 的区别

我有一个关于 Emacs Lisp 的问题。 setq 和 setq-default 有什么区别?

教程说 setq 在本地缓冲区中生效,而 setq-default 影响所有缓冲区。

比如我在init.el中写了(setq a-var a-vars-value),我发现启动Emacs并打开一个新的缓冲区后,a-var也在,它的值是a-vars-value。我以为它不应该在那里。 setq 和 setq-default 之间似乎没有区别。

我的理解有问题吗?

例如:

我在init.el文件中写了(setq hello 123),然后在shell中运行emacs abuffer,然后输入“hello Cx Ce”,它显示“123”。当我在所有新缓冲区中运行它时也会发生同样的情况。我在 init.el 文件中写了 (setq tab-width 4)。当我运行 tab-width Cx Ce 时,它显示“8”(当前模式为“文本”)。但是,当我使用 (setq-default tab-width 4) 时,它显示“4”。我无法解释这种现象。


d
dfan

Emacs 中的一些变量是“本地缓冲区”,这意味着每个缓冲区都可以有一个单独的值来覆盖全局默认值。 tab-width 是缓冲区局部变量的一个很好的例子。

如果变量是缓冲区本地的,则 setq 设置其在当前缓冲区中的本地值,而 setq-default 设置全局默认值。

如果变量不是局部缓冲区,则 setqsetq-default 做同样的事情。

在您的情况 2 中,(setq tab-width 4) 在当前缓冲区中将 tab-width 的缓冲区本地值设置为 4,而 tab-width 的全局默认值仍为 8,因此当您在不同的缓冲区中评估 tab-width 时没有本地值,您看到的是 8。然后,当您将默认值设置为 4 时,该缓冲区拾取它,因为它仍然没有本地值。


当我(设置制表符宽度 4)并对其进行评估时,每个缓冲区中始终为 8。我不知道为什么。好像没有生效。但是当我使用 (sets-default tab-width 4) 时,它会在每个缓冲区中生效。我也不知道为什么:(
tab-width 是缓冲区局部变量。所以当你 (setq tab-width 4) 时,它在当前缓冲区中只设置为 4。所有其他缓冲区保留全局默认值的 tab-width,即 8。当您 (setq-default tab-width 4) 时,您将全局默认值 tab-width 更改为 4,因此现在每个尚未定义 tab-width 的缓冲区本身都具有新的默认值.
是的。请参阅 emacs 的 Sequence of Actions at Startup 列表。读取初始化文件是第 12 步,调出初始缓冲区是第 23 步。
啊,开悟了。因此,当 i (setq tab-width 4) 时,没有初始化缓冲区,也没有对应于 '(setq tab-width 4)' 的特定缓冲区。在这种情况下,“init.el”中的这个配置有点没用,对吗?
@ruanhao如果您在init.el中(setq tab-width 4),那么它将仅适用于该缓冲区(init.el)。如果您希望此更改应用于所有新缓冲区,则 (setq-default tab-width 4) 将完成此操作。此外,如果您想为特定类型的文件创建模式,您可能需要使用 (setq tab-width 4) 以免覆盖全局默认值。