我正在尝试使用基于Noah Richards的diff着色样本的VS2010的新语法着色功能。目标是为SpecFlow(http://www.specflow.org)创建语法着色。
就我而言,找到语法元素相当复杂而不是行级。因此,当我实现GetClassificationSpans时,我不想重新解析整个文件,而是采取更改文本开头的状态并从该点解析内容。
我认为我可以将以前的分类作为ClassificationTags。我是使用IBufferTagAggregatorFactoryService类完成的。
它有效,但我不确定这是否是最好的方法。我应该只为整个分类器类创建标签聚合器,还是每次调用GetClassificationSpans时都可以创建它?我应该创建一个特殊的标签来记住解析状态吗?
也许这不是正确的方法,我也对其他建议感兴趣。
BR, 加斯帕尔
编辑:我在主题中发现了一篇很好的文章系列:http://www.hill30.com/MikeFeingoldBlog/index.php/2009/07/31/django-editor-in-vs-2010-part-1-colors/
答案 0 :(得分:4)
基本上,你必须自己记住这个状态。大多数VS语言服务都会为文本更改时更新的每一行的开头保留一个状态cookie。
在任何时候,获取分类(通过分类器聚合器或标记聚合器)将始终导致对当前分类器/标记器的调用,因此它不会返回任何类型的缓存状态(或“最后”)归类分类)。编辑器并没有真正缓存这些信息,只是对分类器提供给被格式化的可见行的信息进行愚蠢的传递。
另外,如果你是从分类器(由IClassifierProvider或ITaggerProvider提供)中进行的,那么你正在设置一些讨厌的递归,特别是如果你的分类器通过调用聚合器来响应GetClassificationSpans
(然后回调你的分类器中的一些早期文本,等等。如果您的分类器需要使用其他分类才能正常工作(而不是自己的分类),那么唯一安全的方法就是:
ITagger<IClassificationTag>
,并通过IViewTaggerProvider
提供。ITagAggregator<IClassificationTag>
抓取IBufferTagAggregatorFactoryService
,但只抓一次。IDisposable
并将代码聚合器置于Dispose()
。