user-interface - 文本编辑器一般是如何实现的?

标签 user-interface language-agnostic string text-editor

这个问题可能会让我听起来很无能。因为我就是这样。

我只是在想,如果我假设有兴趣设计自己的文本编辑器 GUI 控件、小部件或任何你想称之为的东西(我不是),我会怎么做?

对于像我这样的新手来说,以字符串的形式存储文本编辑器的内容是一种诱惑,这似乎成本相当高(并不是说我太熟悉一种语言/平台之间字符串实现的差异)和下一个;但我知道,例如,在 .NET 中,它们是不可变的,因此频繁的操作(例如您需要在文本编辑器中支持的操作)将非常浪费,需要非常快速地构建一个又一个字符串实例继承)。

大概是使用了一些包含文本的可变数据结构;但弄清楚这个结构可能是什么样子对我来说是一个挑战。随机访问会很好(无论如何,我想 - 毕竟,您不希望用户能够跳转到文本中的任何位置吗?),但我想知道成本比如说,导航到一个巨大文档中​​间的某个位置并立即开始输入。同样,新手方法(假设您将文本存储为可调整大小的字符数组)会导致性能非常差,我想,因为用户输入的每个字符都会有大量数据需要“转移”结束了。

因此,如果我必须做出猜测,我会认为文本编辑器采用某种结构将文本分解为更小的片段(也许是行?),这些片段分别包含具有随机访问的字符数组,并且它们本身可以作为离散 block 随机访问。即使看起来也一定是一种相当可怕的过度简化,尽管,如果它一开始就很接近的话。

当然,我也意识到可能没有“标准”的文本编辑器实现方式;也许每个编辑之间的差异很大。但我想,由于这显然是一个已经被解决过很多次的问题,也许多年来已经出现了一种相对常见的方法。

无论如何,我只是想知道是否有人对这个主题有所了解。就像我说的,我绝对不想编写自己的文本编辑器;我只是好奇。

最佳答案

一种常见的技术(尤其是在较旧的编辑器中)称为分割缓冲区。基本上,您将文本“分解”为光标之前的所有内容和光标之后的所有内容。之前的所有内容都位于缓冲区的开头。之后的所有内容都位于缓冲区的末尾。

当用户输入文本时,文本会进入中间的空白区域,而不移动任何数据。当用户移动光标时,您将适当数量的文本从“中断”的一侧移动到另一侧。通常,单个区域会发生大量移动,因此您通常一次仅移动少量文本。最大的异常(exception)是您是否具有“转到第 xxx 行”之类的能力。

查尔斯·克劳利 (Charles Crowley) 编写了更完整的 discussion of the topic 。您可能还想查看The Craft of Text Editing ,它更深入地涵盖了分割缓冲区(以及其他可能性)。

关于user-interface - 文本编辑器一般是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4046246/

相关文章:

asp.net - 使用 ASP.Net 进行正确的用户界面设计

c# - 什么时候需要浅拷贝(而不是深拷贝)?

python计算字符串中的字母而不使用count函数

C++ 字符串到字节数组的转换和加法

android - 如何在应用程序加载时隐藏标题栏并在加载完成时显示它?

design-patterns - 物体应该自己画吗?如何? (我使用的是 android,但问题适用于所有 OO 语言)

language-agnostic - 单线程/核心上的并行如何可能?

python - 区分规则和不规则形状的 Blob

c - 替换字符串 malloc 中的字符

jquery - 什么是我了解更多 Metro UI 的最佳资源