各个主模式的一项重要功能是自定义 TAB 键,使其针对所编辑的语言进行正确缩进。 本节描述 TAB 键的工作机制及其控制方式。 本节中的函数返回值无确定意义。
这是大多数编辑模式下绑定到 TAB 键的命令。 其常规行为是缩进当前行,但也可以插入制表符或缩进区域。
具体行为如下:
indent-region 缩进区域内所有文本(see 整块区域缩进)。
indent-line-function 中的缩进函数为 indent-to-left-margin(仅插入制表符的简单命令),
或者变量 tab-always-indent 指定应当插入制表符(见下文),则插入一个制表符。
indent-line-function 中的函数完成。
如果该行已经缩进完成,且 tab-always-indent 的值为 complete(见下文),则尝试对光标处文本进行补全。
如果 rigid 非 nil(交互方式下使用前缀参数),则在该命令缩进一行或插入制表符后,
还会对以当前行开头的整个平衡表达式进行刚性缩进,以反映新的缩进量。
若命令对区域进行缩进,则忽略该参数。
该变量的值为 indent-for-tab-command 及其他各类缩进命令用于缩进当前行的函数。
它通常由主模式设置;例如 Lisp 模式将其设为 lisp-indent-line,C 模式设为 c-indent-line,依此类推。
默认值为 indent-relative。See 代码自动缩进。
该命令调用 indent-line-function 中的函数,按照当前主模式的规则缩进当前行。
该函数插入一个换行符,然后按照主模式规则对新行(刚插入换行符后的那一行)进行缩进。
它通过调用 indent-according-to-mode 完成缩进。
该命令重新缩进当前行,在光标处插入换行符,然后对新行(刚插入换行符后的那一行)进行缩进。
它对两行均通过调用 indent-according-to-mode 完成缩进。
该变量可用于自定义 TAB(indent-for-tab-command)命令的行为。
若值为 t(默认),命令通常只缩进当前行。
若值为 nil,仅当光标位于左边界或行的缩进部分时才缩进当前行,否则插入制表符。
若值为 complete,命令先尝试缩进当前行;如果行已缩进,则调用 completion-at-point 对光标处文本进行补全(see 普通缓冲区中的补全)。
当 tab-always-indent 为 complete 时,可通过 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。
当该变量非 nil 时,保存由上层主模式为子模式缩进引擎提供的缩进上下文。
值应为形如 (first-column . rest 的列表。
列表成员含义如下:
顶层结构所用的列号。它会替换子模式默认使用的顶层列值(通常为 0)。
该值目前未使用。
主模式的缩进引擎在作为其他主模式的子模式被调用时,应使用以下便利函数。
缩进程序顶层结构时,调用该函数代替直接使用字面量(通常为 0)作为列号。 函数返回值为顶层结构应使用的列号。 若无上层模式生效,该函数返回 0。