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


89

我有一个关于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,然后输入“ hello Cx Ce”,显示为“ 123”。当我在所有新缓冲区中运行此命令时,也会发生相同的情况。

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

Answers:


100

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)时,它将在每个缓冲区中生效。我也不知道为什么:(
ruanhao 2013年

(setq tab-width 4)在您计算表达式的缓冲区中生效;如果您在*scratch*缓冲区中对其求值,则在该缓冲区中检查其值。
2013年

tab-width是局部缓冲区变量。因此,当您(setq tab-width 4)在当前缓冲区中将其仅设置为4时。所有其他缓冲区都保留tab-width全局默认值a 。当您(setq-default tab-width 4)将全局默认值更改tab-width为4时,现在每个未定义tab-width自身的缓冲区都具有该新默认值。
dfan 2013年

3
是。请参阅“启动时emacs的操作序列”列表。读取初始化文件是步骤12中,和培养的初始缓冲液是步骤23
dfan

1
@ruanhao如果在init.el中(setq制表符宽度为4),则它将仅应用于该缓冲区(init.el)。如果您希望此更改适用于所有新缓冲区,则(setq-default tab-width 4)将完成此操作。此外,如果要为特定类型的文件创建模式,则可能要使用(setq tab-width 4),以免覆盖全局默认值。
Hemm 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.