29.6 保留窗口尺寸

窗口可以通过上一节中的某个函数显式调整大小,也会被隐式调整大小,例如,调整相邻窗口大小时、拆分或删除窗口时(see 拆分窗口,see 删除窗口),或是调整窗口所属框架大小的时候(see 框架尺寸)。

当同一个框架上存在一个或多个其他可调整大小的窗口时,可以避免对特定窗口进行隐式大小调整。为此,需要告知 Emacs 对该窗口执行 保留(preserve) 尺寸操作。实现该需求有两种基本方式。

Variable: window-size-fixed

如果这个缓冲区局部变量的值为非 nil,则显示该缓冲区的任意窗口的尺寸通常无法被更改。若无其他选择,删除窗口或更改框架尺寸仍可能导致该窗口尺寸发生变化。

若值为 height,则仅固定窗口的高度;若值为 width,则仅固定窗口的宽度。其他任意非 nil 值会同时固定宽度和高度。

该变量为 nil 并不一定意味着显示该缓冲区的所有窗口都能按预期方向调整大小。如需判断这一点,请使用函数 window-resizable。 See 调整窗口大小

通常 window-size-fixed 的约束效果过于严格,因为它同时会禁止对受影响窗口进行任何显式调整大小或拆分操作。这种情况甚至可能在窗口被隐式调整大小之后依然生效,例如删除相邻窗口或调整窗口所属框架时。下面这个函数会尽可能不禁止对这类窗口执行显式调整大小操作:

Function: window-preserve-size &optional window horizontal preserve

该函数为后续的尺寸调整操作标记(或取消标记)窗口 window 的高度为保留状态。window 必须为活动窗口,默认值为当前选中窗口。如果可选参数 horizontal 为非 nil,则标记(或取消标记)window 的宽度为保留状态。

如果可选参数 preservet,表示保留 window 主体当前的高度/宽度。仅当 Emacs 别无选择时,该窗口的高度/宽度才会发生变化。调整被此函数标记为保留高度/宽度的窗口时,永远不会抛出错误。

如果 preservenil,表示停止保留 window 的高度/宽度,解除此前调用该函数对该窗口施加的相应约束。对 window 调用 enlarge-windowshrink-windowfit-window-to-buffer 也可能移除相应约束。

window-preserve-size 当前由以下函数调用:

fit-window-to-buffer

如果该函数的可选参数 preserve-size(see 调整窗口大小)为非 nil,则该函数设定的尺寸会被保留。

display-buffer

如果该函数的关联列表参数 alist(see 为显示缓冲区选择窗口)包含 preserve-size 条目,则该函数创建的窗口尺寸会被保留。

window-preserve-size 会设置一个名为 window-preserved-size 的窗口参数(see 窗口参数),窗口尺寸调整函数会参考该参数。当该窗口显示的缓冲区与调用 window-preserve-size 时不同,或其尺寸在此之后已发生变化,该参数不会阻止调整窗口大小。

可以使用下面的函数检查特定窗口的高度是否被保留:

Function: window-preserved-size &optional window horizontal

该函数以像素为单位返回窗口 window 被保留的高度。window 必须为活动窗口,默认值为当前选中窗口。如果可选参数 horizontal 为非 nil,则返回该窗口被保留的宽度。若 window 的尺寸未被保留,函数返回 nil