Создание и удаление привязок, локальных для буфера
- Команда: make-local-variable variable
-
Эта функция создает привязку, локальную для буфера, в текущем буфере для variable (символа). Другие буферы не затрагиваются. Возвращаемое значение — variable.
Локальное для буфера значение variable изначально совпадает со значением, которое variable имела ранее. Если variable не имела значения, она так и останется без значения.
;; In buffer ‘b1’: (setq foo 5) ; Affects all buffers. ⇒ 5
(make-local-variable 'foo) ; Now it is local in ‘b1’. ⇒ foofoo ; That did not change ⇒ 5 ; the value.
(setq foo 6) ; Change the value ⇒ 6 ; in ‘b1’.
foo ⇒ 6;; In buffer ‘b2’, the value hasn’t changed. (with-current-buffer "b2" foo) ⇒ 5Создание локальной для буфера переменной внутри привязки
letдля этой переменной ненадежно, если только буфер, в котором это выполняется, не является текущим ни при входе вlet, ни при выходе из него. Это связано с тем, чтоletне различает разные типы привязок; ей известно лишь, для какой переменной создана привязка.Создание локальной для буфера константы или переменной только для чтения приводит к ошибке. См. Переменные, которые никогда не меняются.
Если переменная является локальной для терминала (см. Несколько терминалов), эта функция сигнализирует об ошибке. Такие переменные не могут также иметь привязки, локальные для буфера.
Предупреждение: не используйте
make-local-variableдля переменной-перехватчика. Переменные-перехватчики автоматически становятся локальными для буфера при необходимости, если использовать аргумент local вadd-hookилиremove-hook.
- Макрос: setq-local &rest pairs
-
pairs — это список пар «переменная — значение». Этот макрос создает привязку, локальную для буфера, в текущем буфере для каждой из переменных и присваивает им локальное для буфера значение. Он эквивалентен вызову
make-local-variable, за которым для каждой переменной следует вызовsetq. Имена переменных должны быть символами без кавычек.(setq-local var1 "value1" var2 "value2")
- Команда: make-variable-buffer-local variable
-
Эта функция помечает 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.
- Макрос: defvar-local variable &optional value docstring
Этот макрос определяет variable как переменную с начальным значением value и строкой документации docstring, а также помечает ее как автоматически локальную для буфера. Он эквивалентен вызову
defvar, за которым следует вызовmake-variable-buffer-local. variable должна быть символом без кавычек.
- Функция: local-variable-p variable &optional buffer
Функция возвращает
t, если variable является локальной для буфера buffer (по умолчанию — текущий буфер); в противном случае возвращаетnil.
- Функция: local-variable-if-set-p variable &optional buffer
Функция возвращает
t, если variable либо имеет локальное для буфера значение в буфере buffer, либо автоматически является локальной для буфера. В противном случае она возвращаетnil. Если аргумент buffer опущен или равенnil, по умолчанию используется текущий буфер.
- Функция: buffer-local-value variable buffer
Эта функция возвращает привязку variable (символа), локальную для буфера buffer. Если variable не имеет локальной для буфера привязки в буфере buffer, вместо нее возвращается значение variable по умолчанию (см. Значение локальной для буфера переменной по умолчанию).
- Функция: buffer-local-boundp variable buffer
Функция возвращает значение, отличное от
nil, если в буфере buffer есть локальная для буфера привязка variable (символа) или если у variable есть глобальная привязка.
- Функция: buffer-local-variables &optional buffer
-
Эта функция возвращает список, описывающий переменные, локальные для буфера 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)) ;; First, built-in variables local in all buffers: ⇒ ((mark-active . nil) (buffer-undo-list . nil) (mode-name . "Fundamental") ...;; Next, non-built-in buffer-local variables. ;; This one is buffer-local and void: foobar ;; This one is buffer-local and nonvoid: (bind-me . 69))
Обратите внимание: сохранение новых значений в CDR ячеек cons-списка в этом списке не изменяет локальные для буфера значения переменных.
- Команда: kill-local-variable variable
-
Эта функция удаляет локальную для буфера привязку (если она есть) variable (символа) в текущем буфере. В результате в этом буфере становится видна привязка variable по умолчанию. Обычно это приводит к изменению значения variable, поскольку значение по умолчанию обычно отличается от только что удаленного локального для буфера значения.
Если удалить локальную для буфера привязку переменной, которая автоматически становится локальной для буфера при присваивании значения, в текущем буфере станет видимым значение по умолчанию. Однако повторное присваивание значения переменной вновь создаст для нее локальную для буфера привязку.
kill-local-variableвозвращает variable.Эта функция является командой, поскольку иногда бывает полезно интерактивно удалить одну переменную, локальную для буфера, так же как полезно интерактивно создавать такие переменные.
- Функция: kill-all-local-variables &optional kill-permanent
-
Эта функция удаляет все привязки переменных, локальные для текущего буфера. В результате буфер будет использовать значения большинства переменных по умолчанию. По умолчанию переменные, помеченные как постоянные, и локальные функции-перехватчики, у которых свойство
permanent-local-hookне равноnil(см. Настройка перехватчиков), не удаляются. Однако если необязательный аргумент kill-permanent не равенnil, будут удалены и эти переменные.Эта функция также сбрасывает некоторые другие сведения, относящиеся к буферу: устанавливает локальную таблицу клавиш в
nil, таблицу синтаксиса — в значение(standard-syntax-table), таблицу регистра — в(standard-case-table), а таблицу сокращений — в значениеfundamental-mode-abbrev-table.Первым делом эта функция запускает обычный перехватчик
change-major-mode-hook(см. ниже).Каждая команда основного режима начинает работу с вызова этой функции, что приводит к переключению в режим Fundamental и стиранию большей части эффектов предыдущего основного режима. Чтобы функция справлялась со своей задачей, переменные, устанавливаемые основными режимами, не следует помечать как постоянные.
kill-all-local-variablesвозвращаетnil.
- Переменная: change-major-mode-hook
-
Функция
kill-all-local-variablesзапускает этот обычный перехватчик, прежде чем выполнить какие-либо другие действия. Это позволяет основным режимам предусмотреть специальные действия на случай, если пользователь переключится на другой основной режим. Перехватчик также полезен для вспомогательных режимов, привязанных к буферу и отключаемых при смене пользователем основного режима.Для наилучшего результата сделайте эту переменную локальной для буфера: после выполнения своей задачи она исчезнет и не будет мешать последующему основному режиму. См. Перехватчики.
Переменная, локальная для буфера, является постоянной, если у имени переменной (символа) есть свойство permanent-local, отличное от nil. Такие переменные не затрагиваются функцией kill-all-local-variables, поэтому их локальные привязки не удаляются при смене основных режимов. Постоянные локальные переменные подходят для хранения данных о происхождении файла или способе его сохранения, а не о редактировании его содержимого.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Buffer_002dLocal.html