33.17.3 整块区域缩进

本节介绍用于对区域内所有行进行缩进的命令。它们的返回值无确定意义。

Command: indent-region start end &optional to-column

该命令对起始于 start(包含)与 end(不包含)之间的所有非空行进行缩进。 如果 to-columnnilindent-region 会调用当前模式的缩进函数(即 indent-line-function 的值)对每一行非空行缩进。

如果 to-columnnil,它应当是一个整数,用于指定缩进的列数; 此时该函数会通过添加或删除空白字符,为每一行设置精确的缩进量。

如果存在填充前缀,indent-region 会让每一行以该填充前缀开头来实现缩进。

Variable: indent-region-function

该变量的值是一个可被 indent-region 用作快捷方式的函数。 它应接收两个参数:区域的起始位置与结束位置。 你设计的函数应当与逐行缩进区域的效果一致,但通常速度更快。

如果值为 nil,则无快捷方式,indent-region 会实际逐行处理。

快捷函数在 C 模式、Lisp 模式等模式中非常有用, 这些模式下的 indent-line-function 需要从函数定义开头扫描; 逐行应用会导致时间复杂度为平方级。 快捷方式可以在逐行缩进时更新扫描信息,使时间复杂度降为线性。 在单行缩进速度很快的模式中,则无需快捷方式。

带有非 nil 参数 to-columnindent-region 含义不同,不会使用该变量。

Command: indent-rigidly start end count

该函数将起始于 start(包含)与 end(不包含)之间的所有行整体横向移动 count 列。 这会保持受影响区域的形状,将其作为一个刚性整体移动。

它不仅可用于缩进未排版的文本区域,也可用于缩进已格式化的代码区域。 例如,如果 count 为 3,该命令会为指定区域内每一行增加 3 列的缩进。

以交互方式调用且无前缀参数时,该命令会进入一个临时模式,用于刚性调整缩进。 See Indentation Commands in The GNU Emacs Manual

Command: indent-code-rigidly start end columns &optional nochange-regexp

该命令与 indent-rigidly 类似,区别是它不会修改位于字符串或注释内部的行。

此外,如果 nochange-regexpnil 且在行首匹配成功,则不会修改该行。