如果当前显示的文本编辑器发生变化,将引发什么事件

What event will be raised, if the current shown texteditor is changed

我正在 Visual Studio 2019 年编写一个 Visual Studio 扩展,它应该显示 .xml 文件中带有代码建议的灯泡。

我目前的问题是,我找不到在当前显示的文本编辑器 (.cs) 文件发生变化时引发的事件。如果有人知道教程或者可以告诉我如何以及在何处调用事件以及它如何触发,我会很高兴。

您可能正在寻找分析器和代码修复功能的示例。您可以在 GitHub 上找到 lightbulb 示例;当然,它针对的是 Visual Studio 2017,但也应该适用于较新的版本。例如,参见 https://github.com/microsoft/VSSDK-Extensibility-Samples/tree/master/LightBulb

正如您在示例项目中看到的那样,您需要一个 ISuggestedActionsSourceProvider、一个 ISuggestedActionsSource 和至少一个 ISuggestedAction 实现来执行建议的修复。

ITagger 解决了它。

internal class TodoTagger : ITagger<TodoTag>
{
    private IClassifier m_classifier;
    private const string m_searchText = "todo";

    internal TodoTagger(IClassifier classifier)
    {
        m_classifier = classifier;
    }

    IEnumerable<ITagSpan<TodoTag>> ITagger<TodoTag>.GetTags(NormalizedSnapshotSpanCollection spans)
    {
        foreach (SnapshotSpan span in spans)
        {
            //look at each classification span \
            foreach (ClassificationSpan classification in m_classifier.GetClassificationSpans(span))
            {
                //if the classification is a comment
                if (classification.ClassificationType.Classification.ToLower().Contains("comment"))
                {
                    //if the word "todo" is in the comment,
                    //create a new TodoTag TagSpan
                    int index = classification.Span.GetText().ToLower().IndexOf(m_searchText);
                    if (index != -1)
                    {
                        yield return new TagSpan<TodoTag>(new SnapshotSpan(classification.Span.Start + index, m_searchText.Length), new TodoTag());
                    }
                }
            }
        }
    }

    public event EventHandler<SnapshotSpanEventArgs> TagsChanged;
}


[Export(typeof(ITaggerProvider))]
[ContentType("code")]
[TagType(typeof(TodoTag))]
class TodoTaggerProvider : ITaggerProvider
{
    [Import]
    internal IClassifierAggregatorService AggregatorService;

    public ITagger<T> CreateTagger<T>(ITextBuffer buffer) where T : ITag
    {
        if (buffer == null)
        {
            throw new ArgumentNullException("buffer");
        }

        return new TodoTagger(AggregatorService.GetClassifier(buffer)) as ITagger<T>;
    }
}