Spec-Zone.ru › Elisp

Создание и удаление буферно-локальных связей

Команда: make-local-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 пары

пары — список пар переменная-значение. Этот макрос создаёт буферно-локальную связь в текущем буфере для каждой из переменных и присваивает им буферно-локальные значения. Это эквивалентно вызову make-local-variable и setq для каждой переменной. Переменные должны быть нецитируемыми символами.

(setq-local var1 "value1"
            var2 "value2")
Команда: make-variable-buffer-local переменная

Эта функция автоматически делает переменную переменная (символ) буферно-локальной, так что любая последующая попытка её установить сделает её локальной для текущего буфера в данный момент. В отличие от make-local-variable, с которой её часто путают, это действие нельзя отменить, и оно влияет на поведение переменной во всех буферах.

Особенность этого свойства заключается в том, что связывание переменной (с помощью let или других конструкций связывания) не создаёт для неё буферно-локальную связь. Только установка переменной (с помощью set или setq), в то время как переменная не имеет связи let-стиля, созданной в текущем буфере, делает это.

Если у переменная нет значения по умолчанию, вызов этой команды присвоит ей значение по умолчанию nil. Если у переменная уже есть значение по умолчанию, оно остаётся неизменным. Последующий вызов makunbound для переменная приведёт к пустому буферно-локальному значению и оставит значение по умолчанию без изменений.

Возвращаемое значение — переменная.

Ошибка возникает при попытке сделать константу или только для чтения переменную буферно-локальной. См. Константные переменные.

Предупреждение: не предполагайте, что вы должны использовать make-variable-buffer-local для переменных пользовательских опций, просто потому, что пользователи могут захотеть настроить их по-разному в разных буферах. Пользователи могут сделать любую переменную локальной, когда пожелают. Лучше предоставить им такой выбор.

Используйте make-variable-buffer-local, когда крайне важно, чтобы два буфера никогда не использовали одну и ту же связь. Например, когда переменная используется для внутренних целей в программе Lisp, которая зависит от наличия отдельных значений в отдельных буферах, использование make-variable-buffer-local может быть лучшим решением.

Макрос: defvar-local переменная значение &optional строка_документации

Этот макрос определяет переменную переменная как переменную с начальным значением значение и строка_документации и помечает её как автоматически буферно-локальную. Это эквивалентно вызову defvar и make-variable-buffer-local. переменная должна быть нецитируемым символом.

Функция: local-variable-p переменная &optional буфер

Возвращает t, если переменная является буферно-локальной в буфере буфер (по умолчанию текущий буфер); в противном случае nil.

Функция: local-variable-if-set-p переменная &optional буфер

Возвращает t, если у переменная есть буферно-локальное значение в буфере буфер или она автоматически буферно-локальная. В противном случае возвращает nil. Если опущен или nil, буфер по умолчанию — текущий буфер.

Функция: buffer-local-value переменная буфер

Эта функция возвращает буферно-локальную связь для переменная (символ) в буфере буфер. Если у переменная нет буферно-локальной связи в буфер, она возвращает значение по умолчанию (см. Значение по умолчанию) переменная.

Функция: buffer-local-boundp переменная буфер

Возвращает не-nil, если существует буферно-локальная связь переменная (символ) в буфере буфер, или у переменная есть глобальная связь.

Функция: buffer-local-variables &optional буфер

Эта функция возвращает список, описывающий буферно-локальные переменные в буфере буфер. (Если буфер опущен, используется текущий буфер.) Обычно каждый элемент списка имеет вид (sym . val), где символ — буферно-локальная переменная (символ), а значение — её буферно-локальное значение. Но когда буферно-локальная связь переменной в буфер пустая, элемент списка — просто символ.

(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 переменная

Эта функция удаляет буферно-локальную связь (если она есть) для переменная (символ) в текущем буфере. В результате, глобальная связь переменная становится видимой в этом буфере. Это обычно приводит к изменению значения переменная, так как значение по умолчанию обычно отличается от только что удалённого буферно-локального значения.

Если вы удаляете буферно-локальную связь переменной, которая автоматически становится буферно-локальной при установке, это делает значение по умолчанию видимым в текущем буфере. Однако, если вы снова устанавливаете переменную, это снова создаст буферно-локальную связь для неё.

kill-local-variable возвращает переменная.

Эта функция является командой, так как иногда полезно удалять одну буферно-локальную переменную интерактивно, так же, как полезно создавать буферно-локальные переменные интерактивно.

Функция: kill-all-local-variables

Эта функция удаляет все буферно-локальные связи переменных текущего буфера, за исключением переменных, помеченных как постоянные, и локальных функций хуков, имеющих свойство не-nil permanent-local-hook (см. Управление хуками). В результате буфер увидит значения по умолчанию большинства переменных.

Эта функция также сбрасывает другую информацию, относящуюся к буферу: она устанавливает локальную карту клавиш в nil, таблицу синтаксиса в значение (standard-syntax-table), таблицу регистра в (standard-case-table) и таблицу сокращений в значение fundamental-mode-abbrev-table.

Первое, что делает эта функция, — выполняет обычный хук change-major-mode-hook (см. ниже).

Каждая команда основного режима начинается с вызова этой функции, что приводит к переходу в основной режим и стиранию большей части эффектов предыдущего основного режима. Чтобы убедиться, что эта функция выполняет свою работу, переменные, устанавливаемые основными режимами, не должны быть помечены как постоянные.

kill-all-local-variables возвращает nil.

Переменная: change-major-mode-hook

Функция kill-all-local-variables выполняет этот обычный хук перед выполнением любых других действий. Это даёт основным режимам возможность организовать что-то особенное, если пользователь переключается на другой основной режим. Это также полезно для буферных вспомогательных режимов, которые должны быть забыты, если пользователь меняет основной режим.

Для наилучших результатов сделайте эту переменную буферно-локальной, чтобы она исчезла после выполнения своей работы и не мешала последующему главному режиму. См. Хуки.

Буферно-локальная переменная является постоянной, если имя переменной (символ) имеет свойство permanent-local, которое не является nil. Такие переменные не затрагиваются kill-all-local-variables, и их локальные связи, следовательно, не очищаются при изменении основных режимов. Постоянные локальные переменные подходят для данных, относящихся к тому, откуда файл пришёл или как его сохранить, а не к тому, как редактировать содержимое.

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/Creating-Buffer_002dLocal.html

Spec-Zone.ru

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