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

我有一个关于 Emacs Lisp 的问题。 SetqSetq-default的区别是什么?

教程说 Setq本地缓冲区本地缓冲区中起作用,而 Setq-default影响所有的缓冲区。

例如,如果我在 进去 El中编写了 (setq a-var a-vars-value),我发现在启动 Emacs 并打开一个新的缓冲区之后,A-Var也在那里,它的值是 A-vars-value。我以为它不应该在那里。SetqSetq-default之间似乎没有什么区别。

我的理解有什么问题吗?

例如:

  1. 我在 进去 El文件中编写了 (setq hello 123),然后在 shell 中运行 Emacs 缓冲器,然后输入 “你好 C-x C-e”,它显示“123”。在所有新的缓冲区中运行这个命令时也会发生同样的情况。

  2. 我在 进去 El文件中编写了 (setq tab-width 4)。当我运行 标签宽度 C-x C-e时,它显示“8”(当前模式为“ Text”)。但是,当我使用 (setq-default tab-width 4)时,它显示“4”。我无法解释这种现象。

20865 次浏览

Some variables in Emacs are "buffer-local", meaning that each buffer is allowed to have a separate value for that variable that overrides the global default. tab-width is a good example of a buffer-local variable.

If a variable is buffer-local, then setq sets its local value in the current buffer and setq-default sets the global default value.

If a variable is not buffer-local, then setq and setq-default do the same thing.

In your case 2, (setq tab-width 4) set the buffer-local value of tab-width to 4 in the current buffer, leaving the global default value of tab-width still at 8, so when you evaluated tab-width in a different buffer that had no local value, you saw that 8. Then, when you set the default value to 4, that buffer picked it up, since it still had no local value.