29.8 删除窗口

删除(Deleting) 窗口会将其从框架的窗口树中移除。如果该窗口是活动窗口,它会从屏幕上消失;如果是内部窗口,其子窗口也会被一并删除。

即便窗口被删除,它仍会作为 Lisp 对象存在,直到没有任何引用指向它为止。通过恢复已保存的窗口配置(see 窗口配置),可以撤销窗口删除操作。

Command: delete-window &optional window

该函数将 window 从显示中移除,并返回 nil。若 window 被省略或为 nil,则默认为当前选中的窗口。

如果删除该窗口后,窗口树中不再有任何窗口(例如,它是框架中唯一的活动窗口),或者 window 所属框架上剩余的所有窗口均为侧边窗口(see 侧边窗口),函数会抛出错误。若 window 是原子窗口(see 原子窗口)的一部分,该函数会尝试删除该原子窗口的根窗口。

默认情况下,window 占用的空间会分配给其相邻的同级窗口(如果存在)。但如果变量 window-combination-resize 为非 nil,该空间会按比例分配给同一窗口组合中剩余的所有窗口。See 重组窗口

只要变量 ignore-window-parametersnil,该函数的行为可能会被 window 的窗口参数改变。若 delete-window 窗口参数的值为 t,该函数会忽略所有其他窗口参数;否则,若 delete-window 窗口参数的值是一个函数,该函数会以 window 为参数被调用,替代 delete-window 原本的行为。See 窗口参数

delete-window 删除其所属框架的选中窗口时,必须将另一个窗口设为该框架新的选中窗口。以下选项可配置选中窗口的选择规则:

User Option: delete-window-choose-selected

该选项用于指定 delete-window 删除原选中窗口后,框架的新选中窗口应如何选择。可选值包括:

  • mru (默认值)选择该框架上最近使用过的窗口。
  • pos 选择包含原选中窗口光标位置对应框架坐标的窗口。
  • nil 选择该框架上的第一个窗口(即 frame-first-window 函数返回的窗口)。

仅当该框架上所有其他窗口的 no-other-window 参数均为非 nil 时,才会选择 no-other-window 参数为非 nil 的窗口。

Command: delete-other-windows &optional window

该函数会让 window 占满其所属框架,并按需删除其他窗口。若 window 被省略或为 nil,则默认为当前选中的窗口。如果 window 是侧边窗口(see 侧边窗口),函数会抛出错误。若 window 是原子窗口(see 原子窗口)的一部分,该函数会尝试让该原子窗口的根窗口占满其所属框架。函数返回值为 nil

只要变量 ignore-window-parametersnil,该函数的行为可能会被 window 的窗口参数改变。若 delete-other-windows 窗口参数的值为 t,该函数会忽略所有其他窗口参数;否则,若 delete-other-windows 窗口参数的值是一个函数,该函数会以 window 为参数被调用,替代 delete-other-windows 原本的行为。See 窗口参数

此外,若 ignore-window-parametersnil,该函数不会删除任何 no-delete-other-windows 参数为非 nil 的窗口。

Command: delete-windows-on &optional buffer-or-name frame

该函数会对所有显示 buffer-or-name 的窗口调用 delete-window,从而删除这些窗口。buffer-or-name 可以是一个缓冲区,也可以是缓冲区名称;若被省略或为 nil,则默认为当前缓冲区。如果没有窗口显示指定的缓冲区,该函数不执行任何操作;若指定的缓冲区是迷你缓冲区,函数会抛出错误。

如果存在一个专用于显示该缓冲区的窗口,且该窗口是其所属框架上的唯一窗口,同时该框架并非终端上的唯一框架,那么该函数还会删除该框架。

可选参数 frame 指定要操作的框架范围:

  • nil 表示操作所有框架。
  • t 表示操作当前选中的框架。
  • visible 表示操作所有可见的框架。
  • 0 表示操作所有可见或已图标化的框架。
  • 一个框架对象 表示仅操作该框架。

注意,该参数的含义与其他遍历所有活动窗口的函数(see 窗口循环顺序)不同。具体来说,此处 tnil 的含义与那些函数中完全相反。