主模式用于定制 Emacs,使其适配特定类型文本的编辑与交互。每个缓冲区在同一时刻只能拥有一个主模式。 每个主模式都对应一个 主模式命令(major mode command),其名称应以 ‘-mode’ 结尾。 该命令负责在当前缓冲区切换至对应模式,通过设置局部键盘映射等各类缓冲区局部变量实现。See 主模式编码规范。 注意,与次模式不同,主模式无法直接 “关闭(turn off)”,只能将缓冲区切换至其他主模式。 不过你可以临时 挂起 主模式,并在之后 恢复 该挂起模式,详见下文。
通用性最强的主模式称为 基本模式(Fundamental mode),该模式不包含任何特定于模式的定义与变量设置。
该函数功能与fundamental-mode 类似,会清空所有缓冲区局部变量,同时会记录当前生效的主模式,以便后续恢复。
当你需要将缓冲区临时设置为 Emacs 不会自动选择的专用模式(see Emacs 如何选择主模式),
且希望之后能切回原始模式时,该函数与major-mode-restore(见下文)十分实用。
该函数用于恢复由 major-mode-suspend 记录的主模式。
若未记录任何主模式,则调用 normal-mode(see normal-mode);
若参数 avoided-modes 非空,则会强制排除该列表中的模式。
切换主模式会清空大部分局部变量,但不会移除缓冲区中的文本属性、覆盖层等所有痕迹。
通常很少需要在不同主模式之间直接切换(从基本模式切换至其他模式除外),因此一般无需关注该问题。
在调试缓冲区问题等场景下,有时需要对缓冲区进行 “完全重置(full reset)”,这正是clean-mode 主模式的用途。
它会清空所有局部变量(包括永久局部变量),同时移除所有覆盖层与文本属性。
编写主模式最简单的方式是使用宏define-derived-mode,该宏可基于已有主模式创建新的派生主模式。
See 定义派生模式。
即使新主模式并非明显派生自其他模式,我们仍推荐使用define-derived-mode,
它会自动遵循多项编码规范。常用的基础派生主模式,See 基础主模式。
标准 GNU Emacs Lisp 目录树中包含多个主模式的实现代码, 例如 text-mode.el、texinfo.el、lisp-mode.el 与 rmail.el 等文件。你可以通过这些库学习主模式的编写方法。