Emacs包定制和自动加载

时间:2015-09-21 11:12:32

标签: emacs customization autoload

我正在为一个包添加Customize支持,该包提供了几个与模式无关的全局命令。由于我不想加载包,除非用户通过键绑定显式调用命令但我想在用户安装包后立即允许自定义,我尝试使用如下代码:

;;;###autoload
(defcustom foo-bar nil 
 "bar setting for for"
 :type boolean)

;;;###autoload
(defun foo-command-1 () ...)

在我安装软件包后,我可以调用foo-command-1。我也可以使用customize-variable来设置和保存foo-bar。但是,当我再次启动Emacs时,foo-bar的值将重置为默认值,而Emacs会抱怨该值已在自定义之外更改。

AFAICS的原因是Emacs为defcustom自动加载文件中的代码假定它将在Emacs调用custom-set-variables中的init.el之前运行。但是,在init文件之后运行自动加载的软件包不是这种情况。

这是一个已知问题吗?为了解决方法,我用以下内容替换了上面的内容:

;;;###autoload
(unless (fboundp 'foo-command-1)
 (defcustom foo-bar nil 
  "bar setting for for"
  :type boolean))

;;;###autoload
(defun foo-command-1 () ...)

将整个defcustom定义复制到自动加载中,并防止在加载包真实时第二次运行它。这样可以正常恢复保存的选项。我仍然感到疑惑###autoload defcustom为什么var ps = PowerShell.Create(); ps.AddCommand("Set-ExecutionPolicy"); ps.AddArgument("Unrestricted"); ps.AddCommand("Import-Module"); ps.AddParameter("Name"); ps.AddArgument(@"'.\packages\EntityFramework.6.1.3\tools\EntityFramework.psm1'"; ps.AddCommand("Add-Migration"); ps.AddParameter("Name"); ps.AddArgument("Migration21Sept"); ps.AddParameter("ProjectName"); ps.AddArgument("Context1"); ps.Invoke(); 不能自己做正确的事。

2 个答案:

答案 0 :(得分:2)

是的,你所做的是一种合理的方式来实现你想要的。如果你想自动加载一个defcustom并且你关心何时相对于其他代码进行评估,那么你需要以某种方式控制这个时间。你选择的方式是合理的。

用户的初始文件可以在用户选择的任何位置加载custom-file。如果没有使用custom-file,它仍然不确定在什么时候将根据可能依赖于它设置的值的其他部分来评估由Customize管理的init文件代码的部分。

答案 1 :(得分:1)

作为一般规则,您不想自动加载变量。

是的,这是一个众所周知的问题,并没有真正好的解决方案(我能提出的每个解决方案都有自己的错误/错误行为),这就是为什么我只能说请不要自动加载变量"。

即使在碰巧做你想做的事情的情况下,我的经验也是不可取的。它只有太多怪癖和角落案件。

相关问题