67

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

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

当我调试ColorizeLine第二行转换器的 - 方法时,未突出显示的代码(= 无预处理器代码)的行没有像预期的那样被着色。但是线条的颜色是黑色的。

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

或者还有什么问题?我怎样才能正确级联 2 HighlightingColorizers

4

1 回答 1

7

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

当您附加第二个着色器时,它会覆盖IHighlighter存储在服务容器中的内容;并且两个着色器最终都使用了新的荧光笔。

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

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

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

  2. 创建一个IHighlighter组合HighlightedLine多个DocumentHighlighters 的实现。这是我们在 SharpDevelop 5 中用于 C# 语义突出显示的方法,它用作扩展现有基于 .xshd 的 C# 突出显示的附加荧光笔。但是,这种方法很复杂(考虑到部分的排序和嵌套约束,合并HighlightedLines 并非易事),并且需要对IHighlighter接口进行 API 更改以处理OnHighlightStateChanged通知(AvalonEdit 4.x 使用嵌套在HighlightingColorizer访问此回调;AvalonEdit 5.0 将使用事件)。

于 2012-10-18T17:51:28.420 回答