30.3.5 框架隐式调整大小

默认情况下,当切换菜单栏或工具栏、修改默认字体、 设置任意滚动条宽度等操作时,Emacs 会尽量保持框架文本区域的行数和列数不变。 这意味着在这些情况下,Emacs 必须请求窗口管理器调整框架窗口大小, 以适应尺寸变化。

有时,这种 implied frame resizing 框架隐式调整大小 是不希望发生的, 例如当框架已最大化或全屏时(默认会关闭此行为)。 通常,用户可以通过下面的选项禁用隐式调整:

User Option: frame-inhibit-implied-resize

如果该选项为 nil,修改框架字体、菜单栏、工具栏、内边框、 fringe 或滚动条时,可能会调整外部框架大小,以保持文本区域的行列数不变。 如果该选项为 t,则不会进行此类调整。

该选项的值也可以是一个框架参数列表。 此时,修改列表中出现的参数时,会禁止隐式调整。 当前受该选项控制的参数有:fontfont-backendinternal-border-widthmenu-bar-linestool-bar-lines

修改 scroll-bar-widthscroll-bar-heightvertical-scroll-barshorizontal-scroll-barsleft-fringeright-fringe 等框架参数时, 处理方式等同于框架只包含一个可用窗口。 例如,在一个包含多个并排窗口的框架上移除垂直滚动条时, 如果该选项为 nil,外部框架宽度会缩小一个滚动条的宽度; 如果该选项为 t 或列表包含 vertical-scroll-bars,则宽度保持不变。

默认值: Lucid、Motif 和 MS-Windows 下为 (tab-bar-lines tool-bar-lines) (表示添加/移除工具栏或标签栏不会改变外部框架高度); 包括 GTK+ 在内的其他窗口系统下为 (tab-bar-lines) (表示除 tab-bar-lines 外,修改上述其他参数都可能改变外部框架大小); 无窗口系统支持时为 t (表示外部框架大小永远不会隐式变化)。

注意,如果框架本身不够大,无法容纳上述任一参数的修改, 即使该选项非 nil,Emacs 仍可能尝试放大框架。

另请注意,当窗口管理器改变外部菜单栏或工具栏所占行数时, 通常不会请求调整框架大小。 典型场景是用户水平缩小框架,导致无法完整显示菜单或工具栏所有元素,从而触发“换行”。 主模式切换改变菜单或工具栏项目数量时也可能出现这种情况。 此类换行可能隐式改变框架文本区域的行数,且不受该选项设置影响。