Scintilla 文本组件。拥有超过 600 条命令的极速
Scintilla 文本组件
引言
除非您进行了一些汇编编程,否则您将对您的 PC 能够展现出的巨大性能一无所知(加载 80 个文本文件 < 0.5 秒)。考虑到这一点,我打算替换项目中一直使用的编辑类,因为这些编辑类拖慢了应用程序的速度,达到了无法接受的水平,而且功能 hardly 完整,也没有提供标准的功能。我偶然想起几年前,我曾接触过 Scintilla。Scintilla 是一个代码编辑器组件,具有事件的源代码,另一个奇特的扩展是期望的。该编辑器是用 C/C++ 编写的,可以使用 VS 2010 或更推荐的 Gcc 进行构建。我得到了比我乞求的还要多的东西!该“组件”自 1999 年以来就已存在,拥有超过 200 名贡献者,并在至少同样多的项目中使用,其中一些您可能已经遇到过了。许可证允许在任何免费项目或商业产品中使用。
版本
由于 Scintilla 旨在跨平台使用,因此有适用于多个平台的编译版本和大量不知名用途的包装器。考虑到 Windows,有一个 GTK+ 版本和一个原生版本。下面的图片显示了 Scintilla 的实际应用,以及内置 Scintilla 组件的项目。
经过重新实现后,包装好的 Scintilla 显示了一些功能

好吧,确实,您在这里看不到太多源代码。这并非我的目的。从上到下:代码片段管理器,带有一个打开的片段列表,后面是可逐字符着色的注释。任何所需颜色和大小的可调整大小的箭头框,带或不带闭合,可移动或固定,指向向上或向下,根据需要填充信息和标题。右侧显示了一个消息树。您在 Visual Studio 中进行调试时应该很熟悉。只是操作改进了一点。几个多色的红色小三角形是下拉标记,可用于任何目的。再往下是带或不带箭头和高亮功能的呼叫提示,作为额外的可能性显示消息。在查找替换标记对话框中激活了对正则表达式的支持。通过单击对话框中的多功能按钮之一,可以更改此模式,也可以更改其他模式。如果设置了标记(有 32 个可用),则会在编辑器中标记找到的文本,如果没有,则会高亮显示整行。编辑器左侧的边距,有 5 个,每个都可以任意配置,显示行号、文本查找位置的箭头符号、书签等等。最后但同样重要的是,代码折叠。这里的蓝色和浅绿色垂直线用作指示代码部分的条,可自由着色以用于所有种类的目的。这还不是全部,这仅显示了编辑器类中可用功能的一个子集。当然,实现的打印支持功能丰富,大约有 98 个命令键(快捷键)分配给了函数。总而言之,一套非常丰富的功能,速度非常快,易于使用。所有这些示例的代码,仅仅是每几行,都可以在项目中找到。
概述

