是否可以使用正则表达式在Scintilla中定义语法高亮?如果是的话,怎么做?
我有一个要处理的自定义语言,无法用简单的关键字和分隔符来描述。此语言中特定结构的含义仅取决于它们相对于关键字的位置。我有这种格式的基于正则表达式的解析器,我只需要将正则表达式定义的规则应用为文本样式。
我的意思是如果某些东西与regex1匹配,它应该有style1。可能吗?怎么样?
如果没有 - 我可以为手动选择的范围设置样式吗?我的意思是在编辑器中将样式编号分配给指定的字符范围。怎么做?
是否可以在代码中定义Scintilla样式,而不是在xml文件中定义?
编辑: 好的,我找到了办法。
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,处理起来非常困难(而且很慢)。
我在这里撞墙了。
答案 0 :(得分:1)
关键是将词法分析器设置为SCLEX_CONTAINER,然后处理SCN_STYLENEEDED通知。这意味着您只需要处理实际需要样式的文本。
Scintilla Documentation顶部有几个链接,详细介绍了实施海关词法的各个方面,所以我不会在这里重复任何一个。
至于性能:我写的自定义scintilla lexers是python,在造型时解码为utf-8并且从未注意到任何重大问题,所以如果你不能使用C#至少匹配它,我会感到惊讶。