Emacs中项目范围内的动态变量

时间:2018-12-12 20:50:28

标签: variables emacs project

我想要一个项目范围的变量,可以在查看该项目时进行更改。换句话说,无论何时打开文件,我都希望使其受到影响。是的,我知道.dir-locals.el存在于Emacs世界中。但是我认为只要在该项目下打开文件,它将重置为.dir-locals.el中设置的值。

请给我一些提示吗?

2 个答案:

答案 0 :(得分:2)

对于这种事情,您可能想要使用函数而不是变量(直接)。具体来说,请使用getter和setter函数。

所有项目代码都可以调用getter函数来获取值(可以将其缓存在变量中)。而且您所有的代码都可以调用setter函数来更改值(同样可以将其缓存在变量中)。

这些功能对您的项目全局可见。缓存变量只能由getter和setter函数访问。


但是对于项目中到处的代码,被告知何时更新值,并在新值发生时对新值进行适当的处​​理,请参阅@Phil关于变量使用的评论-相同注意事项。

您可以在setter函数中使用一个钩子(或建议它),以便它在更新值时会做其他事情(例如,通知有兴趣/订阅的代码)。


对于变量,可以使用@Phils在评论中说的add-variable-watcher来完成类似的操作。

对于用户选项变量,可以使用:set中的:getdefcustom函数执行类似的操作。 (但是只有在使用适当的Customize函数或Customize UI进行更改的情况下,这些更改才会生效。)

答案 1 :(得分:1)

您可以在evaldir-locals.el,因此,如果您希望使用my-var进行更改,可以执行类似的操作

setq

尽管在任何本地代码中都可以运行((nil . ((eval . (or (boundp 'my-var) (setq my-var 'default)))))) ,但在dir-local中仍存在警告。