2

我有一个 MS Visual Studio 编辑器的扩展,它为 C++ 添加了一些语法高亮。

我想确保提供的 SnapshotSpan 具有标准分类类型(“评论”)。做这件事有很多种方法:

1 . 我可以手动解析 C++ 代码以查找注释范围。这是我想使用的最后一个选项:)

2 . 我可以使用黑客:

this.colorer = buffer.Properties.PropertyList // <-- buffer is a ITextBuffer
    .Select(p => p.Value as IClassifier) // Get all classifiers someone put into the properies of the current text buffer
    .Where(i => i != null)
    .Where(i => i.GetType().FullName == "Microsoft.VisualC.CppColorer") // <-- Hack
    .FirstOrDefault();

现在我可以通过以下方式使用这个着色器(这是 C++ 分类器的内部 Microsoft 实现):

this.colorer.GetClassificationSpans(span)
    .Where(s => s.ClassificationType.Classification == FormatNames.Comment ||
                s.ClassificationType.Classification == FormatNames.XmlDocComment)

多田!我有关于文本缓冲区中注释的信息。如您所知,这是一种黑客行为,我想避免这种情况:)

3 . 我可以尝试(以某种方式)获取标准分类类型的分类器(例如,用于“评论”)。


所以我的问题是:这是否可以通过分类类型名称获取 IClassifier ?

4

2 回答 2

2

您可以导入IClassifierAggregatorService

[Import]
internal IClassifierAggregatorService classifierAggregatorService = null;

然后迭代ClassificationSpan检查每个分类跨度是否为 type "comment"

IClassifier classifier = classifierAggregatorService.GetClassifier(textBuffer);
IList<ClassificationSpan> classificationSpanList = _classifier.GetClassificationSpans(span);
foreach (ClassificationSpan classificationSpan in classificationSpanList)
{
    if (classificationSpan.ClassificationType.IsOfType("comment"))
    {
        // ...
    }
}

作为获取 的替代方法IClassifierAggregatorService,您可以获取ITagAggregator<IClassificationTag>from IBufferTagAggregatorFactoryService。如果您想根据以前的分类添加分类,则特别有用(请参阅此答案)。

于 2015-03-27T22:20:52.077 回答
1

看起来没有官方的方法可以做到这一点。所以我自己实现了代码注释的分类器。

于 2013-10-03T16:39:05.293 回答