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