Мне не совсем понятны все варианты локальных переменных буфера, даже после прочтения всех документов и множества публикаций здесь на SX.
Вот краткое изложение моего понимания:
(defvar foo ..)
объявляет динамическую переменную для файла. Но переменная (1) не известна другим файлам, если они не содержат также и defvar
оператор, и (2) переменная является глобальной по объему, а не локальной буферизацией.
(make-variable-buffer-local foo)
после defvar
вышесказанного сообщаем компилятору и всем остальным, что переменная foo должна рассматриваться как локальная по отношению к буферу везде, где она установлена, когда она установлена. Таким образом, этот шаблон является хорошим стилем для объявления локальной буферной переменной, помещающей оба оператора в файл.
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
Для удобства (defvar-local xxx ...)
форму можно использовать как одну строку вместо двух строк выше:
(defvar-local xxx ...) ;make xxx buffer local everywhere
После объявления, как указано выше, переменная xxx может использоваться как любая другая переменная в операторах setq.
Если я просто хочу иметь единственный экземпляр локальной буферной переменной, которая уже является глобальной динамической переменной, я бы использовал следующие объявления. Первый объявляет динамическую переменную глобальной области видимости, а второй оператор создает только один экземпляр локальной для буфера версии этой переменной в текущем буфере:
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
Теперь для моих эксплицитных вопросов (все вышеперечисленные были неявными вопросами о том, правильное ли мое понимание).
При установке значения переменных я могу использовать setq
или
setq-local
. Когда следует setq-local
использовать? Почему?
Что произойдет, если я использую setq-local
переменные локального буфера или локальные переменные без буфера?
Является ли setq-local
требуется для defvar-local
объявленной переменной?
Будет ли setq-local
обычная defvar
объявленная переменная превратить ее в локальную переменную буфера? (Другими словами, setq-local
как-то эквивалент (make-variable-local xxx)
объявления?
(setq-local VAR VALUE)
это просто сокращение (set (make-local-variable VAR) VALUE)
, которое было (и остается) общей идиомой.