编辑文字缓冲区

时间:2020-03-06 14:56:15  来源:igfitidea点击:

好的,这是一个不礼貌的问题。我想构建一个简单的文本编辑器(使用我自己的文本模式屏幕处​​理)。我只想要一个可以用来表示文本缓冲区的数据结构的好例子,以及一些char / text插入/删除的简单例子。我可以自己处理所有其余代码(文件I / O,控制台I / O等)。链接到一个很好的简单编辑器源将非常有用(C或者C ++)。

解决方案

"四人帮"一书(设计模式)具有基于GUI的文本编辑器,作为示例的主要来源,也是一本值得拥有的书。

一般的"纯文本"编辑器可能使用绳索,SGI的STL已实现了绳索。基本上,它们是字符缓冲区的链接列表。这样,插入/删除字符需要更改较小的缓冲区和一些指针,而不是将整个文档存储在单个缓冲区中,而必须移动所有内容。

查看vim,它是开源的。在其中戳一下,看看它如何处理我们想要的内容。

一种简单的方法是面向行的-将文件表示为char / wchar_t数组/向量的数组/向量,每行一个。尽管行尾是一种特殊情况,但插入和删除的工作方式与我们期望的一样。

我从那开始,可能在其他所有工作完成之后,用更有效的方式替换行数据结构,以支持长行上的插入/删除。

这实际上取决于设计。几年前,我使用curses编写了一个小型编辑器。我使用了双向链表,其中每个节点都是一个字符(这是很浪费的设计。但是,它使格式化和屏幕刷新例程变得非常容易)。

我的朋友使用的其他数据结构是(这是一个家庭作业项目):
1)链接的数组列表,每个数组代表一行。
2)2D链表(仅由该名称组成)..它是字符的链表,但每个字符都链接到上方和下方的字符。
3)链接列表数组

但是,我建议我们浏览一些简单的编辑器(如pico)的源代码,以了解他们正在使用什么ds。

主要数据结构是包含文本的结构。我们可能需要一个行数组,而不是使用一个长缓冲区来包含文本,因为将字符插入行的中间要比将字符插入大缓冲区的中间要快。

我们需要确定文本编辑器是否应支持嵌入式格式。例如,如果我们需要使用字体,粗体,下划线等,那么数据结构将需要包括在文本中嵌入格式代码的方法。在8位字符的旧时代,我们可以使用整数的高8位来存储任何格式标志,而低8位可以存储字符本身。

实际的代码将取决于我们使用的语言。在Cor C ++中,我们可能会在行中使用字符串数组。在C语言中,我们将有一个基于堆的字符数组。

尽可能将显示代码与文本处理代码分开。代码的中心将是一个紧密的循环,例如:

while (editing) {
    GetCharacter();
    ProcessCharacter();
    UpdateDisplay();
}

更复杂的编辑器将使用单独的线程进行字符获取/处理和显示更新。

我曾经在一家主要产品是文本编辑器的公司工作。虽然我主要研究脚本语言,但是编辑器本身的内部设计自然是讨论的主要主题。

好像它分解为两个一般的思路。一种是我们自己存储了每一行,然后将它们链接到一个链表或者我们满意的其他整体数据结构中。这样做的好处是,任何面向行的编辑操作(例如删除整行或者在文件中移动行块)都不容易实现,因此闪电般快速。不利的一面是,加载和保存文件需要花费更多的工作,因为我们必须遍历整个文件并构建这些数据结构。

当时的另一种思路是尝试将大块的文本保持在一起,而不管换行符是否在未更改的情况下,仅根据编辑的需要将它们分解。这样做的好处是,可以很容易地将未经编辑的文件大块爆破为文件。如此简单的编辑非常快速,我们可以在其中加载文件,更改一行并保存文件。缺点是,面向行或者列块操作的执行非常耗时,因为我们必须解析这些大块的文本并四处移动数据。

无论价格如何,我们始终坚持面向行的设计,并且我们的产品被认为是当时最快的编辑器之一。

我们是否已检查了Scintilla的源代码?

这是2008年。不要编写文本编辑器;而是要编写文本编辑器。你是在重新发明火。

还在?我不确定这是否适用或者我们打算支持什么平台,但是Neatpad系列教程是开始考虑编写文本编辑器的好地方。他们将Win32视为基本平台,但是许多经验教训将适用于任何地方。

我最喜欢的解决方案是间隙缓冲区,因为它很容易实现并且摊销效率很高。只需使用单个字符数组,将一个区域指定为间隙。一旦理解了这个概念,代码就会自然而然地遵循。

我们还需要一个辅助数组[vector <int>]来跟踪每行开头的索引-这样我们就可以轻松提取特定的文本行。辅助数组仅在间隙移动或者插入/删除换行符时才需要更新。

这两个在线文档为文本编辑器提供了一个小巧但有用的"知名"数据结构/技术聚宝盆。

  • 文本序列的数据结构描述并实验性地分析了一些数据结构,这些数据结构倾向于选择表作为选择的数据结构。但是,Net.wisdom似乎更倾向于间隙缓冲区,因为它足以进行文本编辑,并且更易于实现/调试。
  • "文本编辑技术"(www.finseth.com/craft/)是一项较旧的著作,不仅涉及数据结构,而且还针对Emacs风格的编辑器;但是这些概念通常很有用。