【发布时间】:2011-05-02 01:37:42
【问题描述】:
这个问题可能会让我听起来很无知。那是因为我是。
我只是在想,如果我假设有兴趣设计我自己的文本编辑器 GUI 控件、小部件或任何你想称呼它的东西(我不是),我会怎么做呢?
对于像我这样的新手来说,将文本编辑器的内容以字符串的形式存储的诱惑,这似乎相当昂贵(并不是我太熟悉字符串实现在一种语言/平台之间的差异和下一个;但我知道,例如,在 .NET 中,它们是不可变的,因此频繁的操作(例如您需要在文本编辑器中支持的操作)将非常浪费,非常快速地构造一个又一个的字符串实例继承)。
大概是使用了一些包含文本的可变数据结构;但是弄清楚这个结构可能是什么样子让我觉得有点挑战。随机访问会很好(无论如何,我会认为 - 毕竟,您不希望用户能够跳转到文本中的任何地方吗?),但是我想知道成本例如,导航到一个巨大的文档中间的某个地方并立即开始输入。同样,新手方法(假设您将文本存储为可调整大小的字符数组)会导致性能非常差,我在想,因为用户输入的每个字符都会有大量数据需要“转移”结束了。
因此,如果我不得不猜测,我会假设文本编辑器采用某种结构将文本分解成更小的部分(行,也许?),它们单独包含具有随机访问的字符数组,并且本身是作为离散块随机访问的。然而,即使 看起来它一定是一个相当可怕的过度简化,如果它甚至从一开始就很接近的话。
当然,我也意识到可能没有文本编辑器实现的“标准”方式;也许它从一个编辑器到另一个编辑器差异很大。但我想,既然这显然是一个已经解决了很多次的问题,那么多年来可能已经出现了一种相对常见的方法。
无论如何,我只是想知道是否有人对此主题有所了解。就像我说的,我绝对不想编写自己的文本编辑器。我只是好奇。
【问题讨论】:
-
虽然这无疑是一项艰巨的任务,但为什么不看看 vim 的源代码呢? vim.org/sources.php
-
我觉得你和我一样是一个 C# 人,我也对此进行了一些调查。需要注意的一点是,对于繁重的文本编辑,Winforms 自带的 TextBox 和 RichTextBox 控件不是很好。如果您深入研究它们的实现,最深的部分只是围绕一点 Windows API 本地方法的包装器。您最好使用其他一些 GUI 工具包(不确定 WPF)或自己包装本机方法。
-
我认为 Piece Table 是一种用于文本编辑器的数据结构,但不确定:)
-
Related: stackoverflow.com/questions/1520022/… stackoverflow.com/questions/3860423/… 还有其他的,虽然这是一个很难搜索的话题,因为所有要求编辑在某个平台上以某种方式对某些内容进行 frobnicate...
标签: user-interface language-agnostic string text-editor