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: Your Name <[email protected]> ;; Someone Else <[email protected]> ;; Another Person <[email protected]>
格式与 Author 相同。列出当前维护该文件的人员(负责接收错误报告等)。
若无 Maintainer 行,则默认 Author 即为维护者。 Emacs 中的部分文件使用 ‘[email protected]’ 作为维护者, 表示原作者不再负责,由 Emacs 团队统一维护。
可选行,记录文件最初创建日期,仅用于历史参考。
若需要为单个 Lisp 程序记录版本号,可写在此行。 随 Emacs 分发的 Lisp 文件通常没有 Version 行, 因为 Emacs 自身版本号已起到相同作用。 若你分发多个文件,建议只在主文件写版本号,而非每个文件都写。
本行为 finder-by-keyword 帮助命令列出关键词。
可通过该命令查看有效关键词列表。
命令 M-x checkdoc-package-keywords RET 会查找并显示不在 finder-known-keywords 中的关键词。
若将变量 checkdoc-package-keywords-flag 设为非 nil,
checkdoc 命令会在检查中包含关键词验证。
用户按主题查找包时会通过该字段定位。 关键词之间可用空格、逗号或两者分隔。
该字段名称容易引起误解, 人们常以为可以在此填写任意描述性关键词,而非仅 Finder 适用的关键词。
说明库的官方网站。
若 ‘Version’ 不适用于包管理器,包可定义 ‘Package-Version’ 替代使用。
这在 ‘Version’ 是 RCS 标识或其他无法被 version-to-list 解析的内容时很方便。See 软件包基础。
若存在本行,说明当前包正常运行所依赖的其他包。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’ 行, 其他按需使用。 你也可以添加其他名称的标题行,它们无标准含义,不会造成问题。
我们使用额外的格式化注释划分库文件内容, 并以空行与其他内容分隔。以下是标准格式:
开始介绍性注释,说明库的工作方式。 应紧跟在复制许可之后, 并由以下注释行之一结束:‘Change Log’、‘History’ 或 ‘Code’。 该文本会被 Finder 包使用,因此应适合该场景。
开始可选的文件变更日志。 不要在此记录过多细节——详细日志最好放在版本控制系统(如 Emacs 所用)或单独的 ChangeLog 文件中。 ‘History’ 可作为 ‘Change Log’ 的替代写法。
开始程序的实际代码部分。
这是 文件尾行(footer line),出现在文件最末尾。 目的是让人们通过是否存在尾行来判断文件是否被截断。