AvalonEdit:级联HighlightingColorizers


67

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

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

在调试ColorizeLine第二个线路转换器的-method时,未突出显示的代码(=没有预处理程序代码)的行没有按预期着色。但是线条的颜色是黑色的。

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

还是其他问题?如何正确地级联2 HighlightingColorizers


8
我与AvalonEdit-和IIRC进行了一些合作,当您应用其他着色器时,它会重置所有突出显示。解决此问题的最佳方法是重新尝试将第二种语法嵌入到第一种语法中,否则您将不得不与AvalonEdit的代码库混淆,以更改其解释和重新应用配色方案的方式。后者可能是不平凡的,因为我认为它不会像“评论重置”那样简单。
Abdul Hfuda 2012年

7
@Xeno就在这里。如果您不想使用XML定义文件,则一定要编辑代码库。但是,我不确定为什么您不想这样做-它们可以根据需要设置,并且可以用于为缩小的细节着色。我刚刚编写了一个文件,用嵌入式SQL做一些事情。它很快而且效果很好...
MoonKnight 2012年

Answers:


6

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

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

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

本质上有两种方法可以解决此问题:

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

  2. 创建IHighlighterHighlightedLine多个DocumentHighlighters相结合的实现。这是我们在SharpDevelop 5中用于C#语义突出显示的方法,它用作扩展现有的基于.xshd的C#突出显示的附加突出显示器。但是,这种方法很复杂(HighlightedLine鉴于各节的排序和嵌套约束,合并s是不平凡的),并且需要对IHighlighter接口进行API更改才能处理OnHighlightStateChanged通知(AvalonEdit 4.x使用嵌套在其中的派生类HighlightingColorizer以获得对该回调的访问; AvalonEdit 5.0将使用一个事件)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.