Spec-Zone.ru › Elisp

Создание и удаление привязок, локальных для буфера

Команда: 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’.
     ⇒ foo
foo                         ; 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API