24.2 主模式

主模式用于定制 Emacs,使其适配特定类型文本的编辑与交互。每个缓冲区在同一时刻只能拥有一个主模式。 每个主模式都对应一个 主模式命令(major mode command),其名称应以 ‘-mode’ 结尾。 该命令负责在当前缓冲区切换至对应模式,通过设置局部键盘映射等各类缓冲区局部变量实现。See 主模式编码规范。 注意,与次模式不同,主模式无法直接 “关闭(turn off)”,只能将缓冲区切换至其他主模式。 不过你可以临时 挂起 主模式,并在之后 恢复 该挂起模式,详见下文。

通用性最强的主模式称为 基本模式(Fundamental mode),该模式不包含任何特定于模式的定义与变量设置。

Command: fundamental-mode

基本模式对应的主模式命令。与其他模式命令不同,该命令 不会 运行任何模式钩子(see 主模式编码规范),因为该模式不支持用户定制。

Function: major-mode-suspend

该函数功能与fundamental-mode 类似,会清空所有缓冲区局部变量,同时会记录当前生效的主模式,以便后续恢复。 当你需要将缓冲区临时设置为 Emacs 不会自动选择的专用模式(see Emacs 如何选择主模式), 且希望之后能切回原始模式时,该函数与major-mode-restore(见下文)十分实用。

Function: major-mode-restore &optional avoided-modes

该函数用于恢复由 major-mode-suspend 记录的主模式。 若未记录任何主模式,则调用 normal-mode(see normal-mode); 若参数 avoided-modes 非空,则会强制排除该列表中的模式。

Function: clean-mode

切换主模式会清空大部分局部变量,但不会移除缓冲区中的文本属性、覆盖层等所有痕迹。 通常很少需要在不同主模式之间直接切换(从基本模式切换至其他模式除外),因此一般无需关注该问题。 在调试缓冲区问题等场景下,有时需要对缓冲区进行 “完全重置(full reset)”,这正是clean-mode 主模式的用途。 它会清空所有局部变量(包括永久局部变量),同时移除所有覆盖层与文本属性。

编写主模式最简单的方式是使用宏define-derived-mode,该宏可基于已有主模式创建新的派生主模式。 See 定义派生模式。 即使新主模式并非明显派生自其他模式,我们仍推荐使用define-derived-mode, 它会自动遵循多项编码规范。常用的基础派生主模式,See 基础主模式

标准 GNU Emacs Lisp 目录树中包含多个主模式的实现代码, 例如 text-mode.eltexinfo.ellisp-mode.elrmail.el 等文件。你可以通过这些库学习主模式的编写方法。

User Option: major-mode

该变量的缓冲区局部值保存着当前主模式对应的符号,其默认值为新缓冲区的默认主模式,标准默认值为fundamental-mode

若默认值为nil,则当 Emacs 通过C-x bswitch-to-buffer)等命令创建新缓冲区时, 新缓冲区会沿用此前当前缓冲区的主模式。 存在一个例外:若前一个缓冲区的主模式拥有值为specialmode-class 符号属性,则新缓冲区会使用基本模式(see 主模式编码规范)。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike