Compartilhar via


Ampliando o editor do Visual Studio com um novo marcador de classificação

Uma extensão do Visual Studio pode classificar a sintaxe de um documento, permitindo que o texto seja colorido adequadamente, o que é obtido contribuindo com um tagger que retorna os valores de ClassificationTag.

Uma descrição detalhada de como fornecer um tagger pode ser encontrada no artigo Extending Visual Studio editor with a new tagger.

Para fornecer classificação, primeiro implementamos um provedor de marcação e um tagger:

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

Como queremos que a colorização do documento apareça o mais rápido possível, a geração de marcadores precisa ser o mais rápida possível. Este artigo destaca a importância de:

  • gerando apenas marcas para a parte do documento solicitada (ou um pequeno superconjunto dele), não o documento inteiro;
  • evitar a análise de todo o documento para gerar etiquetas.

Depois que a estrutura do tagger estiver pronta e a análise de sintaxe para o formato de arquivo específico for implementada, o tagger poderá fornecer classificação de texto, criando ClassificationTag valores usando os valores de conhecimento disponíveis ClassificationType e chamando 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);

No momento, o VisualStudio.Extensibility ainda não dá suporte à definição de cores de texto para novos tipos de classificação, portanto, devemos usar tipos de classificação existentes (ClassificationType.KnownValues).

A extensão in-proc VisualStudio.Extensibility pode usar ClassificationTypeDefinition para definir novos tipos de classificação. O nome deles pode ser referenciado usando ClassificationType.Custom.