Scintilla.NET 基于正则表达式的语法高亮
Posted
技术标签:
【中文标题】Scintilla.NET 基于正则表达式的语法高亮【英文标题】:Scintilla.NET regular expression based syntax highlighing 【发布时间】:2014-11-25 11:08:07 【问题描述】:是否可以使用正则表达式来定义 Scintilla 中的语法高亮?如果是,该怎么做?
我有一种自定义语言要处理,不能用简单的关键字和分隔符来描述。这种语言中特定结构的含义仅取决于它们相对于关键字的位置。我有这种格式的基于正则表达式的解析器,我只需要将正则表达式定义的规则应用为文本样式。
我的意思是如果某些东西匹配 regex1,它应该有 style1。是否可以?怎么样?
如果没有 - 我可以为手动选择的范围设置样式吗?我的意思是在编辑器中将样式编号分配给指定的字符范围。怎么做?
是否可以在代码中而不是在 xml 文件中定义 Scintilla 样式?
编辑: 好的,我找到了办法。
foreach (Match m in Patterns.Keyword0.Matches(Encoding.ASCII.GetString(e.RawText)))
e.GetRange(m.Index, m.Index + m.Length).SetStyle(1);
问题是 RawText 属性。它是 UTF-8 编码文本的字节缓冲区。 text 属性包含漂亮的 UTF-16 文本,但 GetRage 方法接受字节偏移而不是字符偏移。如果我在每个 TextChanged 事件上使用转换,我几乎失去了使用 Scintilla 的所有速度优势。
当然,最简单的方法是将内部编码更改为 UTF-16,但是当我这样做时,我收到异常说不支持这种编码。唯一受支持的似乎是 UTF-8,它处理起来非常困难(而且速度很慢)。
我在这里碰壁了。
【问题讨论】:
【参考方案1】:关键是将词法分析器设置为SCLEX_CONTAINER,然后处理SCN_STYLENEEDED 通知。这意味着您只需要处理实际需要样式的文本。
Scintilla Documentation 顶部链接了几个指南,详细介绍了实施海关词法分析器的各个方面,因此我不会在此重复任何内容。
至于性能:我已经编写了自定义闪烁词法分析器是 python,它在样式设置时解码为 utf-8,并且从未发现任何重大问题,所以如果您至少不能使用 C# 匹配,我会感到惊讶。
【讨论】:
看来我必须再试一次 Scintilla。在我的第一次尝试中,我在编辑突出显示的文本时遇到了无法接受的延迟。目前,我使用 FTCB,当解析器编译成外部 dll 时,它的速度非常快。他们两个的工作方式非常相似。几乎相同的功能。以上是关于Scintilla.NET 基于正则表达式的语法高亮的主要内容,如果未能解决你的问题,请参考以下文章
Scintilla.NET Autocomplete 自动选择第一个元素 (C#)