Разница между setq и setq-default в Emacs Lisp

У меня вопрос о Emacs Lisp. В чем разница между setq и setq-default? Я очень смущен.

Учебники говорят, что setq вступает в силу в локальном буфере, а setq-default влияет на все буферы.

Например, если я написал (setq a-var a-vars-value) в init.el, я обнаружил после запуска Emacs и открытия нового буфера, a-var также существует, а его значение a-vars-value. Я думал, что это не должно быть там. Кажется, нет разницы между setq и setq-default.

Что-то не так с моим пониманием?

Большое спасибо.

Например:
1) Я написал (setq hello 123) в файле init.el, и я запустил emacs abuffer в оболочке, затем введите "hello Cx Ce" , он показывает "123". То же самое происходит, когда я запускаю это во всех новых буферах.

2) Я написал (setq tab-width 4) в файле init.el. Когда я запускаю tab-width C-x C-e, он показывает "8" (текущий режим - "Текст" ). Однако, когда я использую (setq-default tab-width 4), он показывает "4". Я не могу объяснить это явление.

Ответ 1

Некоторые переменные в Emacs являются "buffer-local", что означает, что каждому буфере разрешено иметь отдельное значение для этой переменной, которое переопределяет глобальное значение по умолчанию. tab-width - хороший пример локальной-буферной переменной.

Если переменная является буфер-локальной, то setq устанавливает свое локальное значение в текущем буфере, а setq-default устанавливает глобальное значение по умолчанию.

Если переменная не является буферно-локальной, то setq и setq-default делают то же самое.

В вашем случае 2, (setq tab-width 4) установите локальное значение буфера от tab-width до 4 в текущем буфере, оставив глобальное значение по умолчанию tab-width еще на 8, поэтому, когда вы оценили tab-width в другой буфер, который не имел локального значения, вы видели, что 8. Затем, когда вы задали значение по умолчанию 4, этот буфер поднял его, так как он все еще не имел локального значения.