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
引用。