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

时间:2013-08-11 14:01:30

标签: emacs elisp

我对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”。我无法解释这种现象。

1 个答案:

答案 0 :(得分:88)

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

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

如果变量不是缓冲区本地的,那么setqsetq-default会做同样的事情。

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