Разница между 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 ответ:
некоторые переменные в Emacs являются "локальными буферами", что означает, что каждому буферу разрешено иметь отдельное значение для этой переменной, которая переопределяет глобальное значение по умолчанию.
tab-width
является хорошим примером буферно-локальной переменной.если переменная является буферно-локальной, то
setq
устанавливает свое локальное значение в текущем буфере иsetq-default
устанавливает глобальное значение по умолчанию.если переменная не является буферно-локальной, то
setq
иsetq-default
сделать то же самое.в вашей корпус 2,
(setq tab-width 4)
установите локальное значение буфераtab-width
до 4 в текущем буфере, оставляя глобальное значение по умолчаниюtab-width
все еще в 8, так что когда вы оценилиtab-width
в другом буфере, который не имел локального значения, вы видели, что 8. Затем, когда вы установили значение по умолчанию в 4, этот буфер взял его, так как он все еще не имел локального значения.