Dan*_*Tao 52 language-agnostic string user-interface text-editor
这个问题可能会让我听起来很无能为力.那是因为我.
我只是想,如果我假设有兴趣设计我自己的文本编辑器GUI控件,小部件或任何你想要调用的东西(我不是),我怎么会这样做呢?
像我这样的新手的诱惑是以字符串的形式存储文本编辑器的内容,这看起来非常昂贵(并不是说我太熟悉字符串实现在一种语言/平台和下一种语言/平台之间的区别;但是我知道在.NET中,例如,它们是不可变的,所以频繁的操作,例如你需要在文本编辑器中支持的内容,将会非常浪费,在一个接一个地连续构建一个字符串实例).
据推测,使用包含文本的一些可变数据结构; 但弄清楚这个结构可能会是什么样的,这对我来说是一个挑战.随机访问会很好(我想,无论如何 - 毕竟,你不希望用户能够跳到文本的任何地方吗?),但后来我想知道导航到某个地方的成本在一个巨大的文件中间并立即开始输入.同样,新手方法(比如你将文本存储为可调整大小的字符数组)会导致性能非常差,我想,就像用户输入的每个字符一样,会有大量的数据要"移位"过度.
因此,如果我不得不猜测,我认为文本编辑器采用某种结构将文本分成更小的部分(行,可能?),它们各自包含随机访问的字符数组,并且它们本身是随机的可作为离散块访问.即使这看起来似乎必须是一个相当可怕的过度简化,但是,如果它甚至远远接近开始.
当然,我也认识到,有可能无法成为一个"标准"的方式,文本编辑器来实现; 也许它在一个编辑器之间变化很大.但我想,由于这显然是一个已被解决很多次的问题,这些年来可能已经出现了一种相对普遍的方法.
无论如何,我只是想知道是否有人对这个主题有一些了解.就像我说的那样,我绝对不想写自己的文本编辑器; 我只是好奇.
Jer*_*fin 39
一种常见的技术(特别是在较旧的编辑器中)称为分割缓冲区.基本上,您将文本"分解"为光标之前的所有内容以及光标之后的所有内容.之前的一切都在缓冲区的开头.之后的所有内容都在缓冲区的末尾.
当用户键入文本时,它会进入中间的空白区域而不移动任何数据.当用户移动光标时,您可以将相应数量的文本从"中断"的一侧移动到另一侧.通常情况下,围绕一个区域移动很多,所以通常一次只能移动少量文本.最大的例外是如果你有一种"转向xxx"的能力.
查尔斯克劳利写了一篇关于这个主题的更全面的讨论.您可能还需要查看"文本编辑工艺",它更深入地介绍了分割缓冲区(以及其他可能性).
归档时间: |
|
查看次数: |
13452 次 |
最近记录: |