29.15 专用窗口

将某些窗口标记为对其缓冲区专用(dedicated),可以让显示缓冲区的函数不再使用这些窗口。display-buffer(see 为显示缓冲区选择窗口)绝不会使用专用窗口显示其他缓冲区。当 dedicated 参数为非 nil 时,get-lru-windowget-largest-window(see 窗口循环顺序)不会将专用窗口视为候选窗口。set-window-buffer(see 缓冲区与窗口)对专用窗口的行为略有不同,详见下文。

当操作的窗口是专用窗口时,用于从窗口移除缓冲区或从框架移除窗口的函数可以表现出特殊行为。我们区分四种基本情况:(1) 该窗口不是其框架上的唯一窗口;(2) 该窗口是其框架上的唯一窗口,但同一终端上还有其他框架;(3) 该窗口是同一终端上唯一框架中的唯一窗口;(4) 专用标记的值为 side(see 在侧边窗口中显示缓冲区)。

具体来说,delete-windows-on(see 删除窗口)处理情况 (2) 时会删除对应的框架,处理情况 (3) 和 (4) 时会在该框架的唯一窗口中显示另一个缓冲区。缓冲区被关闭时调用的 replace-buffer-in-windows(see 缓冲区与窗口)在情况 (1) 下会删除窗口,其他情况行为与 delete-windows-on 一致。

bury-buffer(see 缓冲区列表)作用于选中窗口(显示即将被隐藏的缓冲区)时,处理情况 (2) 会调用 frame-auto-hide-function(see 退出窗口)处理该选中框架。其余两种情况的处理方式与 replace-buffer-in-windows 相同。

Function: window-dedicated-p &optional window

如果 window 对其缓冲区专用,该函数返回非 nil,否则返回 nil。更精确地说,返回值是上一次为 window 调用 set-window-dedicated-p 时设置的值;如果从未以该窗口为参数调用过,则为 nilwindow 默认为选中窗口。

Function: set-window-dedicated-p window flag

如果 flag 为非 nil,该函数将 window 标记为对其缓冲区专用,否则标记为非专用。交互时可以使用 C-x w dtoggle-window-dedicated)命令实现相同功能。

作为特殊情况,如果 flagtwindow 变为对其缓冲区强(strongly)专用。当窗口被强专用且未显示目标缓冲区时,set-window-buffer 会报错。其他函数对 t 与其他非 nil 值不做区分。

你也可以通过在动作关联列表中提供合适的 dedicated 条目,让 display-buffer 将创建的窗口标记为对其缓冲区专用(see 缓冲区显示动作关联列表)。