Эта функция создаёт локальную для буфера привязку в текущем буфере для variable (символа). Другие буферы не затрагиваются. Возвращаемое значение — variable.
Локальное для буфера значение variable изначально равно тому значению, которое variable имела ранее. Если variable была не определена, она остаётся неопределённой.
;; В буфере ‘b1’: (setq foo 5) ; Влияет на все буферы. ⇒ 5
(make-local-variable 'foo) ; Теперь она локальна в ‘b1’.
⇒ foo
foo ; Это не изменило ⇒ 5 ; значение.
(setq foo 6) ; Изменить значение ⇒ 6 ; в ‘b1’.
foo
⇒ 6
;; В буфере ‘b2’ значение не изменилось.
(with-current-buffer "b2"
foo)
⇒ 5
Создание локальной для буфера переменной внутри привязки let для этой
переменной работает ненадёжно, если только буфер, в котором вы это делаете,
не является текущим ни при входе в let, ни при выходе из него. Это
связано с тем, что let не различает разные виды привязок; он знает
только, для какой переменной была создана привязка.
Ошибкой является создание локальной для буфера константы или переменной, доступной только для чтения. См. Переменные, которые никогда не изменяются.
Если переменная является локальной для терминала (см. Несколько терминалов), эта функция сигнализирует об ошибке. Такие переменные не могут иметь также и локальных для буфера привязок.
Предупреждение: не используйте make-local-variable для переменной-
хука. Переменные-хуки автоматически становятся локальными для буфера по
необходимости, если вы используете аргумент local в add-hook или
remove-hook.
pairs — это список пар переменная-значение. Этот макрос создаёт
локальную для буфера привязку в текущем буфере для каждой из переменных
и присваивает им локальное для буфера значение. Он эквивалентен вызову
make-local-variable с последующим setq для каждой из переменных.
Переменные должны быть символами без кавычек.
(setq-local var1 "значение1"
var2 "значение2")
Эта функция помечает variable (символ) как автоматически локальную
для буфера, так что любая последующая попытка установить её сделает её
локальной для текущего буфера на тот момент. В отличие от
make-local-variable, с которым её часто путают, это действие нельзя
отменить, и оно влияет на поведение переменной во всех буферах.
Особая тонкость этой возможности заключается в том, что привязка переменной
(с помощью let или других конструкций привязки) не создаёт для неё
локальной для буфера привязки. Только установка переменной (с помощью
set или setq), когда переменная не имеет привязки в стиле
let, созданной в текущем буфере, делает это.
Если variable не имеет значения по умолчанию, то вызов этой команды
присвоит ей значение по умолчанию nil. Если variable уже имеет
значение по умолчанию, это значение остаётся неизменным. Последующий вызов
makunbound для variable приведёт к тому, что локальное для
буфера значение станет неопределённым, а значение по умолчанию останется
неизменным.
Возвращаемое значение — variable.
Ошибкой является создание локальной для буфера константы или переменной, доступной только для чтения. См. Переменные, которые никогда не изменяются.
Предупреждение: Не предполагайте, что вы должны использовать
make-variable-buffer-local для переменных пользовательских опций
только потому, что пользователи могут захотеть настраивать их по-разному
в разных буферах. Пользователи могут сделать любую переменную локальной,
когда пожелают. Лучше оставить выбор за ними.
Время использовать make-variable-buffer-local — это когда крайне
важно, чтобы никакие два буфера никогда не разделяли одну и ту же привязку.
Например, когда переменная используется для внутренних целей в программе на
Lisp, которая зависит от наличия отдельных значений в отдельных буферах,
использование make-variable-buffer-local может быть наилучшим решением.
Этот макрос определяет variable как переменную с начальным значением
value и строкой документации docstring, и помечает её как
автоматически локальную для буфера. Он эквивалентен вызову defvar
с последующим make-variable-buffer-local. variable должна быть
символом без кавычек.
Эта функция возвращает t, если variable является локальной для
буфера в буфере buffer (по умолчанию — текущий буфер); в противном
случае — nil.
Эта функция возвращает t, если variable либо имеет локальное для
буфера значение в буфере buffer, либо является автоматически локальной
для буфера. В противном случае возвращается nil. Если аргумент
buffer опущен или равен nil, по умолчанию используется текущий
буфер.
Эта функция возвращает локальную для буфера привязку variable (символа) в буфере buffer. Если variable не имеет локальной для буфера привязки в буфере buffer, она возвращает значение по умолчанию (см. Значение по умолчанию локальной для буфера переменной) переменной variable.
Эта функция возвращает не nil, если существует либо локальная для
буфера привязка variable (символа) в буфере buffer, либо
variable имеет глобальную привязку.
Эта функция возвращает список, описывающий локальные для буфера переменные
в буфере buffer. (Если buffer опущен, используется текущий
буфер.) Обычно каждый элемент списка имеет вид
(sym . val), где sym — локальная для буфера
переменная (символ), а val — её локальное для буфера значение. Но когда
локальная для буфера привязка переменной в buffer не определена,
элемент списка — это просто sym.
(make-local-variable 'foobar) (makunbound 'foobar) (make-local-variable 'bind-me) (setq bind-me 69)
(setq lcl (buffer-local-variables))
;; Сначала встроенные переменные, локальные во всех буферах:
⇒ ((mark-active . nil)
(buffer-undo-list . nil)
(mode-name . "Fundamental")
…
;; Затем не встроенные локальные для буфера переменные. ;; Эта локальна для буфера и не определена: foobar ;; Эта локальна для буфера и определена: (bind-me . 69))
Обратите внимание, что сохранение новых значений в CDR ячеек cons в этом списке не изменяет локальные для буфера значения переменных.
Эта функция удаляет локальную для буфера привязку (если она есть) для variable (символа) в текущем буфере. В результате привязка по умолчанию переменной variable становится видимой в этом буфере. Обычно это приводит к изменению значения variable, поскольку значение по умолчанию обычно отличается от только что удалённого локального для буфера значения.
Если вы удаляете локальную для буфера привязку переменной, которая автоматически становится локальной для буфера при установке, это делает значение по умолчанию видимым в текущем буфере. Однако если вы снова установите переменную, это снова создаст для неё локальную для буфера привязку.
kill-local-variable возвращает variable.
Эта функция является командой, поскольку иногда полезно удалять одну локальную для буфера переменную в интерактивном режиме, так же как полезно создавать локальные для буфера переменные в интерактивном режиме.
Эта функция удаляет все локальные для буфера привязки переменных текущего
буфера. В результате буфер будет видеть значения по умолчанию для большинства
переменных. По умолчанию переменные, помеченные как постоянные, и локальные
функции-хуки, имеющие свойство permanent-local-hook, отличное от
nil (см. Настройка хуков), не будут удалены, но если
необязательный аргумент kill-permanent не равен nil, то даже
эти переменные будут удалены.
Эта функция также сбрасывает некоторую другую информацию, относящуюся к
буферу: она устанавливает локальную клавиатурную карту в nil,
таблицу синтаксиса в значение (standard-syntax-table), таблицу
регистров в (standard-case-table) и таблицу аббревиатур в значение
fundamental-mode-abbrev-table.
Первое, что делает эта функция, — запускает нормальный хук
change-major-mode-hook (см. ниже).
Каждая команда основного режима начинается с вызова этой функции, что приводит к переключению в фундаментальный режим и стиранию большей части эффектов предыдущего основного режима. Чтобы гарантировать, что это сработает, переменные, устанавливаемые основными режимами, не должны быть помечены как постоянные.
kill-all-local-variables возвращает nil.
Функция kill-all-local-variables запускает этот нормальный хук перед
тем, как делать что-либо ещё. Это даёт основным режимам способ организовать
выполнение некоторых специальных действий, если пользователь переключается
на другой основной режим. Это также полезно для специфичных для буфера
вспомогательных режимов, которые должны быть забыты, если пользователь
меняет основной режим.
Для достижения наилучших результатов сделайте эту переменную локальной для буфера, чтобы она исчезла после выполнения своей задачи и не мешала последующему основному режиму. См. Хуки.
Локальная для буфера переменная является постоянной, если имя переменной
(символ) имеет свойство permanent-local, отличное от nil.
Такие переменные не затрагиваются kill-all-local-variables, и их
локальные привязки поэтому не очищаются при смене основных режимов.
Постоянные локальные переменные подходят для данных, относящихся к тому,
откуда пришёл файл или как его сохранять, а не к тому, как редактировать
содержимое.