模式行的内容由一种名为 模式行构造(mode line construct) 的数据结构控制,该结构由列表、字符串、符号与数字组成,并保存在缓冲区局部变量中。每种数据类型对模式行的显示外观均有特定含义,详见下文。同一套数据结构也用于构造框架标题(see Frame Titles)、标题栏(see 窗口标题栏)与标签栏(see 窗口标签栏)。
模式行构造可以简单到只是一段固定文本字符串,但它通常会指定如何将固定字符串与变量值组合以生成最终文本。其中许多变量本身的值也被定义为模式行构造。
以下是各类数据类型作为模式行构造时的含义:
string ¶字符串作为模式行构造时会原样显示,除非其中包含 %-constructs。这类结构代表替换其他数据;参见 模式行中的 %-constucts。
如果字符串的部分内容带有 face 属性,它们会像缓冲区中的文本一样控制显示效果。任何不带有 face 属性的字符,默认使用 mode-line 或 mode-line-inactive 外观显示(see Standard Faces in The GNU Emacs Manual)。字符串中的 help-echo 与 keymap 属性具有特殊含义。See 模式行中的属性。
symbol符号作为模式行构造时代表其变量值。symbol 的值会替代该符号本身,作为模式行构造使用。但符号 t 与 nil 会被忽略,值未定义的符号同样会被忽略。
有一个例外:如果 symbol 的值是字符串,则会直接原样显示:其中的 % 构造不会被解析。
除非 symbol 被标记为风险变量(即其 risky-local-variable 属性非 nil),否则其值中指定的所有文本属性都会被忽略。这包括该符号值中字符串的文本属性,以及其中所有 :eval 与 :propertize 形式。(这样设计是出于安全考虑:非风险变量可从文件变量自动设置,无需向用户提示。)
(string rest…)(list rest…)首元素为字符串或列表的列表,表示递归处理所有元素并将结果拼接。这是最常见的模式行构造形式。(注意:出于效率考虑,模式行中显示字符串时对文本属性有特殊处理:仅考虑字符串首字符的文本属性,并将其应用于整个字符串。若需要带有不同文本属性的字符串,必须使用专用的 :propertize 模式行构造。)
(:eval form)首元素为符号 :eval 的列表,表示对 form 求值,并将结果作为字符串显示。请确保该求值过程不会加载任何文件,也不会调用 posn-at-point 或 window-in-direction 这类自身会触发模式行求值的函数,否则可能导致无限递归。
(:propertize elt props…)首元素为符号 :propertize 的列表,表示先递归处理模式行构造 elt,再将 props 指定的文本属性添加到结果中。参数 props 应由零个或多个 text-property 与 value 成对组成。如果 elt 本身或生成的字符串带有文本属性,该字符串的所有字符应具有相同属性,否则部分属性可能被 :propertize 移除。
(symbol then else)首元素为非关键字符号的列表表示条件判断。其含义取决于 symbol 的值。若 symbol 的值非 nil,则第二个元素 then 会被递归处理为模式行构造;否则第三个元素 else 会被递归处理。else 可以省略;此时若 symbol 的值为 nil 或未定义,该模式行构造不显示任何内容。
(width rest…)首元素为整数的列表,用于指定 rest 结果的截断或填充。剩余元素 rest 会被递归处理为模式行构造并拼接。当 width 为正数时,若结果宽度不足 width,则在右侧填充空格。当 width 为负数时,若结果宽度超过 −width,则从右侧截断至 −width 列。
例如,显示缓冲区内容位于窗口顶部上方百分比的常用写法是类似这样的列表:(-3 "%p")。