17.3 文档字符串与编译

当 Emacs 从字节编译文件中加载函数和变量时, 通常不会将它们的文档字符串加载到内存中。 每个文档字符串仅在需要时才从 字节编译文件中动态加载。这样可以节省内存, 并且通过跳过文档字符串的处理加快加载速度。

该特性有一个缺点:如果你删除、移动或修改 编译后的文件(例如编译新版本),Emacs 可能 无法再访问已加载函数或变量的文档字符串。 这类问题通常只在你自行构建 Emacs, 并且恰好编辑和/或重新编译 Lisp 源文件时出现。 要解决此问题,只需在重新编译后重新加载对应文件即可。

对字节编译文件的文档字符串动态加载, 是在编译时为每个字节编译文件确定的。 可以通过选项 byte-compile-dynamic-docstrings 禁用该功能。

User Option: byte-compile-dynamic-docstrings

如果该变量非 nil,字节编译器会生成 支持文档字符串动态加载的编译文件。

要为特定文件禁用动态加载功能, 请在文件的头部行中将此选项设为 nil (see Local Variables in Files in The GNU Emacs Manual),示例如下:

-*-byte-compile-dynamic-docstrings: nil;-*-

这主要适用于你预计会修改该文件, 并且希望已加载该文件的 Emacs 会话在文件变更后仍能正常工作的场景。

在内部,文档字符串的动态加载是通过 在编译文件中写入一种特殊的 Lisp 读取构造 ‘#@count’ 实现的。该构造会跳过接下来 count 个字符。它还会使用 ‘#$’ 构造, 该构造表示当前文件的名字(字符串形式)。 不要在 Lisp 源文件中使用这些构造; 它们并非为方便人类阅读而设计。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike