AvalonEdit:级联HighlightingColorizers

0xD*_*EEF 67 .net c# avalonedit

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

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

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

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

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

Dan*_*iel 6

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

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

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

解决此问题基本上有两种方法:

  1. 请勿将其他荧光笔存储为服务.您可以通过创建自己的HighlightingColorizer类副本来完成此操作,并使用该类中的字段而不是访问textView.Services.这是一个简单的更改,但在将文本复制到剪贴板时不会使用其他荧光笔.

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