在文本编辑器中使用绳索

问题描述:

enter image description here在文本编辑器中使用绳索

我正在阅读如何从头开始编写文本编辑器。我遇到了各种不同的数据结构,如间隙缓冲区,块表和绳索。我可以理解其他人如何在实践中工作,并且我理解绳子的好处以及它在后勤方面的工作原理。但是,我不明白编辑如何使用绳索。让我解释。

假设我有一个新文件并输入“Hello world!”。我会想象每个按键编辑都会处理每个角色。但是,从程序逻辑的角度来看,我没有看到处理每个新字符的明显方法。根据我的理解,由于树结构允许相对低成本的搜索,插入,追加和删除操作,绳索很有用。但是,如果我处理输入字符一个字符是我预计有:

  1. 每个节点是单个字符
  2. 有字符的每个节点保持X量
  3. 的每个节点都是一个完整的字和节点用空白打破
  4. 每个字符输入的时间每X量变为一个节点
  5. 东西我还没有想到的

第一个选项虽然容易实施,但似乎没有太大意义,我不相信最好地利用绳索结构。第二个选项似乎只通过在节点内附加字符串来实现一半的使用,直到达到X长度。第三个选项与第二个选项具有相同的问题,但至少不会在某个设定的长度处中断字符串。选项4会给出与我在大多数示例图表中看到的类似结果,但在执行级别看起来像是一场噩梦。

TL; DR:当在文本编辑器中使用绳索时,理想情况下按下键和该树中出现的那个角色之间会发生什么?无论是伪代码还是只是一个高级解释就足够了。

+1

这里的xi的绳索在叶子中存储511-1024(ish)个字节,使用基本相当于一个向量的字节。 https://github.com/google/xi-editor/tree/master/rust/rope –

正如我看到ROPE的实现,它遵循选项2. 您可以检查下面的实现。 (它不是精确的文本编辑器实现) https://www.geeksforgeeks.org/ropes-data-structure-fast-string-concatenation/

我会推荐检查下面的链接并检查文本编辑器的表格数据结构。 http://www.averylaird.com/programming/the%20text%20editor/2017/09/30/the-piece-table/

查看过现有的绳索实现后,它看起来像选项2是如何在实践中使用文本编辑器。