33.13 自适应填充模式

当启用自适应填充模式(Adaptive Fill Mode)时,Emacs 会根据正在填充的每个段落中的文本自动确定填充前缀, 而非使用预设值。在填充过程中,该填充前缀会被插入到段落第二行及后续行的开头, 相关说明见 段落重排自动换行

User Option: adaptive-fill-mode

当该变量不为 nil 时,自适应填充模式启用。其默认值为 t

Function: fill-context-prefix from to

该函数实现了自适应填充模式的核心逻辑:它根据从 fromto (通常为段落起止位置)的文本选择填充前缀。具体通过查看段落前两行实现, 依据为下文所述的相关变量。

通常该函数会返回字符串类型的填充前缀。不过在返回前,函数会进行最终检查 (下文未特别说明),判断以该前缀开头的行是否会被误认为段落起始。 若出现该情况,函数会返回 nil 以标识异常。

具体而言,fill-context-prefix 的执行流程如下:

  1. 从第一行获取填充前缀候选——优先尝试 adaptive-fill-function 中的函数(若存在), 再使用正则表达式 adaptive-fill-regexp(见下文)。 两者中第一个非 nil 的结果即为第一行的候选值,若均为 nil 则候选值为空字符串。
  2. 若段落仅有一行,函数会校验上述候选前缀的有效性。有效则返回该候选, 否则返回等宽空格字符串(参见下文 adaptive-fill-first-line-regexp 说明)。
  3. 若段落已有两行,函数会以与第一行相同的方式在第二行查找前缀候选。 若未找到则返回 nil
  4. 函数对两个前缀候选进行启发式比较:若第二行候选中的非空白字符在第一行候选中按相同顺序出现, 则返回第二行候选。否则返回两者共有的最长初始子串(可能为空字符串)。
User Option: adaptive-fill-regexp

自适应填充模式使用该正则表达式匹配行中左侧边距空白(若存在)之后的文本, 匹配到的字符即为该行的填充前缀候选。

其默认值可匹配夹杂特定标点符号的空白字符。

User Option: adaptive-fill-first-line-regexp

该正则表达式仅用于单行段落,作为对唯一可用填充前缀候选的额外校验: 候选必须匹配该正则表达式,或匹配 comment-start-skip。 若不满足,fill-context-prefix 会将该候选替换为等宽空格字符串。

该变量的默认值为 "\\`[ \t]*\\'",仅匹配纯空白字符串。 该默认设置的效果是强制单行段落的填充前缀始终为纯空白。

User Option: adaptive-fill-function

你可将该变量设为函数,以指定更复杂的自动填充前缀选择方式。 调用该函数时光标位于行左侧边距(若存在)之后,且函数必须保持光标位置不变。 函数应返回该行的填充前缀,或返回 nil 表示未能确定前缀。