起動時間(= autoload)を最小限に抑え、ユーザーのemacs.elへの影響を最小限に抑えて、flymakeのパッチ適用が必要なモジュールを提供するにはどうすればよいですか?
私はflymake-for-csharpモジュールに取り組んでいます。これはflymakeで動作し、C#コードファイルをより柔軟にする方法を教えます。たとえば、makefileを使用するだけでなく、flymake-for-csharpは.csprojファイルを使用することも、csc.exeを直接呼び出すこともできます。
モジュールは正常に動作します。現在、正しく自動ロードできるようにしようとしています。
これが課題です。
どの言語がflymakeされるかを定義するために、flymake.elには、ファイル拡張子(.java、.cs、.cなど)のリストと、それらの各言語のinitおよびcleanupルーチンが含まれています。デフォルトのflymake.elにはC#のエントリがありますが、前述したように、デフォルトのC#の動作は十分に柔軟ではありません。より柔軟にするには、flymakeリストのC#エントリを置き換えて、flymake-for-csharpモジュールの新しいinit/cleanupロジックを指すようにする必要があります。私と一緒に?
実行時にアリストにパッチを適用することは問題ありません。次のようになります。
(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-for-csharpにあるロジックを受け入れるように説得することです。次に、アリストはより柔軟な初期化/クリーンアップルーチンを取得し、おじさんをボブします。
しかし今のところ、flymake-for-csharpを既存の(組み込みの)flymake.elで動作させたいと思います。そこに問題があります。アリストにパッチを適用しながら、flymake-for-csharpを自動ロードするにはどうすればよいですか?
理想的には、ユーザーのemacs.elを次のように表示します。
(autoload 'flymake-for-csharp-init "flymake-for-csharp" nil nil)
...おそらく小さな(eval-after-load ..
セクションで。
ただし、C#の新しいエントリを含めるためにflymake alistにパッチが適用された 後でのみ、関数flymake-for-csharp-init
が呼び出されます。
この鶏が先か卵が先かという状況を回避する方法はありますか?
私が考えた1つのアプローチは(require 'flymake-for-csharp)
、の代わりに使用することでしautoload
た。そのflymake-for-csharpモジュール内で、パッチロジックのみを実行してから、残りの関数に何らかの方法でautoloadを使用します。これは良い考えでしょうか?これには、flymake-for-csharpを2つの異なるファイルで配信する必要がありますか?
私が考えたもう1つのアプローチはeval-after-load
、onflymake.elを使用することでした。その中で、パッチ機能を提供することができました。これといくつかの質問:
これは、flymakeが自動ロードされている場合にのみ機能しますか?(外部の)eval-after-loadが評価されたときに、すでにロードされているモジュールのeval-after-load内のロジックはどうなりますか?
ユーザーのemacs.elに影響を与えずにこれを行うにはどうすればよいですか?
要約すると、起動時間(= autoload)を最小限に抑え、ユーザーのemacs.elへの影響を最小限に抑えて、flymakeのパッチ適用が必要なモジュールを提供するにはどうすればよいですか?