- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题可能会让我听起来很无能。因为我就是这样。
我只是在想,如果我假设有兴趣设计自己的文本编辑器 GUI 控件、小部件或任何你想称之为的东西(我不是),我会怎么做?
对于像我这样的新手来说,以字符串的形式存储文本编辑器的内容是一种诱惑,这似乎成本相当高(并不是说我太熟悉一种语言/平台之间字符串实现的差异)和下一个;但我知道,例如,在 .NET 中,它们是不可变的,因此频繁的操作(例如您需要在文本编辑器中支持的操作)将非常浪费,需要非常快速地构建一个又一个字符串实例继承)。
大概是使用了一些包含文本的可变数据结构;但弄清楚这个结构可能是什么样子对我来说是一个挑战。随机访问会很好(无论如何,我想 - 毕竟,您不希望用户能够跳转到文本中的任何位置吗?),但我想知道成本比如说,导航到一个巨大文档中间的某个位置并立即开始输入。同样,新手方法(假设您将文本存储为可调整大小的字符数组)会导致性能非常差,我想,因为用户输入的每个字符都会有大量数据需要“转移”结束了。
因此,如果我必须做出猜测,我会认为文本编辑器采用某种结构将文本分解为更小的片段(也许是行?),这些片段分别包含具有随机访问的字符数组,并且它们本身可以作为离散 block 随机访问。即使 这看起来也一定是一种相当可怕的过度简化,尽管,如果它一开始就很接近的话。当然,我也意识到可能没有“标准”的文本编辑器实现方式;也许每个编辑之间的差异很大。但我想,由于这显然是一个已经被解决过很多次的问题,也许多年来已经出现了一种相对常见的方法。
无论如何,我只是想知道是否有人对这个主题有所了解。就像我说的,我绝对不想编写自己的文本编辑器;我只是好奇。
最佳答案
一种常见的技术(尤其是在较旧的编辑器中)称为分割缓冲区。基本上,您将文本“分解”为光标之前的所有内容和光标之后的所有内容。之前的所有内容都位于缓冲区的开头。之后的所有内容都位于缓冲区的末尾。
当用户输入文本时,文本会进入中间的空白区域,而不移动任何数据。当用户移动光标时,您将适当数量的文本从“中断”的一侧移动到另一侧。通常,单个区域会发生大量移动,因此您通常一次仅移动少量文本。最大的异常(exception)是您是否具有“转到第 xxx 行”之类的能力。
查尔斯·克劳利 (Charles Crowley) 编写了更完整的 discussion of the topic 。您可能还想查看The Craft of Text Editing ,它更深入地涵盖了分割缓冲区(以及其他可能性)。
关于user-interface - 文本编辑器一般是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4046246/
编写一个仅用于集中其他接口(interface)的接口(interface)是好的做法还是坏的做法? interface InterfaceA : InterfaceB, InterfaceC { }
有没有一种方法可以确定具体类型从任意接口(interface)列表?我知道类型转换,但我想知道所有满意的接口(interface)。 例如,给定: type Mover interface { Mo
我正在尝试制作斐波那契堆。 (在我正在上的算法课中多次提到它们,我想检查一下。)我希望堆使用任何类型的节点,所以我定义了一个 Node 接口(interface): package node type
这是我的代码: type IA interface { FB() IB } type IB interface { Bar() string } type A struct {
示例 A: // pseudo code interface IFoo { void bar(); } class FooPlatformA : IFoo { void bar() {
合并它编译的 leppies 反馈 - 但 IMO 有一些缺点,我希望编译器强制每个子类定义它们自己的 Uri 属性。现在的代码: [] type UriUserControl() = inh
我正在构建一个项目,该项目从用户那里获取一个术语,然后执行谷歌搜索并返回一个 json 格式的标题列表。 我正在使用 serpwow API 来执行谷歌搜索并试图解析响应。 但是我收到的错误是: pa
我只想在其他接口(interface)中实现某些接口(interface),我不希望它们能够被类直接继承。 提前致谢! 最佳答案 您不能在 C# 中执行此操作 - 任何类都可以实现它有权访问的任何接口
我是 Go 的新手,还有一些我还没有掌握的技巧 例如,我有一个可以这样调用的函数: myVar.InitOperation("foo",Operator.EQUAL,"bar") myVar.Init
我有一个通用接口(interface)来描述对输出流的访问,如下所示: interface IOutput { function writeInteger(aValue:Int):Void;
我正在做一个项目,我想通过某种接口(interface)(最好是 USB)将光电探测器电路安装到计算机上。但是,由于我是新手,所以我不知道应该朝哪个方向处理这个问题。假设我有一个带有 USB 连接的光
背景 我正在尝试创建一个简单的应用程序,以真正理解DDD + TDD + etc的整个堆栈。我的目标是在运行时动态注入DAL存储库类。这让我 域和应用程序服务层可测试。我打算用“穷人的DI”来完成 现
在 Java 中,接口(interface)扩展接口(interface)是完全合法的。 UML 中的这种关系看起来像“扩展”关系(实线、闭合、未填充的箭头)还是“实现”关系(虚线、闭合、未填充的箭头
我想创建一个具有相等和比较函数默认实现的接口(interface)。 如果我从类型 IKeyable 中删除所有内容除了Key成员,只要我不添加默认实现,它就是一个有效的接口(interface)。从
COM 中的双接口(interface)是能够通过 DispInterface 或 VTable 方法访问的接口(interface)。 现在有人可以告诉我这两种方法之间到底有什么区别吗? 我认为 V
我有一个类方法,它返回一个可以迭代的员工列表。返回列表的最佳方式是什么?通常我只返回一个 ArrayList。然而,据我了解,界面更适合这种类型的操作。哪个是最好使用的界面?另外,为什么返回接口(in
我想从包装类外部实例化一个内部非静态接口(interface)。 这可能吗? 考虑以下代码: shared class AOuterClass() { Integer val = 3; shared
我为一个类编写了一个接口(interface),如下所示: public interface IGenericMultipleRepository { Lazy> addresses { ge
我是 UML 的初学者,现在我正在创建一个序列图,问题是我想根据用户输入实现 DAO 接口(interface)。如何在时序图中正确绘制以实现接口(interface)。 最佳答案 您不会在 SD 上
要使用 jsr 303 验证创建有条件验证的组,请将接口(interface)类传递给注释,如下所示: @NotEmpty (groups={UpdateValue.class}) 我有很多不同的接口
我是一名优秀的程序员,十分优秀!