Буферо-локальная переменная имеет буферо-локальную привязку, связанную с определенным буфером. Эта привязка действует, когда этот буфер активен; в противном случае она не действует. Если вы устанавливаете переменную, пока действует буферо-локальная привязка, новое значение попадает в эту привязку, поэтому ее другие привязки остаются без изменений. Это означает, что изменение видно только в том буфере, где вы его внесли.
Обычная привязка переменной, которая не связана с каким-либо конкретным буфером, называется привязкой по умолчанию. В большинстве случаев это глобальная привязка.
Переменная может иметь буферо-локальные привязки в некоторых буферах, но не в других. Привязка по умолчанию используется всеми буферами, у которых нет собственных привязок для этой переменной. (Это включает все 새로 созданные буферы.) Если вы устанавливаете переменную в буфере, у которого нет буферо-локальной привязки для нее, это устанавливает привязку по умолчанию, поэтому новое значение видно во всех буферах, которые видят привязку по умолчанию.
Наиболее распространенное использование буферо-локальных привязок — это изменение мажорными режимами переменных, которые контролируют поведение команд. Например, режимы 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 в буфере ‘a’ (set-buffer "b") ;; foo ⇒ 'g ; глобальное значение, так как foo не локален в ‘b’ body…)
foo ⇒ 'g ; выход восстановил локальное значение в буфере ‘a’, ; но мы не видим этого в буфере ‘b’
(set-buffer "a") ; проверить, что локальное значение было восстановлено
foo ⇒ 'a
Обратите внимание, что ссылки на foo в body обращаются к буферо-локальной привязке буфера ‘b’.
Когда файл указывает значения локальных переменных, они становятся буферо-локальными значениями, когда вы открываете файл. См. File Variables в Руководстве GNU Emacs.
Терминально-локальную переменную нельзя сделать буферо-локальной (см. Несколько терминалов).