D.8 Emacs 库的标准文件头

Emacs 有一套在 Lisp 库中使用特殊注释的规范, 用于划分章节并记录作者等信息。 使用标准格式便于工具(和人)提取相关信息。 本节通过示例说明这些规范:

;;; foo.el --- Support for the Foo programming language  -*- lexical-binding: t; -*-

;; Copyright (C) 2010-2025 Your Name

;; Author: Your Name <[email protected]>
;; Maintainer: Someone Else <[email protected]>
;; Created: 14 Jul 2010
;; Keywords: languages
;; URL: https://example.com/foo

;; This file is not part of GNU Emacs.

;; This file is free software...
...
;; along with this file.  If not, see <https://www.gnu.org/licenses/>.

第一行必须采用如下格式:

;;; filename --- description  -*- lexical-binding: t; -*-

描述应放在一行内。 如果文件需要在 ‘-*-’ 中设置更多变量,可加在 lexical-binding 之后。 若这会导致第一行过长,可在文件末尾使用局部变量节。

版权声明通常列出你的名字(如果你是作者)。 若你的雇主对该作品拥有版权,则需列出雇主名称。 除非文件已被收入 Emacs 发行版或 GNU ELPA, 否则不要声明版权持有者为自由软件基金会(或声称该文件属于 GNU Emacs)。 关于版权与许可声明格式的更多信息,参见 GNU 网站上的指南

版权声明之后是若干 文件头注释(header comment) 行, 每一行以 ‘;; header-name:’ 开头。 以下是标准可用的标题:

Author

本行说明库的主要作者姓名与邮箱。 若有多位作者,可在续行以 ;; 加制表符或至少两个空格开头列出。 我们建议包含联系邮箱,格式为 ‘<…>’。例如:

;; Author: Your Name <[email protected]>
;;      Someone Else <[email protected]>
;;      Another Person <[email protected]>
Maintainer

格式与 Author 相同。列出当前维护该文件的人员(负责接收错误报告等)。

若无 Maintainer 行,则默认 Author 即为维护者。 Emacs 中的部分文件使用 ‘[email protected]’ 作为维护者, 表示原作者不再负责,由 Emacs 团队统一维护。

Created

可选行,记录文件最初创建日期,仅用于历史参考。

Version

若需要为单个 Lisp 程序记录版本号,可写在此行。 随 Emacs 分发的 Lisp 文件通常没有 Version 行, 因为 Emacs 自身版本号已起到相同作用。 若你分发多个文件,建议只在主文件写版本号,而非每个文件都写。

Keywords

本行为 finder-by-keyword 帮助命令列出关键词。 可通过该命令查看有效关键词列表。 命令 M-x checkdoc-package-keywords RET 会查找并显示不在 finder-known-keywords 中的关键词。 若将变量 checkdoc-package-keywords-flag 设为非 nil, checkdoc 命令会在检查中包含关键词验证。

用户按主题查找包时会通过该字段定位。 关键词之间可用空格、逗号或两者分隔。

该字段名称容易引起误解, 人们常以为可以在此填写任意描述性关键词,而非仅 Finder 适用的关键词。

URL
Homepage

说明库的官方网站。

Package-Version

若 ‘Version’ 不适用于包管理器,包可定义 ‘Package-Version’ 替代使用。 这在 ‘Version’ 是 RCS 标识或其他无法被 version-to-list 解析的内容时很方便。See 软件包基础

Package-Requires

若存在本行,说明当前包正常运行所依赖的其他包。See 软件包基础。 包管理器会在下载时(确保下载完整依赖)和激活时(确保所有依赖已激活)使用该信息。

格式为单行嵌套列表。每个子列表的 car 是包名(符号), cadr 是最低可接受版本号(可被 version-to-list 解析的字符串)。 省略版本的条目(仅符号或单元素子列表)等价于版本 "0"。例如:

;; Package-Requires: ((gnus "1.0") (bubbles "2.7.2") cl-lib (seq))

不需要支持 Emacs 27 之前版本的包,可将 ‘Package-Requires’ 拆分为多行:

;; Package-Requires: ((emacs "27.1")
;;                    (compat "29.1.4.1"))

注意这种格式下,列表仍需从 ‘Package-Requires’ 所在行开始。

包系统会自动定义名为 ‘emacs’ 的包,版本为当前运行的 Emacs 版本。 可用于声明包所需的最低 Emacs 版本。

几乎所有 Lisp 库都应包含 ‘Author’ 和 ‘Keywords’ 行, 其他按需使用。 你也可以添加其他名称的标题行,它们无标准含义,不会造成问题。

我们使用额外的格式化注释划分库文件内容, 并以空行与其他内容分隔。以下是标准格式:

;;; Commentary:

开始介绍性注释,说明库的工作方式。 应紧跟在复制许可之后, 并由以下注释行之一结束:‘Change Log’、‘History’ 或 ‘Code’。 该文本会被 Finder 包使用,因此应适合该场景。

;;; Change Log:

开始可选的文件变更日志。 不要在此记录过多细节——详细日志最好放在版本控制系统(如 Emacs 所用)或单独的 ChangeLog 文件中。 ‘History’ 可作为 ‘Change Log’ 的替代写法。

;;; Code:

开始程序的实际代码部分。

;;; filename ends here

这是 文件尾行(footer line),出现在文件最末尾。 目的是让人们通过是否存在尾行来判断文件是否被截断。