你可以在一个 Emacs 会话中多次加载同一个文件。例如,当你在缓冲区中编辑并重写并重新安装了某个函数定义后,若想恢复到原始版本,可以通过重新加载该函数所在的源文件来实现。
加载或重新加载文件时,请记住:load 和 load-library 函数会自动加载字节编译后的文件,而非同名的未编译文件。如果你重写了某个文件并打算保存与重新安装,就需要对新版本进行字节编译;否则 Emacs 会加载旧的字节编译文件,而不是你新修改的未编译文件!
如果发生这种情况,加载时显示的信息会包含 ‘(compiled; note, source is newer)’,以提醒你重新编译。
在 Lisp 库文件中编写表单时,要考虑到该文件可能会被多次加载。例如,思考每个变量在库被重新加载时是否应当被重新初始化;如果变量已经初始化,defvar 不会改变其值。(See 定义全局变量。)
向关联列表(alist)添加元素的最简单写法如下:
(push '(leif-mode " Leif") minor-mode-alist)
但如果库被重新加载,这会导致添加多个重复元素。要避免该问题,请使用 add-to-list(see 修改列表变量):
(add-to-list 'minor-mode-alist '(leif-mode " Leif"))
有时你需要显式判断某个库是否已经加载。如果该库使用 provide 提供了命名功能(feature),你可以在文件中更早的位置使用 featurep 来判断 provide 调用是否已经执行过(see 功能)。
或者,你也可以使用类似下面的代码:
(defvar foo-was-loaded nil) (unless foo-was-loaded execute-first-time-only (setq foo-was-loaded t))