Answers:
没有内置的方法可以防止这些旧文件被加载,但是有一些简便的方法可以消除它们。
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中定义的变量。
它的值为零文档:
非零表示加载倾向于使用文件的最新版本。
当未明确指定文件名后缀,并且负载正在尝试各种可能的后缀时,这适用(请参阅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仍在使用旧的编译文件。
我可以建议在您的init文件中添加一个挂钩吗?
(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
仅确保在编译后的代码过期后,您将继续运行慢速的未编译代码。