窗口可以在顶部显示一条标题栏(header line),就像它可以在底部显示模式行一样。标题栏的工作机制与模式行完全相同,只是它由
header-line-format 控制:
该变量对每个缓冲区局部有效,用于指定显示该缓冲区的窗口如何展示标题栏。其值的格式与 mode-line-format 一致
(see 模式行的数据结构)。
该变量通常为 nil,因此普通缓冲区不会显示标题栏。
如果在缓冲区中开启了 display-line-numbers-mode
(see display-line-numbers-mode in The GNU
Emacs Manual),缓冲区文本在显示时会根据行号所需的屏幕宽度自动缩进。
与之不同,标题栏文本不会自动缩进,因为标题栏从不显示行号,且标题栏内容也不一定与下方的缓冲区文本直接相关。
如果 Lisp 程序需要让标题栏文本与缓冲区文本对齐(例如缓冲区以列状数据展示,如同
tabulated-list-mode,see 表格列表模式),则应开启次要模式
header-line-indent-mode。
该缓冲区局部次要模式会跟踪屏幕上行号显示宽度的变化(行号宽度可能随窗口内显示的行号范围而改变),
并允许 Lisp 程序在行号宽度变化时始终保持标题栏文本与缓冲区文本对齐。
这类 Lisp 程序应在缓冲区中开启此模式,并在 header-line-format 中使用变量
header-line-indent 与 header-line-indent-width,以确保标题栏始终与文本缩进匹配。
该变量的值为一个空白字符串,在窗口显示的缓冲区中开启 header-line-indent-mode 时,
其宽度会始终与当前行号显示宽度保持一致。空格数量基于一个假设计算:标题栏文本所使用的字体(包括字号)
与框架默认字体相同;若该假设不成立,则应使用下文介绍的 header-line-indent-width。
该变量适用于简单场景:只需将标题栏整体缩进,使其与下方缓冲区文本对齐,只需将此变量值添加到实际标题栏文本前即可。
例如,如下 header-line-format 定义:
(setq header-line-format
`("" header-line-indent ,my-header-line))
其中 my-header-line 是生成标题栏实际内容的格式字符串,可确保标题栏文本始终与下方缓冲区文本保持相同缩进。
在窗口显示的缓冲区中开启 header-line-indent-mode 时,该变量的值会持续更新,
以框架标准字符宽度为单位,表示当前行号显示所占用的宽度。当 header-line-indent
灵活性不足时,可使用该变量实现标题栏文本与缓冲区文本的对齐。
例如,若标题栏使用的字体度量与默认字体不同,你的 Lisp 程序可将此变量值与
frame-char-width 返回值相乘(see Frame Font),计算出行号显示的像素宽度,
再在 header-line-format 的相关部分使用 :align-to 显示属性规范(see Specified Spaces)
以像素为单位对齐标题栏文本。
该函数返回 window 标题栏的像素高度。window 必须为活动窗口,默认为选中窗口。
高度仅一行的窗口永远不会显示标题栏。高度为两行的窗口无法同时显示模式行与标题栏; 若存在模式行,则不会显示标题栏。