29.21 文本滚动

文本滚动(Textual scrolling) 指在窗口内将文本向上或向下移动。 其实现方式是修改窗口的显示起始位置。 它也可能会改变 window-point 的值,以保证点(point)保持在屏幕可见范围内(see 窗口(window)与点(Point))。

基础的文本滚动函数是 scroll-up(向前滚动)和 scroll-down(向后滚动)。 在这些函数名称中,“上”和“下”是相对于窗口而言的缓冲区文本移动方向。 你可以想象文本写在一长条纸上,滚动命令控制这张纸上下移动。 因此,如果你正查看缓冲区中部,并反复调用 scroll-down,最终会看到缓冲区开头。

遗憾的是,这有时会造成混淆,因为有些人习惯用相反的理解方式: 他们想象窗口在静止的文本上移动,因此“向下”命令会带你到缓冲区末尾。 这种习惯与现代键盘上名为 PageDown 的按键功能是一致的。

如果当前缓冲区并非选中窗口所显示的缓冲区,文本滚动函数(scroll-other-window 除外)会产生不可预测的结果。See 当前缓冲区

如果窗口内某一行的高度大于窗口本身高度(例如存在大图片),滚动函数会调整窗口的垂直滚动位置,以滚动显示这部分可见的行。 Lisp 调用者可以通过将变量 auto-window-vscroll 绑定为 nil 来禁用该功能(see 垂直分数滚动)。

Command: scroll-up &optional count

该函数在选中窗口中向前滚动 count 行文本。

count 为负数,则改为向后滚动。 若 countnil(或省略),滚动距离为窗口主体高度减去 next-screen-context-lines 行。

若选中窗口已无法继续滚动,该函数会抛出错误。 否则返回 nil

Command: scroll-down &optional count

该函数在选中窗口中向后滚动 count 行文本。

count 为负数,则改为向前滚动。 在其他方面,其行为与 scroll-up 一致。

Command: scroll-up-command &optional count

行为与 scroll-up 类似,区别在于:若选中窗口已无法继续滚动,且变量 scroll-error-top-bottom 的值为 t, 则会尝试将点移动到缓冲区末尾。 若点已在末尾,则抛出错误。

Command: scroll-down-command &optional count

行为与 scroll-down 类似,区别在于:若选中窗口已无法继续滚动,且变量 scroll-error-top-bottom 的值为 t, 则会尝试将点移动到缓冲区开头。 若点已在开头,则抛出错误。

Command: scroll-other-window &optional count

该函数将其他窗口中的文本向上滚动 count 行。 count 为负数或 nil 时的处理方式与 scroll-up 相同。

你可以通过将变量 other-window-scroll-buffer 设置为某个缓冲区,来指定要滚动哪个缓冲区。 若该缓冲区尚未显示,scroll-other-window 会将其在某个窗口中显示。

当选中窗口为小缓冲区(minibuffer)时,下一个窗口通常是其正上方最左侧的窗口。 你可以在选中小缓冲区时,通过设置变量 minibuffer-scroll-window 指定另一个要滚动的窗口。 该变量在选中其他窗口时无效。 当其非 nil 且小缓冲区被选中时,优先级高于 other-window-scroll-buffer。See Definition of minibuffer-scroll-window

Command: scroll-other-window-down &optional count

该函数将其他窗口中的文本向下滚动 count 行。 count 为负数或 nil 时的处理方式与 scroll-down 相同。 在其他方面,其行为与 scroll-other-window 一致。

Variable: other-window-scroll-buffer

若该变量非 nil,它会告知 scroll-other-window 滚动哪个缓冲区所在的窗口。

User Option: scroll-margin

该选项用于设置滚动边距大小,即点与窗口顶部或底部之间保留的最小行数。 每当点进入到距窗口顶部或底部此行数范围内时,重绘会自动滚动文本(尽可能), 将点移出边距区域,更靠近窗口中心。

User Option: maximum-scroll-margin

该变量将 scroll-margin 的实际生效值限制为当前窗口行高的一个比例。 例如,若当前窗口有 20 行,且 maximum-scroll-margin 为 0.1, 则无论 scroll-margin 设置多大,滚动边距都不会超过 2 行。

maximum-scroll-margin 自身的最大值为 0.5, 该值可让边距足够大,使光标始终保持在窗口中间行(若窗口行数为偶数,则为中间两行)。 若设置为更大的值(或 0.0 到 0.5 之外的任意值),则会使用默认值 0.25。

