Мені не зовсім зрозуміло всі варіанти буферно-локальних змінних, навіть після того, як прочитав усі документи та купу публікацій тут на 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
буферні локальні vars або не-буферні локальні vars?
Чи setq-local
потрібно для defvar-local
оголошеної змінної?
Чи setq-local
перетворить звичайну defvar
заявлену змінну в буферну локальну змінну? (Іншими словами, чи setq-local
якимось чином еквівалент (make-variable-local xxx)
декларації?
(setq-local VAR VALUE)
це лише скорочення (set (make-local-variable VAR) VALUE)
, яке було (і досі є) загальною фразою.