Emacs中的动态项目范围变量



我想要一个项目范围的变量,我可以在查看该项目时更改它。换句话说,每当打开文件时,我都希望它受到影响。是的,我知道.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的警告,因为任何代码都可以在那里运行。

最新更新