窗口(window)是屏幕上可用于显示缓冲区的区域(see 缓冲区)。 窗口归属于框架(see 框架)。 每个框架至少包含一个窗口;用户可将框架划分为多个不重叠的窗口, 同时查看多个缓冲区。Lisp 程序可出于多种目的使用多窗口。 例如在 Rmail 中,你可以在一个窗口查看邮件标题列表, 在另一个窗口查看选中邮件的内容。
Emacs 所用的“窗口”一词,含义与图形桌面环境及窗口系统(如 X Window System)不同。 在 X 下运行 Emacs 时,Emacs 进程拥有的每个图形化 X 窗口对应一个 Emacs 框架。 在文本终端运行 Emacs 时,每个 Emacs 框架会占满整个终端屏幕。 无论哪种情况,框架都可包含一个或多个 Emacs 窗口。 为避免歧义,当指代对应 Emacs 框架的窗口系统窗口时, 我们使用术语 window-system window(窗口系统窗口)。
与 X 窗口不同,Emacs 窗口是 平铺式(tiled)的, 在所属框架区域内绝不会重叠。 创建、调整大小或删除窗口时,空间变化会从同一框架的其他窗口获取或返还, 从而保持框架总区域不变。
在 Emacs Lisp 中,窗口由一种专用 Lisp 对象类型表示(see 窗口类型)。
若 object 为窗口(无论是否显示缓冲区),此函数返回 t,
否则返回 nil。
活动窗口(live window)是指在框架中实际显示缓冲区的窗口。
若 object 为活动窗口,此函数返回 t,否则返回 nil。
活动窗口即正在显示缓冲区的窗口。
每个框架中的窗口构成一棵 窗口树(window tree)。 See 窗口与框架。 窗口树的叶节点是活动窗口,即实际显示缓冲区的窗口; 窗口树的内部节点为 内部窗口(internal windows),不属于活动窗口。
有效窗口(valid window)是指活动窗口或内部窗口。 有效窗口可以被 删除(deleted),即从所属框架移除(see 删除窗口); 删除后窗口不再有效,但表示该窗口的 Lisp 对象仍可能被其他 Lisp 对象引用。 通过恢复保存的窗口配置(see 窗口配置), 可使已删除窗口重新变为有效。
可使用 window-valid-p 区分有效窗口与已删除窗口。
若 object 为活动窗口或窗口树中的内部窗口,此函数返回 t,
否则返回 nil(包括已删除窗口)。
下图为活动窗口的结构示意:
____________________________________________
|________________ Tab Line _______________|RD| ^
|______________ Header Line ______________| | |
^ |LS|LM|LF| |RF|RM|RS| | |
| | | | | | | | | | |
Window | | | | | | | | | Window
Body | | | | | Window Body | | | | | Total
Height | | | | | | | | | Height
| | | | |<- Window Body Width ->| | | | | |
v |__|__|__|_______________________|__|__|__| | |
|_________ Horizontal Scroll Bar _________| | |
|_______________ Mode Line _______________|__| |
|_____________ Bottom Divider _______________| v
<---------- Window Total Width ------------>
窗口中心是 主体(body),用于显示缓冲区文本。 主体周围可包含一系列可选区域,称为 窗口装饰(window decorations)。 左右两侧从内到外依次为:左 fringe 与右 fringe(记为 LF、RF,see 侧边栏); 左边距与右边距(示意图中记为 LM、RM,see 在边距中显示); 垂直滚动条(同一时刻仅左侧或右侧存在,记为 LS、RS,see 滚动条); 以及右侧分隔线(记为 RD,see 窗口分隔线)。 这些统称为窗口的 左右装饰(left and right decorations)。
窗口顶部为标签栏和标题栏(see 窗口标题栏)。 窗口的 文本区域(text area)包含标题栏与标签栏(若存在)。 窗口底部为水平滚动条(see 滚动条)、 模式行(see 模式行格式)以及底部分隔线(see 窗口分隔线)。 这些统称为窗口的 上下装饰(top and bottom decorations)。
示意图中省略了两个特殊区域:
以上两种情况产生的视觉元素均视为窗口主体的一部分, 尽管其屏幕空间不能用于显示缓冲区文本。
另外需注意,由 display-line-numbers-mode 显示的行号(及其周围空白)
(see Display Custom in The GNU Emacs Manual)
也不属于装饰,同样属于窗口主体。
内部窗口既不显示文本,也没有任何装饰, 因此 “主体(body)” 概念对其不适用。 事实上,大多数操作窗口主体的函数用于内部窗口时都会报错。
默认情况下,Emacs 框架包含一个专用活动窗口, 用于显示消息并接收用户输入——即 迷你缓冲区窗口(minibuffer window)(see Minibuffer 窗口)。 由于迷你缓冲区窗口用于显示文本,它拥有主体, 但没有标签栏、标题栏或任何边距。 此外,用于在提示框框架中显示提示信息的 提示窗口(tooltip window)(see 工具提示) 同样拥有主体,但不包含任何装饰。