Введение в переменные, локальные для буфера
Переменная, локальная для буфера, имеет привязку, локальную для буфера, связанную с конкретным буфером. Привязка действует, когда этот буфер является текущим; в противном случае она не действует. Если вы задаёте переменную, когда действует привязка, локальная для буфера, новое значение попадает в эту привязку, поэтому другие привязки остаются неизменными. Это означает, что изменение видно только в буфере, где вы его сделали.
Обычная привязка переменной, которая не связана ни с каким конкретным буфером, называется стандартной привязкой. В большинстве случаев это глобальная привязка.
Переменная может иметь привязки, локальные для буфера, в некоторых буферах, но не в других. Стандартная привязка используется всеми буферами, у которых нет собственных привязок для переменной. (Это включает все вновь созданные буферы.) Если вы задаёте переменную в буфере, у которого нет локальной для буфера привязки к ней, это устанавливает стандартную привязку, поэтому новое значение видно во всех буферах, которые видят стандартную привязку.
Наиболее распространённое применение привязок, локальных для буфера, заключается в том, чтобы основные режимы изменяли переменные, которые управляют поведением команд. Например, режимы C и Lisp оба устанавливают переменную paragraph-start для указания того, что абзацы разделяются только пустыми строками. Они делают это, делая переменную локальной для буфера, который переведён в режим C или Lisp, а затем устанавливают её новое значение для этого режима. См. Основные режимы.
Обычный способ создания привязки, локальной для буфера, — это make-local-variable, который обычно используется командами основных режимов. Это влияет только на текущий буфер; все остальные буферы (включая те, которые ещё предстоит создать) будут продолжать использовать значение по умолчанию, пока им не будут явно заданы свои локальные для буфера привязки.
Более мощная операция заключается в том, чтобы пометить переменную как автоматически локальную для буфера, вызвав make-variable-buffer-local. Можно представить это как локализацию переменной во всех буферах, даже тех, которые ещё предстоит создать. Более точно, эффект заключается в том, что установка переменной автоматически делает переменную локальной для текущего буфера, если это ещё не так. Все буферы начинают с использования стандартного значения переменной, как обычно, но установка переменной создаёт локальную для буфера привязку для текущего буфера. Новое значение сохраняется в локальной для буфера привязке, оставив стандартную привязку без изменений. Это означает, что стандартное значение нельзя изменить с помощью setq в любом буфере; единственный способ изменить его — это с помощью setq-default.
Предупреждение: Когда переменная имеет локальные для буфера привязки в одном или нескольких буферах, let перепривязывает привязку, которая в данный момент действует. Например, если у текущего буфера есть локальное для буфера значение, let временно перепривязывает это значение. Если локальных для буфера привязок нет, let перепривязывает значение по умолчанию. Если внутри let вы затем переключаетесь на другой текущий буфер, в котором действует другая привязка, вы больше не увидите привязку let. И если вы выйдете из let, оставаясь в другом буфере, вы не увидите отмену привязки (хотя она произойдёт должным образом). Вот пример для иллюстрации:
(setq foo 'g) (set-buffer "a") (make-local-variable 'foo)
(setq foo 'a) (let ((foo 'temp)) ;; foo ⇒ 'temp ; let binding in buffer ‘a’ (set-buffer "b") ;; foo ⇒ 'g ; the global value since foo is not local in ‘b’ body…)
foo ⇒ 'g ; exiting restored the local value in buffer ‘a’, ; but we don’t see that in buffer ‘b’
(set-buffer "a") ; verify the local value was restored
foo ⇒ 'a
Обратите внимание, что ссылки на foo в body обращаются к локальной для буфера привязке буфера ‘b’.
Когда файл задаёт значения локальных переменных, эти значения становятся локальными для буфера, когда вы открываете файл. См. Переменные файлов в Справочном руководстве GNU Emacs.
Переменная, локальная для буфера, не может быть локальной для терминала (см. Несколько терминалов).
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Intro-to-Buffer_002dLocal.html