gpt4 book ai didi

c# - AvalonEdit:级联高亮着色器

转载 作者:IT王子 更新时间:2023-10-29 03:42:54 26 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

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

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

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

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

关于c# - AvalonEdit:级联高亮着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8992137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com