我有一个关于 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”。我无法解释这种现象。
Emacs 中的一些变量是“本地缓冲区”,这意味着每个缓冲区都可以有一个单独的值来覆盖全局默认值。 tab-width
是缓冲区局部变量的一个很好的例子。
如果变量是缓冲区本地的,则 setq
设置其在当前缓冲区中的本地值,而 setq-default
设置全局默认值。
如果变量不是局部缓冲区,则 setq
和 setq-default
做同样的事情。
在您的情况 2 中,(setq tab-width 4)
在当前缓冲区中将 tab-width
的缓冲区本地值设置为 4,而 tab-width
的全局默认值仍为 8,因此当您在不同的缓冲区中评估 tab-width
时没有本地值,您看到的是 8。然后,当您将默认值设置为 4 时,该缓冲区拾取它,因为它仍然没有本地值。
不定期副业成功案例分享
tab-width
是缓冲区局部变量。所以当你(setq tab-width 4)
时,它在当前缓冲区中只设置为 4。所有其他缓冲区保留全局默认值的tab-width
,即 8。当您(setq-default tab-width 4)
时,您将全局默认值tab-width
更改为 4,因此现在每个尚未定义tab-width
的缓冲区本身都具有新的默认值.