Я пишу основной режим emacs, который использует буфер-локальные переменные для хранения некоторого состояния:
(defun foo-mode ()
"My nice major mode"
(interactive)
(kill-all-local-variables)
(setq mode-name "foo")
(setq major-mode 'foo-mode)
(set (make-local-variable 'foo-state) "bar"))
(defun foo-change-state ()
(setq foo-state "baz"))
Это работает очень хорошо и обладает тем свойством, что в любом буфере, не использующем мой основной режим, переменная foo-state
не привязана (что, на мой взгляд, очень хорошо, поскольку она позволяет избежать загромождения таблицы символов).
Однако, байт-компиляция такой части кода вызывает следующее предупреждение:
Warning: assignment to free variable `foo-state'
Использование defvar
избавляет от предупреждения, но имеет побочный эффект, который foo-state
теперь привязан повсюду, что нежелательно, на мой взгляд.
Есть ли способ избавиться от предупреждений, пока не привязывает переменные, зависящие от режима, в каждом буфере? Или я ошибаюсь, когда думаю, что эти переменные не должны объявляться глобально?