33.17.2 由主模式控制的缩进

各个主模式的一项重要功能是自定义 TAB 键,使其针对所编辑的语言进行正确缩进。 本节描述 TAB 键的工作机制及其控制方式。 本节中的函数返回值无确定意义。

Command: indent-for-tab-command &optional rigid

这是大多数编辑模式下绑定到 TAB 键的命令。 其常规行为是缩进当前行,但也可以插入制表符或缩进区域。

具体行为如下:

  • 首先检查是否启用临时标记模式且区域处于激活状态。 若是,则调用 indent-region 缩进区域内所有文本(see 整块区域缩进)。
  • 否则,如果 indent-line-function 中的缩进函数为 indent-to-left-margin(仅插入制表符的简单命令), 或者变量 tab-always-indent 指定应当插入制表符(见下文),则插入一个制表符。
  • 否则缩进当前行,通过调用 indent-line-function 中的函数完成。 如果该行已经缩进完成,且 tab-always-indent 的值为 complete(见下文),则尝试对光标处文本进行补全。

如果 rigidnil(交互方式下使用前缀参数),则在该命令缩进一行或插入制表符后, 还会对以当前行开头的整个平衡表达式进行刚性缩进,以反映新的缩进量。 若命令对区域进行缩进,则忽略该参数。

Variable: indent-line-function

该变量的值为 indent-for-tab-command 及其他各类缩进命令用于缩进当前行的函数。 它通常由主模式设置;例如 Lisp 模式将其设为 lisp-indent-line,C 模式设为 c-indent-line,依此类推。 默认值为 indent-relative。See 代码自动缩进

Command: indent-according-to-mode

该命令调用 indent-line-function 中的函数,按照当前主模式的规则缩进当前行。

Command: newline-and-indent

该函数插入一个换行符,然后按照主模式规则对新行(刚插入换行符后的那一行)进行缩进。 它通过调用 indent-according-to-mode 完成缩进。

Command: reindent-then-newline-and-indent

该命令重新缩进当前行,在光标处插入换行符,然后对新行(刚插入换行符后的那一行)进行缩进。 它对两行均通过调用 indent-according-to-mode 完成缩进。

User Option: tab-always-indent

该变量可用于自定义 TABindent-for-tab-command)命令的行为。 若值为 t(默认),命令通常只缩进当前行。 若值为 nil,仅当光标位于左边界或行的缩进部分时才缩进当前行,否则插入制表符。 若值为 complete,命令先尝试缩进当前行;如果行已缩进,则调用 completion-at-point 对光标处文本进行补全(see 普通缓冲区中的补全)。

User Option: tab-first-completion

tab-always-indentcomplete 时,可通过 tab-first-completion 变量进一步自定义是展开补全还是缩进。 可使用以下值:

eol

仅当光标位于行尾时进行补全。

word

除非下一个字符具有单词语法,否则进行补全。

word-or-paren

除非下一个字符具有单词语法或是括号,否则进行补全。

word-or-paren-or-punct

除非下一个字符具有单词语法、是括号或是标点符号,否则进行补全。

无论设置如何,连续按两次 TAB 总会触发补全。

某些主模式需要支持嵌入其他主模式语法的文本区域。 例如结合了文档与代码片段的文学化编程(literate programming)源文件、包含 Python 或 JS 代码片段的 Yacc/Bison 程序等。 为正确缩进嵌入的代码块,主模式需要将缩进工作委托给其他模式的缩进引擎(例如对 JS 代码调用 js-indent-line,对 Python 调用 python-indent-line),同时为其提供上下文以指导缩进。 主模式在其缩进代码中应避免调用 widen,并遵守 prog-first-column

Variable: prog-indentation-context

当该变量非 nil 时,保存由上层主模式为子模式缩进引擎提供的缩进上下文。 值应为形如 (first-column . rest 的列表。 列表成员含义如下:

first-column

顶层结构所用的列号。它会替换子模式默认使用的顶层列值(通常为 0)。

rest

该值目前未使用。

主模式的缩进引擎在作为其他主模式的子模式被调用时,应使用以下便利函数。

Function: prog-first-column

缩进程序顶层结构时,调用该函数代替直接使用字面量(通常为 0)作为列号。 函数返回值为顶层结构应使用的列号。 若无上层模式生效,该函数返回 0。