Динамическая переменная всего проекта в Emacs - PullRequest
0 голосов
/ 12 декабря 2018

Я хотел бы иметь переменную всего проекта, которую я могу изменить при просмотре этого проекта.Другими словами, я бы хотел, чтобы это затрагивалось при открытии файла.Да, я знаю, что .dir-locals.el существует в мире Emacs.Но я думаю, что при открытии файла в рамках этого проекта он будет сброшен до значения, установленного в .dir-locals.el.

Могу ли я получить от вас подсказки, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Для такого рода вещей вы можете захотеть использовать функцию вместо переменной (напрямую).В частности, используйте функцию получения и установки.

Весь ваш код проекта может вызывать функцию получения, чтобы получить значение (которое может быть кэшировано в переменной).И весь ваш код может вызывать функцию установки для изменения значения (которое, опять же, может кэшироваться в переменной).

Эти функции могут быть видны глобально для вашего проекта.Переменная кеша будет доступна только функциям getter и setter.


Но что касается кода везде в вашем проекте, получает информацию , когда значение обновляется и делает то, что нужно сновое значение всякий раз, когда это происходит, см. @ Phil's comment по поводу использования переменной - применимы те же соображения.

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


Для переменной вы можете сделать что-то подобное, используя, как сказал @Phils в комментарии, команду add-variable-watcher.

* 1017.* Для переменной пользовательской опции вы можете сделать нечто подобное, используя функции :set и :get в defcustom.(Но они вступают в силу только в случае внесения изменений с использованием соответствующих функций настройки или пользовательского интерфейса настройки.)
0 голосов
/ 13 декабря 2018

Вы можете eval в dir-locals.el Итак, если у вас есть переменная my-var, которую вы хотите изменить с помощью setq, вы можете сделать что-то вроде

((nil . ((eval . (or (boundp 'my-var) (setq my-var 'default))))))

Тамэто предупреждения об использовании eval в dir-local, так как там можно запустить любой код.

...