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


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

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

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

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

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

например:
1) я писал (setq hello 123) на init.Эл файл, и я запускаю в Emacs abuffer в оболочки, затем я ввожу "привет C-x C-e", он показывает "123". То же самое происходит, когда я запускаю это во всех новых буферах.

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

1 68

1 ответ:

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

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

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

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