16.9 卸载

你可以丢弃由某个库加载的函数和变量,以回收内存供其他 Lisp 对象使用。 为此,请使用函数 unload-feature

Command: unload-feature feature &optional force

该命令卸载提供了 feature 功能的库。 它会取消定义该库中通过 defundefaliassubstdefmacrodefconstdefvardefcustom 定义的所有函数、宏和变量。 然后恢复这些符号原先关联的自动加载定义。 (加载时会将这些定义保存在符号的 function-history 属性中。)

在恢复之前的定义之前,unload-feature 会运行 remove-hook, 从某些钩子中移除由该库定义的函数。 这些钩子包括名称以 ‘-hook’ 结尾的变量(或已废弃的后缀 ‘-hooks’), 以及 unload-feature-special-hooks 中列出的变量,还有 auto-mode-alist。 这样做是为了防止 Emacs 因重要钩子引用了已不再定义的函数而无法正常运行。

标准卸载操作还会取消对该库中函数的 ELP 性能分析, 取消该库所提供的所有功能,并取消存放在该库定义的变量中的定时器。

如果这些措施仍不足以防止功能异常,库可以定义一个显式的卸载函数, 名为 feature-unload-function。 如果该符号被定义为函数,unload-feature 会在执行其他操作之前 无参数调用它。 该函数可以执行任何适合卸载该库的操作。 如果它返回 nilunload-feature 会继续执行常规卸载动作; 否则认为卸载工作已完成。

通常情况下,unload-feature 拒绝卸载被其他已加载库依赖的库。 (如果库 a 中包含对 brequire,则 a 依赖于库 b。) 如果可选参数 force 为非 nil,则忽略依赖关系,可以卸载任意库。

unload-feature 函数由 Lisp 编写,其行为基于变量 load-history

Variable: unload-feature-special-hooks

该变量保存一个钩子列表,在卸载库时会扫描这些钩子,以移除库中定义的函数。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike