Data structures 文本编辑理论

Data structures 文本编辑理论,data-structures,editor,text-editor,theory,Data Structures,Editor,Text Editor,Theory,因为我总是对现有的编辑器不满意,所以我一直想开始的一个项目是我自己的文本编辑器。然而,做文本编辑是一件严肃的事情 除了分析现有文本编辑器的源代码外,是否有关于此主题的书籍或其他资源(如学术著作)?我特别感兴趣的是一些教你如何处理内存和如何管理文本插入的东西(如果你有一个100 MB的文件,并且想在x位置添加一个字符,你不能只memmove巨大的文本块…) 如何管理文本插入(如果您有一个100 MB的文件,并且希望在x位置添加一个字符,那么您不能只记住巨大的文本块…) 使文本文件成为一个链接列表,

因为我总是对现有的编辑器不满意,所以我一直想开始的一个项目是我自己的文本编辑器。然而,做文本编辑是一件严肃的事情

除了分析现有文本编辑器的源代码外,是否有关于此主题的书籍或其他资源(如学术著作)?我特别感兴趣的是一些教你如何处理内存和如何管理文本插入的东西(如果你有一个100 MB的文件,并且想在x位置添加一个字符,你不能只
memmove
巨大的文本块…)

如何管理文本插入(如果您有一个100 MB的文件,并且希望在x位置添加一个字符,那么您不能只记住巨大的文本块…)


使文本文件成为一个链接列表,其中每一行都是一个条目。

多年来,我编写了许多不同的文本编辑器。当然,最简单的方法是管理一长串字符,复制周围的所有内容以插入任何字符。我使用的其他技术包括:

  • 将文本文件表示为文本行的双链接列表
  • 构造一个树状数据结构(有时称为a),它以一个实心字符串开始,但能够拆分、插入和删除文本块,而无需移动所有其余文本

许多古老的Borland示例书使用文本编辑器作为教程示例。偶尔你仍然可以在二手书店找到这些书的副本,几乎是免费的。

如果你知道一般人的插入点相对较少,你可以在原始文本缓冲区中放置一组指针,当用户试图插入时,你就“拆分”通过生成另一个指向缓冲区其余部分的指针,使第一个指针的长度在插入点处停止,并为要插入的文本添加第三个指针来创建缓冲区,类似于:

long original text la la la
^                *^
|                 2nd part
1st part
星号指向一个新的文本缓冲区,在那里你开始添加要插入的文本

在呈现(或一般解析)文本文件时,循环指针数组,然后对每个缓冲区执行操作。当然,如果缓冲区足够小,您可以跳过添加新缓冲区部分的步骤,但这只是试探性的,请尝试每种方法,并了解哪种方法最有效


你也可以考虑将文本文件加载到多个缓冲区中,比如说每1MB左右,因为如果你将文件加载到一个缓冲区中,那么就需要为插入的文本创建一个新的缓冲区。同样,这是一个启发式优化。

看看罗伯·派克对他的描述。请务必浏览高级概述和命令语言。他在本文后面介绍了解析、内存管理和数据结构


另外,看看Russ Cox的。这很容易理解,并且可能会打开现有正则表达式库之外的一些门。

升级为按请求应答:


Kernighan和Plaugher的“仿古”用一种既没有实际字符串也没有指针的语言实现了
ed
编辑器。它对任何文本编辑器的设计注意事项都有很好的概述。

一种仍然有效的旧方法称为间隙缓冲区。基本思想是将文本放入缓冲区,但不是将其全部放入一个块中,而是在光标处创建一个“间隙”,将所有文本置于缓冲区开头的光标之前,将所有文本置于缓冲区末尾的光标之后。大多数插入发生在光标处,无需移动任何东西(直到或除非缓冲区溢出)。当用户移动光标时,将相应的文本从拆分的一侧移动到另一侧


给定典型控件(光标左、右、上、下、上、下、上、下),您通常处理的最大移动是一次一页,这通常比键盘重复的速度要快得多。当然,如果你有一个非常大的文件和一个“goto-line”命令,或者类似的命令,它会稍微慢一点。如果你要做很多这方面的工作,毫无疑问有更好的结构可供使用。

闪烁体组件使用分割缓冲区,其原理在页面链接的文本中解释。
链接页面为。

分割缓冲区证明了它即使在处理兆字节文件时也能很好地工作。使用二级结构(例如,行开始列表)也会有所帮助。

由Craig Finseth根据其硕士论文撰写,涵盖了这些主题。它在网上是免费的。OTOH这本书非常古老,没有提到像绳索这样的想法,这些想法在过去的微型计算机上不太实用。

这里有一本优秀的教程,在更现代的背景下涵盖了许多相关主题:

这个问题的其他答案包括间隙缓冲

另一个现代报道是对AvalonEdit的描述

更多详情请参见:

书中有大量的细节/内容(关于SharpDevelop):

比较了可用于文本编辑器的许多数据结构,包括此处已经提到的一些数据结构(如间隙缓冲区)以及其他一些数据结构(如工件表)。这篇文章很旧,但我相信它仍然涵盖了所有主要的选择,并且在性能、复杂性和空间开销方面对它们进行了很好的比较

我知道堆栈溢出的答案不仅仅是链接,但这仍然是我找到的关于所请求信息的最好的信息来源,在这里总结太长了。如果链接变陈旧,搜索新墨西哥大学的“Charles Crowley”。

< P>这里是“微软的专业人员”如何做:

MS Word使用工件表数据结构。字符位置的升序数组与包含