AvalonEdit:级联突出显示色彩

我想级联AvalonEdit的SyntaxHighlighting引擎。 我有2个HighlightingDefinitions 。 第一个是主要的语法。 第二个是复杂的多行预处理器标记语言。 出于这个原因,在第一个语法中embedded第二个语法太复杂了。 更简单的方法是呈现第一个语法,然后更改受影响的行部分(基于第二个语法)。

于是我用第二种语言实例化了一个新的HighlightingColorizer ,并将其添加到LineTransformers 。 但是第二种语言使整个文档变色,而不仅仅是带有预处理器指令的行部分:非预处理器代码是黑色的。

当我debugging第二行变换器的ColorizeLine方法时,非突出显示的代码(=没有预处理器代码)的行没有按预期着色。 但是线条的颜色是黑色的。

那么在开始着色之前, HighlightingColorizer重置了整个文档的所有以前的突出显示?

还有什么可能是这个问题? 我怎样才能正确地级联2 HighlightingColorizers

问题是HighlightingColorizer不直接存储对DocumentHighlighter的引用,而是通过TextView.Services存储它。 这样做是为了允许将相同的着色器连接到多个编辑器,这样每个编辑器都可以获得自己的DocumentHighlighter

当您连接第二个着色器时,它会覆盖存储在服务容器中的IHighlighter ; 两种调色剂都使用新的荧光笔。

此外,请注意, HtmlClipboard中的“复制到剪贴板”逻辑直接访问IHighlighter服务,它不使用任何着色器。 (将文本复制到Word只保留语法突出显示,没有其他转换,如折叠标记)

基本上有两种方法可以解决这个问题:

  1. 不要将额外的荧光笔存储为服务。 您可以通过创build自己的HighlightingColorizer类的副本来实现此目的,并使用该类中的字段而不是访问textView.Services 。 这是一个简单的改变,但复制文本到剪贴板时不会使用其他的荧光笔。

  2. 创build一个结合了来自多个DocumentHighlighterHighlightedLineIHighlighter实现。 这是我们用于SharpDevelop 5中C#语义突出显示的方法,它作为额外的突出显示器来扩展现有基于.xshd的C#突出显示。 然而,这种方法是复杂的(合并HighlightedLine s是非平凡的给定sorting和嵌套约束的部分),并需要对IHighlighter接口进行API更改以处理OnHighlightStateChanged通知(AvalonEdit 4.x使用派生类嵌套在HighlightingColorizer以访问此callback; AvalonEdit 5.0将使用一个事件)。