- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想级联 AvalonEdit 的 SyntaxHighlighting Engine。我有 2 个 HighlightingDefinitions
。第一个是主要语法。第二个是复杂的多行预处理器标记语言。由于这个原因,将第二个语法嵌入到第一个语法中太复杂了。更简单的方法是呈现第一种语法,然后更改受影响的行部分(基于第二种语法)。
所以我用第二种语言实例化了一个新的 HighlightingColorizer
并将其添加到 LineTransformers
中。但是第二种语言将整个文档着色,而不仅仅是带有预处理器指令的行部分:非预处理器代码为黑色。
当我调试第二行转换器的 ColorizeLine
方法时,未突出显示的代码行(= 没有预处理器代码)没有像预期的那样被着色。但是线条的颜色是黑色。
HighlightingColorizer
是否会在开始着色之前重置整个文档之前的所有突出显示?
或者还有什么问题?如何正确级联 2 个 HighlightingColorizers
?
最佳答案
问题是 HighlightingColorizer
不直接存储对 DocumentHighlighter
的引用,而是通过 TextView.Services
存储它。这样做是为了允许将相同的着色器附加到多个编辑器,以便每个编辑器都有自己的 DocumentHighlighter
。
当您附加第二个着色器时,它会覆盖存储在服务容器中的 IHighlighter
;并且两个着色器最终都使用了新的荧光笔。
另请注意,HtmlClipboard
中的“复制到剪贴板”逻辑直接访问IHighlighter
服务,它不使用任何着色器。 (将文本复制到 Word 仅保留语法突出显示,没有折叠标记等其他转换)
基本上有两种方法可以解决这个问题:
不要将附加荧光笔存储为服务。为此,您可以创建自己的 HighlightingColorizer
副本,并使用该类中的字段而不是访问 textView.Services
。这是一个简单的更改,但在将文本复制到剪贴板时不会使用额外的荧光笔。
创建一个 IHighlighter
实现,它结合了来自多个 DocumentHighlighter
的 HighlightedLine
。这是我们在 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/
我是一名优秀的程序员,十分优秀!