AvalonEdit:级联突出显示色彩
我想级联AvalonEdit的SyntaxHighlighting引擎。 我有2个HighlightingDefinitions
。 第一个是主要的语法。 第二个是复杂的多行预处理器标记语言。 出于这个原因,在第一个语法中embedded第二个语法太复杂了。 更简单的方法是呈现第一个语法,然后更改受影响的行部分(基于第二个语法)。
于是我用第二种语言实例化了一个新的HighlightingColorizer
,并将其添加到LineTransformers
。 但是第二种语言使整个文档变色,而不仅仅是带有预处理器指令的行部分:非预处理器代码是黑色的。
当我debugging第二行变换器的ColorizeLine
方法时,非突出显示的代码(=没有预处理器代码)的行没有按预期着色。 但是线条的颜色是黑色的。
那么在开始着色之前, HighlightingColorizer
重置了整个文档的所有以前的突出显示?
还有什么可能是这个问题? 我怎样才能正确地级联2 HighlightingColorizers
?
问题是HighlightingColorizer
不直接存储对DocumentHighlighter
的引用,而是通过TextView.Services
存储它。 这样做是为了允许将相同的着色器连接到多个编辑器,这样每个编辑器都可以获得自己的DocumentHighlighter
。
当您连接第二个着色器时,它会覆盖存储在服务容器中的IHighlighter
; 两种调色剂都使用新的荧光笔。
此外,请注意, HtmlClipboard
中的“复制到剪贴板”逻辑直接访问IHighlighter
服务,它不使用任何着色器。 (将文本复制到Word只保留语法突出显示,没有其他转换,如折叠标记)
基本上有两种方法可以解决这个问题:
-
不要将额外的荧光笔存储为服务。 您可以通过创build自己的
HighlightingColorizer
类的副本来实现此目的,并使用该类中的字段而不是访问textView.Services
。 这是一个简单的改变,但复制文本到剪贴板时不会使用其他的荧光笔。 -
创build一个结合了来自多个
DocumentHighlighter
的HighlightedLine
的IHighlighter
实现。 这是我们用于SharpDevelop 5中C#语义突出显示的方法,它作为额外的突出显示器来扩展现有基于.xshd的C#突出显示。 然而,这种方法是复杂的(合并HighlightedLine
s是非平凡的给定sorting和嵌套约束的部分),并需要对IHighlighter
接口进行API更改以处理OnHighlightStateChanged
通知(AvalonEdit 4.x使用派生类嵌套在HighlightingColorizer
以访问此callback; AvalonEdit 5.0将使用一个事件)。