不同文本编辑器之间,“滚动”的区别

/ 0评 / 0

2018年记:偶然想起当年的写的这篇随笔,还是图样。vi一类上古编辑器,从设计之初就是给字符模式下使用的。虽然今天有很多人在模拟终端中使用它们,但本质上它们仍然是字符模式程序。设定运行环境连GPU图形模式都没有,还空谈什么像素滚动呢?

 

(本文作于多年前,无意翻到了就备份在这里吧)

 

文本编辑器都有一个通用的功能,那就是滚动。当文本过多,无法在编辑器的界面内全部显示时,文本会被分割成至少三个部分:前页、当前页、后页,然后通过滚动(转动鼠标滚轮或拖动界面的滚动条等)来切换显示的内容。

而在排版时采用的策略,不同编辑器之间是存在区别的。这里我想讨论的是滚动距离。

单倍行高滚动

常见的Source Insight和Notepad++,其最小滚动距离为单倍行高,每次滚动距离为行高的整数倍,也就是说界面会“一行一行”地进行滑动,这样的策略有很明显的优势,它的动态排版是精确到行的。

行高

例如当我们读一份繁杂枯燥的Log:

log [1][1001] data: 123414fewafr123rf22rf2 fasdfgasgds
log [3][0291] data: 9dsafsofe9vds3nf9e3gj u03gjoqgjg
log [6][3425] meta: 9v9denr3nvlv03bokmb j3g9ngokmlk3mlk
bin [2][2332r][345]: 0bf0dj3b0uf 03gjb30 jb0bj30j 0j3g

当这样的Log信息有几十上百上千行,一旦我们看完一页,向下滚动,我们会担心会不会滚动不够多,导致我们需要看的那一行只露出来一半。可是当我们使用Source Insight时却不会有这样的担忧,因为我们知道,它的滚动是以行为单位的,内容要么不在界面内,要么就会整行出现在界面以内。

那么这个设计的缺点是什么呢?很显然,当我们连续滚动页面时,以行距为单位的连续跳跃式滚动,很容易使我们的眼睛失去对焦点的捕捉。稍微多下滚几行,如不借助高亮,我们就找不到刚刚那行在什么位置了。(重新找到那行的位置当然是很简单的,但这种思维连贯性的中断很影响工作效率)

像素滚动

与之相对的一款编辑器则是Visual Studio Code,它的滚动特点是什么呢?它几乎没有最小滚动距离。VSC的最小滚动距离是像素级别的,这使得它的滚动异常顺滑流畅。当我们向下滚动时,眼睛可以毫无压力地锁定焦点所在行,在看代码时,这种视觉和思维上的流畅性对体验的提升很大。

区别的原因

暂没有仔细研究过几款编辑器的代码,但我猜测,这些区别并不完全是因为设计思想的不同,也与工具的实现技术有关。VSC的渲染引擎来自Chromium,无视不同平台的区别,实现统一丝滑般流畅的滚动是自然而然的事情。

而其它的编辑器是采用C/C++开发的渲染(排版)引擎,从算法实现复杂度角度考虑,按固定宽度滚动是比较容易实现的,从软件运行效率的角度考虑,最小滚动距离越大,运行效率越高。但单倍行高是这个最小滚动距离能允许的最大值,因为一旦大于这个值,很可能出现无法通过滚动到达的位置。(例如最小滚动距离为2,现在界面最末端一行是10,那就没办法直接滚动到123,只能滚动到124)
不过Sublime Text这款编辑器比较特殊,如果仔细拖动滚动条,你会发现,其实它也是按照某个“最小滚动距离”在滚动,所以“跳跃感”也是存在的。但它的“最小滚动距离”是0.5倍行高,所以跳跃感没那么强,以至于很多人直接忽略了这一点。

总结

总地来说,单就滚动这一点而言,VSC这类编辑器的体验是更胜一筹的,因为它也可以通过光标键实现单倍行高的滚动。既然如此,为什么早先没有出现如VSC这样的文本编辑器呢?为什么早期的编辑器都不约而同地使用单倍行距作为最小滚动距离呢?vi/vim、notepad、甚至Visual Studio这样强大的IDE……我想这都是出自性能上的考虑。即便性能高度过剩的今天都有人嫌弃VSC的性能低下,更别说从前了不是吗。由此看来,哪怕是小小的文本编辑器,哪怕是文本编辑器里小小的滚动条,都能体现出一丁点儿历史进程。

发表评论

电子邮件地址不会被公开。 必填项已用*标注