回答:
これらの古いファイルがロードされるのを防ぐ組み込みの方法はありませんが、それらを取り除く簡単な方法があります。
M-x byte-recompile-directory RET ~/.emacs.d/elpa/
。auto-compile-on-load-mode
ファイルをロードする前にファイルをコンパイルできるようにアクティブ化できます。はい、それはかなり単純であることが判明しました。load-prefer-newer
変数は、まさにこの目的を果たします。
(setq load-prefer-newer t)
残念ながら、一部のコードがのように特定の.elc
ファイルをターゲットにしている場合は機能しません
(load "server.elc")
。ただし、require
s を使用している場合、またはload
サフィックスなしで呼び出している場合は、これで十分です。
ドキュメントから:
load-prefer-newerは、lread.cで定義されている変数です。
その値はnilですドキュメント:
非nilは、loadがファイルの最新バージョンを優先することを意味します。
これは、ファイル名の接尾辞が明示的に指定されておらず、ロードがさまざまな可能な接尾辞を試行している場合に適用されます(load-suffixesおよびload-file-rep-suffixesを参照)。通常、どちらか一方を明示的に指定しない限り、最初に存在するファイルで停止します。このオプションが非nilの場合、すべてのサフィックスをチェックし、最新のファイルを使用します。
これをカスタマイズする場合、カスタマイズが読み込まれる前にロードされるファイルには明らかに影響しないことに注意してください!
私はずっと前にインターネットでこれに会った:
;; If you're saving an elisp file, likely the .elc is no longer valid:
(add-hook 'emacs-lisp-mode-hook 'esk-remove-elc-on-save)
(defun esk-remove-elc-on-save ()
"If you're saving an elisp file, likely the .elc is no longer valid."
(make-local-variable 'after-save-hook)
(add-hook 'after-save-hook
(lambda ()
(if (file-exists-p (concat buffer-file-name "c"))
(delete-file (concat buffer-file-name "c"))))))
FILE
emacs-lisp-modeで作業して保存すると、上記のコードFILEc
が存在する場合は削除されます。
また、開発中のパッケージを編集して、再コンパイルするのを忘れることもあります。新しいファイルをロードしようとすると、Emacsがまだ古いコンパイル済みファイルを使用していることに気付くのに時間がかかります。
初期化ファイルにフックを追加することをお勧めしますか?
(add-hook 'after-save-hook 'byte-compile-current-buffer)
または、elファイルにのみフックを適用する場合:
(add-hook 'emacs-lisp-mode-hook (lambda () (add-hook 'after-save-hook 'byte-compile-current-buffer nil t)))
auto-compile
以下に加えて、Emacs 24.4+の(素晴らしい!)ライブラリを使用するよう人々に促します。それは本当の設定と忘れの解決策です。コンパイルされたコードが古くなった後でも、遅いコンパイルされていないコードを実行し続けるload-prefer-newer
ことを保証するだけです。