我对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 之间没有区别。
我的理解是否有问题?
非常感谢。
例如:
1)我在 init.el 文件中写了(setq hello 123),然后在shell中运行 emacs abuffer ,然后输入< strong>“你好Cx Ce”,它显示“123”。当我在所有新缓冲区中运行它时,会发生同样的情况。
2)我在 init.el 文件中写了(setq tab-width 4)。当我运行制表符宽度C-x C-e 时,它显示“8”(当前模式为“文本”)。但是,当我使用(setq-default tab-width 4)时,它会显示“4”。我无法解释这种现象。
答案 0 :(得分:88)
Emacs中的一些变量是“缓冲区本地”,这意味着允许每个缓冲区具有覆盖全局默认值的该变量的单独值。 tab-width
是缓冲区局部变量的一个很好的例子。
如果变量是缓冲区本地的,则setq
在当前缓冲区中设置其本地值,setq-default
设置全局默认值。
如果变量不是缓冲区本地的,那么setq
和setq-default
会做同样的事情。
在你的情况2中,(setq tab-width 4)
在当前缓冲区中将tab-width
的缓冲区本地值设置为4,将全局默认值tab-width
保持为8,所以当你在没有本地值的不同缓冲区中评估tab-width
,您看到8.然后,当您将默认值设置为4时,该缓冲区将其拾取,因为它仍然没有本地值。