水平滚动(Horizontal scrolling) 指将窗口内的内容按指定的标准字符宽度倍数向左或向右偏移。 每个窗口都有一个 水平滚动位置(horizontal scroll position),其值为一个非负数。 该值指定了内容向左偏移的距离。 向左偏移窗口内容通常会导致部分字符完全或部分从左侧消失,同时部分其他字符完全或部分出现在右侧。 其默认值为 0。
水平滚动位置以标准字符宽度(即默认字体中空格的宽度)为单位进行度量。 因此,若值为 5,表示窗口内容会向左滚动 5 倍标准字符宽度的距离。 实际从左侧消失的字符数量取决于字符宽度,且各行可能不同。
由于我们阅读时先逐行横向阅读,再纵向逐行向下,因此水平滚动的效果与文本滚动或垂直滚动不同。 文本滚动涉及选择要显示的文本部分,垂直滚动则是连续移动窗口内容; 而水平滚动会导致 每一行 的部分内容移出屏幕。
通常情况下,水平滚动未生效,此时最左侧列与窗口左边缘对齐。 在该状态下,向右滚动无实际意义(因为左边缘左侧无可显示的内容),因此不被允许。 向左滚动是允许的:它会将文本的前几列滚出窗口边缘,并显示右侧此前被截断的更多列。 一旦窗口的向左水平滚动值非零,你可以将其向右滚动,但最多只能将净水平滚动值减至 0。 向左滚动的距离无上限,但最终所有文本都会从左边缘移出屏幕。
若设置了 auto-hscroll-mode,重绘会根据需要自动调整窗口的水平滚动,以确保点始终可见。
不过你仍可显式设置水平滚动值。
你指定的值会作为自动滚动的下限,即自动滚动不会将窗口滚动到小于该值的列位置。
auto-hscroll-mode 的默认值为 t;
将其设为 current-line 会激活自动水平滚动的变体模式:
仅对显示光标的行进行水平滚动以保证点可见,窗口其余部分则保持不滚动,
或保持在 scroll-left 和 scroll-right 设置的最小滚动量(见下文)。
该函数将选中窗口向左滚动 count 列(若 count 为负数则向右滚动)。 count 的默认值为窗口宽度减 2。
返回值为修改后生效的总向左水平滚动量—与 window-hscroll(下文)的返回值一致。
注意:基础方向为从右到左的段落(see 双向显示)中的文本会向相反方向移动:
例如,当 scroll-left 传入正数 count 时,文本会向右移动。
一旦将窗口滚动至最右侧(回到总向左滚动量为 0 的正常位置),尝试继续向右滚动将无效果。
若 set-minimum 为非 nil,新的滚动量会成为自动滚动的下限;
即自动滚动不会将窗口滚动到小于该函数返回值的列位置。
交互式调用时会为 set-minimum 传入非 nil。
该函数将选中窗口向右滚动 count 列(若 count 为负数则向左滚动)。
count 的默认值为窗口宽度减 2。
除滚动方向外,其行为与 scroll-left 完全一致。
该函数返回 window 的总向左水平滚动量—即 window 中的文本向左滚动超出左边缘的列数。 (在从右到左的段落中,该值为总向右滚动量。) window 的默认值为选中窗口。
返回值永不为负。 当 window 未进行水平滚动时(通常如此),返回值为 0。
(window-hscroll)
⇒ 0
(scroll-left 5)
⇒ 5
(window-hscroll)
⇒ 5
该函数设置 window 的水平滚动量。 参数 columns 指定滚动量,单位为相对于左边缘的列数(从右到左段落中为相对于右边缘)。 columns 应为 0 或正数;若不是,则按 0 处理。 目前不支持 columns 为小数。
注意:若你简单地通过 M-: 求值调用 set-window-hscroll 进行测试,
可能会发现该函数看似未生效。
原因是函数设置水平滚动值并返回后,重绘会调整水平滚动以保证点可见,
这会覆盖函数的设置。
若你在点距离左边缘足够远(保证仍可见)时调用该函数,就能观察到其效果。
函数返回值为 columns。
(set-window-hscroll (selected-window) 10)
⇒ 10
以下代码可判断指定位置 position 是否因水平滚动而移出屏幕:
(defun hscroll-on-screen (window position)
(save-excursion
(goto-char position)
(and
(>= (- (current-column) (window-hscroll window)) 0)
(< (- (current-column) (window-hscroll window))
(window-width window)))))