使用新的分类标记器扩展 Visual Studio 编辑器

Visual Studio 扩展可以对文档的语法进行分类,以便相应地对文本进行着色,这是通过贡献返回 ClassificationTag 值的标记器来实现的。

扩展 Visual Studio 编辑器与新标记者 一文中,可以找到如何提供标记者的详细说明。

为了提供分类功能,我们首先实现一个标记器提供者和一个标记器。

[VisualStudioContribution]
internal class MyClassificationTaggerProvider :
    ExtensionPart,
    ITextViewTaggerProvider<ClassificationTag>,
    ITextViewChangedListener
{
    ...
internal class MyClassificationTagger :
    TextViewTagger<ClassificationTag>
{
    ...

由于我们希望文档着色尽快完成,因此生成标记器需要非常快。 本文 强调了重要性:

  • 仅生成所请求文档部分(或它的小型超集)的标记,而不是整个文档;
  • 避免分析整个文档以生成标记。

标记器结构准备就绪并实现特定文件格式的语法分析后,标记器可以通过使用可用ClassificationType已知值创建ClassificationTag值以及调用UpdateTagsAsync来提供文本分类。

List<TaggedTrackingTextRange<ClassificationTag>> tags = new();
List<TextRange> ranges = new();

...

ranges.Add(new(document, lineStart, lineLength));
tags.Add(
    new TaggedTrackingTextRange<ClassificationTag>(
        new TrackingTextRange(
            document,
            tagStartPosition,
            tagLength,
            TextRangeTrackingMode.ExtendNone),
        new ClassificationTag(ClassificationType.KnownValues.Operator)));

...

await this.UpdateTagsAsync(ranges, tags, CancellationToken.None);

目前,VisualStudio.Extensibility 尚不支持为新分类类型定义文本颜色,因此我们必须使用现有的分类类型(ClassificationType.KnownValues)。

VisualStudio.Extensibility in-proc extension,可以使用 ClassificationTypeDefinition 来定义新的分类类型。 其名称可以使用ClassificationType.Custom引用。