代码之家  ›  专栏  ›  技术社区  ›  Cheeso

帮助我解决flymake和csharp的自动加载排序问题

  •  3
  • Cheeso  · 技术社区  · 14 年前

    如何交付一个需要修补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的影响最小?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Community datashaman    7 年前

    如果我理解正确,让用户将此添加到 .emacs 会解决问题:

    ;;;###autoload
    (eval-after-load "flymake" '(code-that-patches-flymake-allowed-file-name-masks))
    (autoload 'flymake-for-csharp-init "flymake-for-csharp" nil nil)
    

    现在,如果你和使用你的软件包的人一起工作,你可以使用 loaddefs.el trick 通过将 ;;;###autoload eval-after-load 在包中插入行,然后重新生成 loaddefs.el 文件。

    但是,如果您希望在Internet中通用的解决方案,则需要用户在其 .emacs公司 .


    关于你的清理代码的评论,我相信可以简化为:

    (let ((csharpentry (assoc "\\.cs\\'" flymake-allowed-file-name-masks)))
      (when csharpentry
        (setcdr csharpentry '(flymake-for-csharp-init flymake-for-csharp-cleanup))))