【问题标题】:AvalonEdit: Cascading HighlightingColorizersAvalonEdit:级联 HighlightingColorizers
【发布时间】:2012-02-18 00:18:27
【问题描述】:

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

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

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

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

或者还有什么问题?如何正确级联 2 HighlightingColorizers

【问题讨论】:

  • 我在 AvalonEdit 和 IIRC 上做了一些工作,当您应用另一个着色器时,它确实会重置所有突出显示。解决这个问题的最好方法是重新尝试在第一个语法中嵌入第二个语法 - 否则您将不得不弄乱 AvalonEdit 的代码库以更改它解释和重新应用配色方案的方式。后者可能不是微不足道的,因为我认为它不会像“评论重置”或类似的东西那么容易。
  • @Xeno 就在这里。如果您不想使用 XML 定义文件,您肯定必须编辑代码库。但是,我不确定您为什么不想这样做 - 它们可以根据您的需要进行,并且可以用于为缩小的细节着色。我刚刚编写了一个文件来使用嵌入式 SQL 做类似的事情;它速度快,效果很好......

标签: c# .net avalonedit


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 2011-04-28
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多