29.22 垂直分数滚动

垂直分数滚动(Vertical fractional scrolling) 指将窗口内的文本按指定的行倍数或行分数向上或向下偏移。 例如,Emacs 会对图片以及高度超过窗口的屏幕行使用该功能。 每个窗口都有一个 垂直滚动位置(vertical scroll position),其值为一个非负数。 该值指定了窗口内容显示时向上提升的距离。 提升窗口内容通常会导致部分行完全或部分从顶部消失,同时部分其他行完全或部分出现在底部。 其默认值为 0。

垂直滚动位置以标准行高(即默认字体的行高)为单位进行度量。 因此,若值为 0.5,表示窗口内容会向上滚动半个标准行高; 若值为 3.3,表示窗口内容会向上滚动略多于 3 倍标准行高的距离。

垂直滚动所覆盖的行分数或行数,取决于行内包含的内容。 值为 0.5 可能会将一行高度很短的文本滚出屏幕,而值为 3.3 可能仅滚动过一行高文本或一张图片的一部分。

Function: window-vscroll &optional window pixels-p

该函数返回 window 的当前垂直滚动位置。 window 的默认值为选中窗口。 若 pixels-p 为非 nil,返回值以像素为单位,而非标准行高单位。

(window-vscroll)
     ⇒ 0
Function: set-window-vscroll window lines &optional pixels-p preserve-vscroll-p

该函数将 window 的垂直滚动位置设为 lines。 若 windownil,则使用选中窗口。 参数 lines 应为 0 或正数;若不是,则按 0 处理。

实际的垂直滚动位置必须始终对应整数个像素,因此你指定的值会被相应取整。

函数返回值为取整后的结果。

(set-window-vscroll (selected-window) 1.2)
     ⇒ 1.13

pixels-p 为非 nillines 指定的是像素数。 此时函数返回值即为 lines

通常情况下,当小窗口(mini-window)调整大小时, 若非 minibuffer-scroll-window 或选中窗口,其垂直滚动设置不会生效(see Minibuffer 窗口)。 当参数 preserve-vscroll-p 为非 nil 时,这种「冻结」行为会被禁用, 表示按常规方式设置垂直滚动。

Variable: auto-window-vscroll

若该变量为非 nilline-movescroll-upscroll-down 函数会自动修改垂直滚动位置, 以滚动显示高度超过窗口的显示行(例如存在大图片时)。