我正在尝试使用基于Noah Richards的diff着色示例的VS2010的新语法着色功能。目标是为SpecFlow (http://www.specflow.org)创建语法着色。
在我的例子中,查找语法元素相当复杂,而且不是行级的。因此,当我实现GetClassificationSpans时,我不想重新解析整个文件,而是获取更改后的文本的开头状态,并从这一点开始解析内容。
我想我可以得到之前的分类为ClassificationTags。我使用IBufferTagAggregatorFactoryService类做到了这一点。
它是有效的,但我不确定这是否是最好的方法。我是应该只为整个分类器类创建标签聚合器,还是可以在每次调用GetClassificationSpans时创建它?我应该创建一个特殊的标签来记住解析状态吗?
也许这无论如何都不是正确的方法,我也对其他的建议感兴趣。
Br,Gaspar
编辑:我在主题中找到了一个很好的系列文章:http://www.hill30.com/MikeFeingoldBlog/index.php/2009/07/31/django-editor-in-vs-2010-part-1-colors/
发布于 2010-07-02 02:15:49
从本质上讲,您必须自己记住状态。大多数VS语言服务在文本更改时更新的每一行的开头都保留了一个状态cookie。
在任何时候,获取分类(通过分类器聚合器或标签聚合器)都会导致对当前分类器/标记器的调用,因此它不会返回任何类型的缓存状态(或“最后”返回的分类)。编辑器并不真正缓存这些信息,只是充当分类器提供给要格式化的可见行的信息的传递通道。
此外,如果您从分类器(由IClassifierProvider或ITaggerProvider提供)执行此操作,您将陷入一些糟糕的递归,特别是当您的分类器通过调用聚合器来响应GetClassificationSpans时(聚合器随后会回调到您的分类器以获取一些较早的文本,等等)。如果您的分类器需要使用其他分类才能正常工作(而不是它自己的分类),那么编写它的唯一安全方法是:
ITagger<IClassificationTag>,并从IViewTaggerProvider.IBufferTagAggregatorFactoryService的IDisposable,但仅在您的标记器上提供标签聚合器,并在Dispose().中处置标签聚合器
https://stackoverflow.com/questions/3155598
复制相似问题