AvalonEdit: 级联高亮显示颜色器

67
我想级联AvalonEdit的SyntaxHighlighting引擎。我有2个“HighlightingDefinitions”。第一个是主语法,第二个是复杂的多行预处理器标记语言。因此,将第二个语法嵌入第一个语法太复杂了。更简单的方法是呈现第一个语法,然后在之后更改受影响的行部分(基于第二个语法)。
所以我用第二种语言实例化了一个新的“HighlightingColorizer”,并将其添加到“LineTransformers”中。但是第二种语言会对整个文档进行着色,而不仅仅是带有预处理器指令的行部分:非预处理器代码为黑色。
当我调试第二个行转换器的“ColorizeLine”方法时,未突出显示的代码行(=无预处理器代码)没有被着色,这是预期的。但是这些行的颜色是黑色。
那么,“HighlightingColorizer”是否在开始着色之前重置了整个文档的所有先前高亮显示?
或者还可能有什么问题?如何正确级联两个“HighlightingColorizers”?

8
我曾经使用过 AvalonEdit ,如果我没记错的话,当你应用另一个着色器时,它会重置所有高亮显示。解决此问题的最佳方法是尝试将第二个语法嵌入第一个语法中,如果失败,您必须修改 AvalonEdit 的代码库以更改其如何解释和重新应用配色方案。后者可能不容易实现,因为我认为它并不像注释“reset”之类的东西那么简单。 - Abdul Hfuda
7
@Xeno在这里是对的。如果你不想使用XML定义文件,你肯定需要编辑代码库。然而,我不确定为什么你不想这样做-它们可以尽可能长并用于着色最小的细节。我刚刚写了一个文件来嵌入SQL执行类似的操作;它很快速并且工作得很好... - MoonKnight
1个回答

7
问题在于HighlightingColorizer没有直接存储对DocumentHighlighter的引用,而是通过TextView.Services进行存储。这样做是为了允许将相同的着色器附加到多个编辑器上,以便每个编辑器都有自己的DocumentHighlighter
当您附加第二个着色器时,它会覆盖服务容器中存储的IHighlighter;这两个着色器最终都使用新的高亮显示器。
此外,请注意,HtmlClipboard中的“复制到剪贴板”逻辑直接访问IHighlighter服务,而不使用任何着色器。(将文本复制到Word仅保留语法突出显示,不包括折叠标记等其他转换)
解决此问题基本上有两种方法:
1.不要将附加的高亮显示器存储为服务。您可以通过创建自己的HighlightingColorizer类的副本并在该类中使用一个字段而不是访问textView.Services来实现此目的。这是一种简单的更改,但是在将文本复制到剪贴板时将不使用其他高亮显示器。
2.创建一个IHighlighter实现,该实现将多个DocumentHighlighterHighlightedLine组合在一起。这是我们在SharpDevelop 5中使用的C#语义突出显示的方法,它作为扩展现有的基于.xshd的C#突出显示的附加高亮显示器。但是,这种方法很复杂(合并HighlightedLine在节的排序和嵌套约束下是非平凡的),并且需要对IHighlighter接口进行API更改,以处理OnHighlightStateChanged通知(AvalonEdit 4.x使用派生类嵌套在HighlightingColorizer中以访问此回调;AvalonEdit 5.0将使用事件)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接