术语
由于此项目基于 C/C++ 和 C# 源代码构建,因此所有这些语言的术语都可能混用。
实现
如前所述,有各种各样的实现可供下载。我找到的 C# 版本要么是基于 Framework 2 构建的,这在遵循一些令人困惑的错误消息后会变得显而易见,要么就是缺乏更新。自最后一个 C# 包装器完成后,编辑器中发生了 274 处更改(主要是函数和参数)。因此,现在可能是时候更新了,因为包装器似乎不再维护了。考虑到它的规模,这是可以理解的。目标是有一个可以在窗体设计器中使用的类,可以访问编辑本身,支持单个实例以及多个编辑实例,是基于 framework 4 构建的,并且快速、功能齐全且有吸引力。用户界面需要彻底的改造。是否可能实现一个具有合理开销的完整实现,鉴于其无限的可能性,这是值得怀疑的,甚至可能是不受欢迎的。尽管随着时间的推移添加了各种扩展,但编辑类仍然很稳定,这在使用如此长的时间开发后是可以预期的。包装器可能不是这样。毫不夸张地说,此类将最相似的项目远远甩在了后面。
Commands
这里的空间 hardly 足够列出内置的许多命令。这些可以在文档中找到,但至少可以找到命令可用的部分。
- 注解
- 自动完成
- 后台加载和保存
- 括号高亮
- 呼叫提示
- 插入符、选择和热点样式
- 光标
- 剪切、复制和粘贴
- 直接访问
- 错误处理
- 折叠
- GTK+
- 图像
- 指示符
- 按键绑定
- 键盘命令
- 用于语法着色的词法分析器
- 行结尾
- 自动换行
- 长行
- 宏录制
- 边距
- 标记
- 鼠标捕获
- 多重选择和虚拟空间
- 多视图
- Notifications
- 其他设置
- 覆盖输入
- 弹出编辑菜单
- 打印
- 滚动和自动滚动
- 搜索
- 选择和信息
- 样式
- 制表符和缩进向导
- 文本检索和修改
- 撤销和重做
- 用户列表
- 空白字符
- 缩放
高亮器,词法分析器
目前还没有不支持的格式。您听说过 Hugo 吗?您听说过!这是 CodeMax 的一个实现。目前,只实现所需格式的代码并剥离一些内置词法分析器是有意义的。
主要词法分析器有或预计有
Abaqus, Ada, Apdl, Asm, Asn1, Asp, Asymptote, Au3, Avenue, Baan, Bash, Batch, Bullant, Caml, Clarion, Cmake, Conf, Cpp, CSound, Css, D, Diff, Eiffel, EiffelKW, Erlang, ErrorList, EScript, F77, Flagship, Forth, Fortran, Haskell, Html, Inno, Kix, Latex, Lisp, Lot, Lout, Lua, Magik, MakeFile, Matlab, MetaPost, Mmixal, MSSql, NNCronTab, Nsis, Octave, Opal, Pascal, Perl, Php, Pov, PowerBasic, PowerShell, Properties, PS, Python, R, Rebol, Ruby, Smalltalk, Sol, SpecMan, Spice, Sql, Tads3, Tcl, Tex, VB, VBScript, Verilog, Vhdl, Xml and Yaml。
此列表仅具有临时价值,因为词法分析器的工作正在持续进行。
此外,还内置了一个名为 SimpleLexers 的扩展。其主要目的是对代码进行着色和自动完成,其中术语存储在单词列表中,并支持注释。提供了 300 多个不同语言的着色器。当然,这需要对不打算使用的进行注释,因为包装器会因此而变得臃肿。好吧,它在那里!
编译
Scintilla 在 Visual Studio 2010 下的编译抱怨了好几个问题,最终退出了(我也一样)。我切换到了 Gcc。由于我使用的是旧版本的 Gcc,只需要对 make 文件进行一项更改,很快就创建了两个 DLL 文件。Gcc 版本 4.7 就可以了。幸运的是,我在系统上的一个应用程序文件夹中找到了已安装的编译器。
托管与非托管代码
Scintilla 文本编辑器当然是非托管代码。出于各种原因,没有必要用托管代码创建此组件。此外,.NET 以某些特定方式处理结构,并且将它们编组在每种情况下仍然并非没有错误。
包装器
仅包装器的 C# 源代码就远远超过 30,000 行,此外还有所有窗体、编辑器、词法分析器信息和几个附加文件。一个人很容易迷失。旧包装器的初始作者,我,以及 Visual Studio 有时都会如此。由于项目规模,ScintillaNet 中的方法和类被重新组织、清理并重新实现。API 和用户界面的整个低级接口被重新组合,或者至少经历了重大更改。对 C 源进行低级接口的广泛验证是必要的,因此进行了。这里的“包装器”一词不是指 API 的完整封装,而是通过附加类来丰富基本功能,以提高舒适度并减少最终项目中的代码量。直接访问整个 API 仍然保持开放!此项目不适合初学者,但不要感到被排斥,尽管去做吧!只是要面对一些复杂性。
目标
- 包装 Scintilla 截至 2012/10/22 版本的所有函数调用(C#)
- 使用 Scintilla 编辑器变量创建附加属性
- 使用编辑器函数构建附加类
- 重新构建将在窗体设计器中支持的类
- 使用 framework 4 构建类,并向后兼容其他框架
- 重新设计用户界面对话框,例如查找、替换、标记和转到
- 扩展现有用户界面类并构建新类
现在可以通过以下方式访问 Scintilla 编辑器:
- 使用提供的常量进行标准 Windows 消息传递(难以记住)
- 使用提供的常量进行直接消息传递(难以记住)
- 直接调用
public
函数并分配public
变量(跟踪代码的开销) - 更易读的 C# 包装器函数,也显示为提示(弹出、智能感知)
通过直接访问属性和类(函数和变量)来规避消息传递和 switch
语句,从而提高主类的速度,这看起来非常有吸引力,尤其是在许多函数只是直接从编辑器字段获取或设置值的情况下。仔细一想,这可能不是一个绝妙的主意。
- 首先,如果代码更新,这些更改将丢失。
- 其次,此类中真正需要速度的函数不多,因为用户仍然是游戏中速度最慢的。
- 第三,对于此类而言,.NET 的速度已经足够快了。
- 第四,如果需要提高速度,那么可以在目标项目中直接访问。
- 第五,直接消息传递,规避响应缓慢的 Windows 消息传递已经实现,并且整个编辑器功能都为速度进行了优化。
SimpleLexer
在 SimpleLexer 中,词法分析器的单词列表限制已从 8 提高到 30。Scintilla 中最多可以定义 256 种样式,单词列表利用了样式。这个漂亮的数字在实践中存在一些限制。SimpleLexer 中输入的单词列表数量不得超过 30,因为单词列表使用 styles[wordlists.n],并且样式 31 用作注释样式。拥有 30 个可用单词列表仍然非常出色!确保不要将同一定义作为行或流注释,并在单词列表中作为注释,因为注释将覆盖任何样式。在词法分析器信息中为每个使用的信息或在 simplelexer 的 init
方法中全局定义样式和属性(参见 *Classes.cs*)。*SimpleLexers.cs* 包含 simplelexer 的结构和使用说明。
备注
Scintilla 编辑返回颜色的值类型为 long
,并转换为 Int32
。
对于每个使用或不使用的 Scintilla 函数,都会将 C 源代码中的一个主要 return
语句作为注释复制到 C# 包装器函数中。这样可以更轻松、更快地验证 return
值。包装器类中的编辑器直接调用主要返回整数值。
必备组件
- 应将 SciLexer.dll 复制到 Windows\System32 目录中,以避免出现错误消息。如果出现错误消息称 SciLexer 无法加载到内存中,则表示 SciLexer.dll 未复制到该目录中。
- 也许拥有 MinGW 和 Gcc 来重新编译 Scintilla 源代码。
- 拥有完整的 Scintilla 文档是强制性的!
- 当然,已安装 .NET framework 4。
- 一点点努力。不要期望此项目在每个细节上都完美。
待办事项
该项目仅用于重新实现就花费了数周时间,日夜不休。目前,最后的更新(错误报告中的更改)尚未实现。仔细查看屏幕截图(键盘)会发现尚未内置拼写检查器。万一您对某个细节不太满意,可以下载整个源代码并进行修改,如果更改可用设置不符合您的口味。
提示
像 Notepad++ 等免费项目提供了许多词法分析器和高亮器,可以实现。考虑注释掉或删除类中不打算使用的词法分析器,在这种情况下,Enums.Lexer
也应进行修改。通过将词法分析器编写或翻译成 XML 代码,甚至在 SimpleLexer
中输入它们,来实现新的词法分析器要容易得多。可以在 Configuration.Builtin 目录或 Scintilla 文档中找到示例。simplelexer 在源代码中有很好的文档记录。该项目包含一个 Documentation.txt 文件,其中包含许多需要注意的信息。还可以查看 Scintilla 或 SourceForge 的任何公告板以获取更多信息。由于可用选项数量众多,编写配置文件来设置您的个人样式可能会很有价值。
修改、扩展和评论
在此项目中,多年来有数百名贡献者参与其中,他们都投入了巨大的资源和热情,免费为您提供了一个出色的类及其源代码。理解这一点,请在您努力自己解决问题后,仅将错误报告给相关人员,并请礼貌地忽略其他评论。任何 Scintilla 消息板肯定都会为您提供帮助。Neil Hodgson,Scintilla 的作者,在回应询问方面速度惊人,并且乐于在编辑器中实施有价值的建议。
下载
下载完整项目绝对有优势。即使打包后,它也有一定的大小。
保修
没有隐含或假定的任何保证。请自行承担使用风险。作者做得非常出色。版权和商标属于其各自所有者。我不会为此争论!
许可证
本文以及任何相关的源代码和文件,均根据 COPL 许可,不包含 Scintilla 的源代码,Scintilla 的源代码受 Neil Hodgson neilh@scintilla.org 的版权保护,并带有自己的许可证。各种先前的贡献者可能对各种不同的许可证提出要求,据我所知,这些许可证都是开源的。整个项目已经发生了巨大的变化,以至于根据 COPL 进行许可似乎是有效的,并且/或者支持每个贡献者的目标。
链接
- 下载 Scintilla
- Sourceforge Scintilla 项目页面上的 CVS
- Scintilla 许可证
历史
- 2013 年 3 月 9 日:初始版本