2013-08-11 3 views
57

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

Учебники говорят SETQ вступает в силу в локальном буфере пока SETQ по умолчанию влияет на все буферы.

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

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

спасибо.

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

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

ответ

63

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

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

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

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

+0

, когда I (устанавливает ширину полосы 4) и оценивает его, он всегда 8 в каждом буфере. Я не знаю почему. Кажется, это не вступает в силу. Но когда я использую (set-default tab-width 4), он действует в каждом буфере.Я также не знаю, почему :( – ruanhao

+0

'(setq tab-width 4)' действует в буфере, где вы оценили выражение, если вы его оцениваете в буфере '* scratch * ', тогда проверьте его значение в этом буфере. – tripleee

+0

'tab-width' - это локальная переменная буфера. Поэтому, когда вы' (setq tab-width 4) ', в текущем буфере оно установлено только 4. Все остальные буферы сохраняют' tab-width' глобального значения по умолчанию , 8. Когда вы '(setq-default tab-width 4)', вы меняете глобальное значение по умолчанию 'tab-width' на 4, поэтому теперь каждый буфер, который не определил' tab-width', имеет этот новый по умолчанию – dfan

Смежные вопросы