我想要一个项目范围的变量,我可以在查看该项目时更改它。换句话说,每当打开文件时,我都希望它受到影响。是的,我知道.dir-locals.el
存在于Emacs世界中。但我认为,每当在该项目下打开文件时,它都会重置为.dir-locals.el
中设置的值。
我能从你那里得到一些提示吗?
对于这种事情,您可能希望使用函数而不是变量(直接(。具体来说,使用getter和setter函数。
所有项目代码都可以调用getter函数来获取值(可以缓存在变量中(。您的所有代码都可以调用setter函数来更改值(同样,该值可以缓存在变量中(。
这些函数可以在全局范围内对您的项目可见。缓存变量只能由getter和setter函数访问。
但是,对于项目中任何地方的代码,当值更新时,都会被通知,并在发生这种情况时对新值进行适当的处理,请参阅@Phil关于变量使用的评论-同样的注意事项也适用。
您可以在setter函数中有一个钩子(或建议它(,以便它在更新值时做一些额外的事情(例如通知感兴趣/订阅的代码(。
对于一个变量,你可以使用add-variable-watcher
来做类似的事情,就像@Phils在评论中所说的那样。
对于用户选项变量,可以使用defcustom
中的:set
和:get
函数执行类似的操作。(但只有当使用适当的自定义功能或自定义UI进行更改时,这些更改才会生效。(
您可以在dir-locals.el
中使用eval
。因此,如果您有一个变量my-var
,希望能够使用setq
进行更改,则可以执行类似的操作
((nil . ((eval . (or (boundp 'my-var) (setq my-var 'default))))))
但是,有关于在本地目录中使用eval
的警告,因为任何代码都可以在那里运行。