如何交付一个需要修补flymake的模块,并且启动时间(=自动加载)最小,对用户的emacs.el的影响最小?
我在为csharp模块做flymake。它与Flash制作,教它如何更灵活的C代码代码文件。例如,flymake For csharp不仅可以使用makefile,还可以使用.csproj文件,或者直接调用csc.exe。
模块工作正常。我现在正试图使它自动正确加载。
这是挑战。
要定义使用flymake的语言,flymake.el包含一个文件扩展名列表(.java、.cs、.c等),以及这些语言的初始化和清理例程。在默认的FrimaMe.EL中有一个C语言的条目,但是正如我所说的,默认的C语言行为不够灵活。为了使它更灵活,我需要在Fras-GultRealter中替换C的条目,以便指向CpHARP模块中的新init/清除逻辑。你和我一起?
在运行时修补列表是没有问题的。看起来是这样的:
(let (elt
(csharp-entry nil)
(masks flymake-allowed-file-name-masks))
;; Find the existing C# entry
(while (consp masks)
(setq elt (car masks))
(if (string= "\\.cs\\'" (car elt))
(setq csharp-entry elt))
(setq masks (cdr masks)))
;; remove the original entry for C# ...
(if csharp-entry
(setq flymake-allowed-file-name-masks
(delete csharp-entry flymake-allowed-file-name-masks)))
;; Now add a new entry for C#, with the custom init and cleanup methods.
(setq flymake-allowed-file-name-masks
(cons
'("\\.cs\\'" flymake-for-csharp-init flymake-for-csharp-cleanup)
flymake-allowed-file-name-masks)))
长期的解决方案是说服flymake和emacs的作者接受flymake中csharp的逻辑。然后,主义者将获得更灵活的init /清除例程。
鲍勃是你叔叔
.
但现在,我想为CpHARE制作FILE制作现有的(内置)FravaMe.EL。问题就在这里:我怎样才能在为csharp自动加载制作flymake的同时仍然修补alist?
理想情况下,我希望用户的emacs.el如下所示:
(autoload 'flymake-for-csharp-init "flymake-for-csharp" nil nil)
…可能有一个
(eval-after-load ..
章节。
但是你看,功能
flymake-for-csharp-init
只会被称为
之后
flymake列表已修补,以包含C#的新条目。
有办法解决这个鸡和蛋的问题吗?
我想到的一个方法是
(require 'flymake-for-csharp)
代替
autoload
. 在flymake for csharp模块中,只运行补丁逻辑,然后以某种方式使用autoload来完成其余的功能。这是个好主意吗?这需要我在两个不同的文件中为csharp交付flymake吗?
我想到的另一个方法是使用
eval-after-load
在flymake.el。我可以提供补丁功能。有几个问题:
-
只有当flymake被自动加载时,这才有效吗?当加载后的(外部)eval为eval时,已经加载的模块的eval after load中的逻辑会发生什么情况?
-
如何在不影响用户的emacs.el的情况下执行此操作?
总之,
如何交付一个需要修补flymake的模块,并且启动时间(=自动加载)最小,对用户的emacs.el的影响最小?