在文本编辑器中使用绳索
Using rope in text editors
我正在阅读如何从头开始制作文本编辑器。我遇到了各种不同的数据结构,如间隙缓冲区、块表和绳索。我可以理解其他人在实践中是如何工作的,我也理解绳索的好处以及它在逻辑上是如何运作的。但是,我不明白编辑器实际上是如何使用绳索的。让我解释一下。
假设我有一个新文件并输入 "Hello world!"。我想编辑器会处理每个字符的每个按键。但是,从程序逻辑方面来看,我没有看到处理每个新角色的明显方法。据我了解,rope 之所以有用,是因为树结构允许相对低成本的搜索、插入、追加和删除。但是,如果我逐个字符地处理输入,我希望有:
- 每个节点都是一个字符
- 让每个节点包含 X 个字符
- 每个节点都是一个完整的单词,节点由空格分隔
- 每隔 X 时间键入的每个字符都会转到一个节点
- 我还没有想到的东西
第一个选项虽然很容易实现,但似乎没有多大意义,而且我认为没有充分利用绳索结构。第二个选项似乎只是通过附加到节点内的字符串直到它达到 X 长度来使用一半的绳索。第三个选项与第二个选项具有相同的问题,但至少不会在某个设定长度处断开字符串。选项 4 会给出与我在大多数绳索示例图中看到的结果类似的结果,但在实现级别上似乎是一场噩梦。
TL;DR:在文本编辑器中使用绳索时,理想情况下在按下一个键和该字符出现在树中之间应该发生什么?伪代码或高级解释就足够了。
查看现有的 rope 实现后,选项 2 似乎是它在文本编辑器中的实际使用方式。
正如我看到的 ROPE 的实现,它遵循选项 2。
你可以检查下面的实现。 (它不是精确的文本编辑器实现)
https://www.geeksforgeeks.org/ropes-data-structure-fast-string-concatenation/
我建议检查下面 link 并检查文本编辑器的 table 数据结构。
http://www.averylaird.com/programming/the%20text%20editor/2017/09/30/the-piece-table/
我正在阅读如何从头开始制作文本编辑器。我遇到了各种不同的数据结构,如间隙缓冲区、块表和绳索。我可以理解其他人在实践中是如何工作的,我也理解绳索的好处以及它在逻辑上是如何运作的。但是,我不明白编辑器实际上是如何使用绳索的。让我解释一下。
假设我有一个新文件并输入 "Hello world!"。我想编辑器会处理每个字符的每个按键。但是,从程序逻辑方面来看,我没有看到处理每个新角色的明显方法。据我了解,rope 之所以有用,是因为树结构允许相对低成本的搜索、插入、追加和删除。但是,如果我逐个字符地处理输入,我希望有:
- 每个节点都是一个字符
- 让每个节点包含 X 个字符
- 每个节点都是一个完整的单词,节点由空格分隔
- 每隔 X 时间键入的每个字符都会转到一个节点
- 我还没有想到的东西
第一个选项虽然很容易实现,但似乎没有多大意义,而且我认为没有充分利用绳索结构。第二个选项似乎只是通过附加到节点内的字符串直到它达到 X 长度来使用一半的绳索。第三个选项与第二个选项具有相同的问题,但至少不会在某个设定长度处断开字符串。选项 4 会给出与我在大多数绳索示例图中看到的结果类似的结果,但在实现级别上似乎是一场噩梦。
TL;DR:在文本编辑器中使用绳索时,理想情况下在按下一个键和该字符出现在树中之间应该发生什么?伪代码或高级解释就足够了。
查看现有的 rope 实现后,选项 2 似乎是它在文本编辑器中的实际使用方式。
正如我看到的 ROPE 的实现,它遵循选项 2。 你可以检查下面的实现。 (它不是精确的文本编辑器实现) https://www.geeksforgeeks.org/ropes-data-structure-fast-string-concatenation/
我建议检查下面 link 并检查文本编辑器的 table 数据结构。 http://www.averylaird.com/programming/the%20text%20editor/2017/09/30/the-piece-table/