文本编辑理论

lor*_*ova 48 theory text-editor editor data-structures

由于我总是对现有的编辑不满意,我一直想要开始的项目是我自己的文本编辑器.然而,进行文本编辑是一项严肃的事

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

Cor*_*rch 16

看看Rob Pike对他的Sam文本编辑器的描述.请务必浏览高级概述和命令语言.他将在本文后面介绍解析,内存管理和数据结构.

另外,看看Russ Cox的简单正则表达式实现.它很容易理解,可能会在现有的正则表达式库之外打开一些门.


Gre*_*ill 15

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

  • 将文本文件表示为文本行的双向链接列表.
  • 构造一个树状数据结构(有时称为"绳索"),它以一个实心的字符串开头,但能够分割,插入和删除文本块,而不必移动所有其余的文本.

许多旧的Borland示例书使用文本编辑器作为教程示例.您偶尔也可以在二手书店找到这些副本几乎免费.


Ste*_*enD 10

这里有一个很好的教程,涵盖了更现代的环境中的许多相关主题:

这个问题的其他答案涵盖了间隙缓冲区.

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

以及来自的额外细节:

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

  • 虽然此链接可能会回答这个问题,但最好在此处包含答案的基本部分并提供参考链接.如果链接的页面发生更改,则仅链接的答案可能会无效. (3认同)
  • 虽然我知道链接确实陈旧,但问题要求提供需要多页解释的信息,更多可以合理地包含在Stack Overflow答案中.我给出了一些选择的部分原因是为了覆盖一些消失的情景.然而,Wayback Machine通常也可以提供帮助(http://archive.org/web/) (2认同)

msw*_*msw 9

推荐按要求回答:

Kernighan和Plaugher 的古老的" Pascal软件工具 "用ed一种既没有真正的字符串也没有指针的语言来实现编辑器.它包含了任何文本编辑器背后的设计注意事项的概述.


Jer*_*fin 8

一种仍然有效的旧方法称为间隙缓冲区.基本思想是将文本放入缓冲区,但不是将其全部放在一个块中,而是在光标处创建一个"间隙",将光标前的所有文本放在缓冲区的开头,并且所有文本都放在缓冲区的开头.光标在缓冲区末尾的文本.大多数插入发生在光标处,您可以在不移动任何内容的情况下进行插入(直到或除非您溢出缓冲区).当用户移动光标时,您将相应的文本从分割的一侧移动到另一侧.

给定典型控件(光标向左,向右,向上,向下,向上翻页,向下翻页),您通常处理的最大移动是一次一页,通常比键盘重复快得多.当然,如果你有一个真正庞大的文件和一个"goto line"命令,或者那个命令上的东西,它可以减慢一点.如果你要做很多事情,毫无疑问会有更好的结构使用......


Dar*_*con 7

Craig Finseth 的文本编辑工艺,基于他的硕士论文,涵盖了这些主题.它在网上免费.OTOH它已经很老了,并没有提到一些想法,比如在过去的小型计算机上不太实用的绳索.


Adr*_*thy 5

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

我知道Stack Overflow的答案不仅仅是链接,但这仍然是我找到的所需信息的最佳信息来源,而且这里的答案总结得太长了.如果链接过时,请搜索新墨西哥大学的Charles Crowley的" 文本序列的数据结构 ".