Какое событие будет вызвано, если текущий показанный текстовый редактор будет изменен - PullRequest
0 голосов
/ 15 января 2020

Я кодирую расширение Visual Studio в Visual Studio 2019, которое должно показывать лампочки с предложениями кода из файла .xml.

Моя текущая проблема в том, что я не могу найти событие, которое возникает, если изменяются отображаемые в данный момент файлы текстовых редакторов (.cs). Я был бы рад, если кто-то знает учебник или может сказать мне, как и где мне нужно вызвать событие и как оно запускается.

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Решено с помощью 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>;
    }
}
0 голосов
/ 15 января 2020

Возможно, вы ищете примеры функций анализатора и исправления кода. Вы можете найти lightbulb пример на GitHub; конечно, он нацелен на Visual Studio 2017, но также должен работать и для более новой версии. Например, см. https://github.com/microsoft/VSSDK-Extensibility-Samples/tree/master/LightBulb

Как видно из примера проекта, вам потребуется ISuggestedActionsSourceProvider, ISuggestedActionsSource и хотя бы одна ISuggestedAction реализация это выполнит предложенное исправление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...