User Option: scroll-conservatively

该变量控制点移出屏幕(或进入滚动边距)时自动滚动的方式。 若值为正整数 n,则重绘最多向任意方向滚动 n 行,使点回到正常可见区域。 这种行为称为 保守滚动(conservative scrolling)。 否则,滚动按常规方式进行,由 scroll-up-aggressivelyscroll-down-aggressively 等其他变量控制。

默认值为 0,表示不会启用保守滚动。

User Option: scroll-down-aggressively

该变量的值应为 nil 或 0 到 1 之间的小数 f。 若为小数,则指定向下滚动时点在屏幕上的位置。 更精确地说,当点位于窗口起始位置上方而导致窗口向下滚动时, 新的起始位置会让点出现在距窗口顶部 f 比例高度的位置。 f 越大,滚动越激进。

值为 nil 等价于 0.5,效果是将点居中。 该变量无论以何种方式设置,都会自动变为缓冲区局部变量。

User Option: scroll-up-aggressively

与上一变量类似,用于控制向上滚动。 值 f 指定点距离窗口底部的位置; 因此与 scroll-down-aggressively 一样,值越大滚动越激进。

User Option: scroll-step

该变量是 scroll-conservatively 的旧版替代方案。 区别在于:若值为 n,则只允许精确滚动 n 行,不允许更少行数。 该功能与 scroll-margin 不兼容。 默认值为 0。

User Option: scroll-preserve-screen-position

若该选项为 t,则每当滚动命令使点移出窗口时, Emacs 会尝试调整点,使光标保持在窗口中原有的垂直位置,而不是移到窗口边缘。

若值为非 nil 且非 t,则即使滚动命令未让点移出窗口, Emacs 也会调整点,使光标保持相同垂直位置。

该选项会影响所有带有非 nilscroll-command 符号属性的滚动命令。

User Option: next-screen-context-lines

该变量的值为整屏滚动时保留的连续显示行数。 例如,scroll-up 在参数为 nil 时滚动,会让窗口底部的这几行显示在新窗口顶部。 默认值为 2

User Option: scroll-error-top-bottom

若该选项为 nil(默认),则 scroll-up-commandscroll-down-command 在无法继续滚动时直接抛出错误。

若值为 t,这些命令会改为将点移动到缓冲区开头或末尾(取决于滚动方向); 只有当点已在该位置时才抛出错误。

Command: recenter &optional count redisplay

该函数滚动选中窗口中的文本,使点显示在窗口内指定的垂直位置。 它不会改变点相对于文本的位置。

count 为非负数,会将含点的行放在距窗口顶部 count 行的位置。 若 count 为负数,则从窗口底部向上计数,-1 表示窗口最后一个可用行。

countnil(或非空列表),recenter 会将含点的行放在窗口中央。 若 countnilredisplaynil, 该函数可能会根据 recenter-redisplay 的值重绘框架。 因此,省略第二个参数可抵消 recenter-redisplay 非空时的效果。 交互式调用时会为 redisplay 传入非 nil

recenter 被交互式调用时,count 为原始前缀参数。 因此,输入 C-u 作为前缀会将 count 设为非空列表, 而输入 C-u 4 会将 count 设为 4,使当前行位于距顶部 4 行的位置。

参数为 0 时,recenter 会将当前行放在窗口顶部。 命令 recenter-top-bottom 提供了更便捷的实现方式。

Function: recenter-window-group &optional count

该函数与 recenter 类似,区别在于:若选中窗口属于某个窗口组(see Window Group), recenter-window-group 会对整个窗口组进行滚动。 当缓冲区局部变量 recenter-window-group-function 被设为函数时,该条件生效。 此时 recenter-window-group 会以 count 为参数调用该函数并返回结果。 参数 count 的含义与 recenter 中一致,但作用于整个窗口组。

User Option: recenter-redisplay

若该变量非 nil,则在 countnilredisplaynil 时调用 recenter 会重绘框架。 默认值为 tty,表示仅当框架为终端框架时才重绘。

Command: recenter-top-bottom &optional count

该命令是 C-l 的默认绑定,行为与 recenter 类似,仅在无参数调用时不同。 此时,连续调用会按照变量 recenter-positions 定义的循环顺序放置点。

User Option: recenter-positions

该变量控制无参数调用 recenter-top-bottom 时的行为。 默认值为 (middle top bottom), 表示连续无参数调用会在将点置于窗口中央、顶部、底部之间循环切换。