窗口可以通过上一节中的某个函数显式调整大小,也会被隐式调整大小,例如,调整相邻窗口大小时、拆分或删除窗口时(see 拆分窗口,see 删除窗口),或是调整窗口所属框架大小的时候(see 框架尺寸)。
当同一个框架上存在一个或多个其他可调整大小的窗口时,可以避免对特定窗口进行隐式大小调整。为此,需要告知 Emacs 对该窗口执行 保留(preserve) 尺寸操作。实现该需求有两种基本方式。
如果这个缓冲区局部变量的值为非 nil,则显示该缓冲区的任意窗口的尺寸通常无法被更改。若无其他选择,删除窗口或更改框架尺寸仍可能导致该窗口尺寸发生变化。
若值为 height,则仅固定窗口的高度;若值为 width,则仅固定窗口的宽度。其他任意非 nil 值会同时固定宽度和高度。
该变量为 nil 并不一定意味着显示该缓冲区的所有窗口都能按预期方向调整大小。如需判断这一点,请使用函数 window-resizable。
See 调整窗口大小。
通常 window-size-fixed 的约束效果过于严格,因为它同时会禁止对受影响窗口进行任何显式调整大小或拆分操作。这种情况甚至可能在窗口被隐式调整大小之后依然生效,例如删除相邻窗口或调整窗口所属框架时。下面这个函数会尽可能不禁止对这类窗口执行显式调整大小操作:
该函数为后续的尺寸调整操作标记(或取消标记)窗口 window 的高度为保留状态。window 必须为活动窗口,默认值为当前选中窗口。如果可选参数 horizontal 为非 nil,则标记(或取消标记)window 的宽度为保留状态。
如果可选参数 preserve 为 t,表示保留 window 主体当前的高度/宽度。仅当 Emacs 别无选择时,该窗口的高度/宽度才会发生变化。调整被此函数标记为保留高度/宽度的窗口时,永远不会抛出错误。
如果 preserve 为 nil,表示停止保留 window 的高度/宽度,解除此前调用该函数对该窗口施加的相应约束。对 window 调用 enlarge-window、shrink-window 或 fit-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 时不同,或其尺寸在此之后已发生变化,该参数不会阻止调整窗口大小。
可以使用下面的函数检查特定窗口的高度是否被保留:
该函数以像素为单位返回窗口 window 被保留的高度。window 必须为活动窗口,默认值为当前选中窗口。如果可选参数 horizontal 为非 nil,则返回该窗口被保留的宽度。若 window 的尺寸未被保留,函数返回 nil。