16.6 重复加载

你可以在一个 Emacs 会话中多次加载同一个文件。例如,当你在缓冲区中编辑并重写并重新安装了某个函数定义后,若想恢复到原始版本,可以通过重新加载该函数所在的源文件来实现。

加载或重新加载文件时,请记住:loadload-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))
emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike