每个窗口 唯一 归属于一个框架(see 框架)。对于归属于某个特定框架的所有窗口,我们有时也说这些窗口被该框架拥有(owned),或直接称它们位于该框架上。
该函数返回指定窗口 window 所属的框架。若 window 被省略或为 nil,则默认使用当前选中窗口(see 选中窗口)。
该函数返回由指定框架 frame 拥有的所有活动窗口构成的列表。若 frame 被省略或为 nil,则默认使用当前选中框架(see 输入焦点)。
可选参数 minibuffer 用于指定是否将迷你缓冲区窗口(see Minibuffer 窗口)加入列表。若为 t,则包含迷你缓冲区窗口;若为 nil 或被省略,则仅在迷你缓冲区窗口处于激活状态时才包含;若既非 nil 也非 t,则永远不包含。
可选参数 window 若非 nil,必须是指定框架上的一个活动窗口,此时该窗口会作为返回列表的第一个元素。若 window 被省略或为 nil,则框架内的选中窗口(see 选中窗口)作为首元素。
同一框架上的窗口会组织成一棵窗口树,其叶节点为活动窗口。窗口树的内部节点并非活动窗口,它们仅用于组织活动窗口之间的层级关系。窗口树的根节点称为根窗口,它可以是活动窗口,也可以是内部窗口。若根窗口为活动窗口,则该框架除迷你缓冲区窗口外仅有一个窗口,或者该框架是仅含迷你缓冲区的框架,参见 see 框架布局。
若迷你缓冲区窗口(see Minibuffer 窗口)并非框架上唯一的窗口,则它没有父窗口,因此严格来说不属于框架的窗口树。尽管如此,它仍是框架根窗口的兄弟窗口,可以通过 window-next-sibling 从根窗口访问到,见下文。此外,本节末尾介绍的 window-tree 函数会将迷你缓冲区窗口与实际窗口树一同列出。
该函数返回 frame-or-window 对应的根窗口。参数 frame-or-window 可以是窗口或框架;若被省略或为 nil,则默认使用当前选中框架。若 frame-or-window 是一个窗口,则返回值为该窗口所属框架的根窗口。
当一个活动窗口被拆分(see 拆分窗口)时,原本一个窗口的位置会出现两个活动窗口。其中一个仍使用原窗口对应的 Lisp 对象,另一个则由新建的 Lisp 窗口对象表示。这两个活动窗口均作为同一个内部窗口的子窗口(child windows),成为窗口树的叶节点。如有必要,Emacs 会自动创建这个内部窗口(也称为父窗口(parent window)),并将其放置在窗口树的合适位置。拥有同一父窗口的多个窗口互为兄弟窗口(siblings)。
该函数返回窗口 window 的父窗口。若 window 被省略或为 nil,则默认使用当前选中窗口。若该窗口无父窗口(即为迷你缓冲区窗口或所在框架的根窗口),则返回 nil。
父窗口至少拥有两个子窗口。若因删除窗口(see 删除窗口)导致子窗口数量仅剩一个,Emacs 会自动删除该父窗口,并让其唯一剩余的子窗口在窗口树中接替它的位置。
子窗口可以是活动窗口,也可以是内部窗口(内部窗口又可拥有自己的子窗口)。因此,每个内部窗口都可视为占据一块矩形屏幕区域(screen area)—该区域是其所有最终后代活动窗口所占据区域的并集。
每个内部窗口的直接子窗口,其屏幕区域要么垂直排列,要么水平排列(不会混用)。若子窗口上下排布,则构成一个垂直组合(vertical combination);若左右并排排布,则构成一个水平组合(horizontal combination)。如下例所示:
______________________________________
| ______ ____________________________ |
|| || __________________________ ||
|| ||| |||
|| ||| |||
|| ||| |||
|| |||____________W4____________|||
|| || __________________________ ||
|| ||| |||
|| ||| |||
|| |||____________W5____________|||
||__W2__||_____________W3_____________ |
|__________________W1__________________|
该框架的根窗口是内部窗口 W1,其子窗口构成水平组合,包含活动窗口 W2 和内部窗口 W3。W3 的子窗口构成垂直组合,包含活动窗口 W4 和 W5。因此,这棵窗口树中的活动窗口为 W2、W4 和 W5。
下列函数可用于获取内部窗口的子窗口及子窗口的兄弟窗口。它们的 window 参数均默认使用当前选中窗口(see 选中窗口)。
若 window 是子窗口为垂直组合的内部窗口,该函数返回其最上方的子窗口;其他类型窗口则返回 nil。
若 window 是子窗口为水平组合的内部窗口,该函数返回其最左侧的子窗口;其他类型窗口则返回 nil。
该函数返回内部窗口 window 的第一个子窗口——垂直组合返回最上方子窗口,水平组合返回最左侧子窗口。若 window 为活动窗口,则返回 nil。
当且仅当 window 属于垂直组合时,该函数返回非 nil 值。
若可选参数 horizontal 为非 nil,则当且仅当 window 属于水平组合时返回非 nil。
该函数返回指定窗口 window 的下一个兄弟窗口。若该窗口是父窗口的最后一个子窗口,则返回 nil。
该函数返回指定窗口 window 的上一个兄弟窗口。若该窗口是父窗口的第一个子窗口,则返回 nil。
不要将 window-next-sibling 和 window-prev-sibling 与 next-window 和 previous-window 混淆,后两者返回窗口循环顺序中的下一个和上一个窗口(see 窗口循环顺序)。
下列函数可用于在框架中定位窗口:
该函数返回 frame-or-window 指定框架左上角的活动窗口。参数 frame-or-window 必须为窗口或活动框架,默认为当前选中框架。若指定的是窗口,则返回该窗口所在框架的第一个窗口。以上述典型示例框架被选中为例,(frame-first-window) 返回 W2。
若窗口 window 位于其所属框架的 side 一侧,则返回 t。参数 window 必须为有效窗口,默认为当前选中窗口。参数 side 可以是符号 left、top、right 或 bottom 中的任意一个;默认值 nil 按 bottom 处理。
注意该函数会忽略迷你缓冲区窗口(see Minibuffer 窗口)。因此当 side 为 bottom 时,即使迷你缓冲区窗口正好出现在该窗口下方,也可能返回 t。
该函数从窗口 window 中 window-point 所在位置出发,返回 direction 方向上最近的活动窗口。参数 direction 必须为 above、below、left 或 right 之一。可选参数 window 必须为活动窗口,默认为当前选中窗口。
该函数不会返回 no-other-window 参数为非 nil 的窗口(see 窗口参数)。若最近窗口的该参数为非 nil,函数会尝试在同一方向寻找另一个该参数为 nil 的窗口。若可选参数 ignore 为非 nil,则即使窗口的 no-other-window 为非 nil 也可能被返回。
若可选参数 sign 为负数,表示以窗口 window 的右边缘或下边缘为参考位置,而非 window-point;若为正数,则以左边缘或上边缘为参考位置。
若可选参数 wrap 为非 nil,表示允许按方向环绕框架边界。例如,若窗口位于框架顶部且方向为 above,函数通常会返回框架的迷你缓冲区窗口(若激活),否则返回框架底部的窗口。
若可选参数 minibuf 为 t,则即使迷你缓冲区窗口未激活也可能被返回;若为 nil,则仅在其当前激活时返回;若既非 nil 也非 t,则永远不返回迷你缓冲区窗口。但如果 wrap 为非 nil,则始终按 minibuf 为 nil 处理。
若未找到合适窗口,函数返回 nil。
不要使用该函数检查某方向上是否没有窗口,使用上文介绍的 window-at-side-p 效率会高得多。
下列函数用于获取一个框架的完整窗口树:
该函数返回一个列表,表示框架 frame 的窗口树。若 frame 被省略或为 nil,则默认使用当前选中框架。
返回值为形如 (root mini) 的列表,其中 root 表示框架根窗口构成的窗口树,mini 为该框架的迷你缓冲区窗口。
若根窗口为活动窗口,则 root 即为该窗口本身;否则 root 为列表 (dir edges w1 w2 ...),其中 dir 为 nil 表示水平组合,为 t 表示垂直组合;edges 给出该组合的尺寸与位置;后续元素为子窗口。每个子窗口可以是窗口对象(活动窗口)或同样格式的列表(内部窗口)。edges 是列表 (left top right bottom),格式与 window-edges 的返回值类似(see 坐标与窗口)。