- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在思考如何使编辑器的核心功能与 vim 兼容,类似于 yzis。
最大的问题是使用什么缓冲区类型。
要求是:
可能的缓冲区类型:
我读到间隙缓冲区在长时间运行时会导致相当大的内存碎片。此外,emacs 语法高亮引擎非常慢。(不知道为什么,可能与缓冲区类型无关)
所以问题:
谢谢,礼萨
最佳答案
一个好的文本编辑器应该对程序员可能做的所有类型的工作都有用,包括打开有时可能有几千兆字节大小的文件。因此,我不建议将所有内容都缓冲在 RAM 中。
我建议设置代表文件的切片搜索树,其中单个切片可能是:
当您打开一个文件时,您首先会在树中插入一个项目,它只是一个代表整个文件的范围,例如对于 10-MiB 文件:
std::map<size_t, slice_info> slices;
slices[0].size = 10*1024*1024;
当用户编辑文件时,在编辑点周围创建一个合理大小的“页面”,比如 4 KiB。树在那个点被拼接。在示例中,编辑点位于 5 MiB:
size_t const PAGE_SIZE = 4*1024;
slices[0].size = 5*1024*1024;
slices[5*1024*1024].size = PAGE_SIZE;
slices[5*1024*1024].buffer = create_buffer(file, 5*1024*1024, PAGE_SIZE);
slices[5*1024*1024 + PAGE_SIZE].size = 5*1024*1024 - PAGE_SIZE
您可以将内存映射文件用于只读缓冲区(源文件)和复制的可编辑缓冲区(后者将放置在临时目录中)。这也允许在编辑器崩溃时进行恢复。
使用固定大小的页面将大大减少内存堆的碎片,因为所有 block 都具有相同的大小,并且插入文本永远不需要移动超过 4 KiB 的数据。
这是一个简化的描述,旨在提供一般概念,而不会涉及太多细节。真正的实现很可能需要更复杂,例如允许页面中的可变数据量来应对溢出的页面,并将许多小片段合并在一起,以便在大文件上运行正则表达式替换不会创建太多小缓冲区。树中同时拥有的切片数量可能需要有限制,但关键是当您开始插入某个地方时,您应该确保您使用的切片不是太大。
对于正则表达式,我认为性能不是什么大问题,只要整个编辑器在运行时不会挂起即可。尝试 Boost.Regex ,它很可能足够快以满足您的需求,并且它也足够通用以插入您需要的任何缓冲策略。
这同样适用于语法高亮,如果你在后台运行它,它就不会在用户打字时打扰到他。您可以在这里使用 slice 方法来获得好处:
我不知道有任何独立的语法高亮引擎,但它们通常基于正则表达式替换(参见例如 vim 中的语法高亮文件)。
关于c++ - 编辑器核心缓冲区类型和语法高亮显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/531957/
在这个 fiddle 上,函数完美地完成了工作,但我需要稍微调整连接。 该点击甚至需要是父 div 的 addClass(深色/浅色)(true 或 false)。 如果是深色,则添加 Bright
我正在使用 Windows.UI.ViewManagement.UISettings 来获取系统强调色,但该类似乎没有任何亮/暗模式的方法或属性。我找不到此功能的文档,我该如何检测? PS:我正在制作
在使用 iOS 13 在明暗模式之间切换时,我遇到了显示键盘的异常行为。 该 View 有一个 inputAccessoryView 供用户输入消息。当然后在键盘显示的情况下切换亮/暗模式时,亮/暗模
我正在开发一个支持多个主题的 iOS 应用程序。有些主题使用深色背景,有些使用浅色。一些默认图标在深色/浅色背景中不可见。我在 xcassets 中看到一个选项,可以为不同的颜色模式添加图像。我的目标
一些上下文:Sciter (纯 win32 应用程序)已经能够呈现类似 UWP 的 UI: 在深色模式下: 在灯光模式下: Windows 10.1803 在设置小程序中引入深色/浅色开关 as se
我是一名优秀的程序员,十分优秀!