Emacs Lisp中setq和setq-default之间的区别

我有一个关于Emacs Lisp的问题。 setqsetq-default有什么区别? 我很困惑。

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

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

我的理解有什么问题吗?

非常感谢你。

例如:
1)我在init.el文件中写了(setq hello 123) ,我在shell中运行emacs abuffer ,然后input“hello Cx Ce” ,它显示“123”。 当我在所有新的缓冲区中运行这个同样的事情发生。

2)我在init.el文件中写了(setq tab-width 4) 。 当我运行标签宽度Cx Ce时 ,它显示“8”(当前模式是“文本”)。 但是,当我使用(setq-default tab-width 4)时 ,它显示“4”。 我无法解释这种现象。

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

如果一个variables是缓冲区本地的,那么setq在当前缓冲区中设置它的本地值, setq-default设置全局默认值。

如果一个variables不是缓冲区本地的,那么setqsetq-default做同样的事情。

在你的情况2, (setq tab-width 4)在当前缓冲区中将tab-width的缓冲区本地值设置为4,而使得全局默认值tab-width仍然为8,所以当你计算tab-width一个不具有本地值的缓冲区,你看到了8.然后,当你将默认值设置为4时,那个缓冲区把它拿起来了,因为它还没有本地值。