Создание и удаление буферно-локальных связей
- Команда: make-local-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 пары
-
пары — список пар переменная-значение. Этот макрос создаёт буферно-локальную связь в текущем буфере для каждой из переменных и присваивает им буферно-локальные значения. Это эквивалентно вызову
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
-
Эта функция удаляет все буферно-локальные связи переменных текущего буфера, за исключением переменных, помеченных как постоянные, и локальных функций хуков, имеющих свойство не-
nilpermanent-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