Как обрабатывать размер первой вкладки при форматировании?

Я создаю расширение, которое форматирует вкладки редактора по-своему, используя класс ITextParagraphPropertiesFactoryService. Все работает просто отлично, ожидайте того факта, что когда пользователь вводит новую строку, ITextParagraphPropertiesFactoryService не влияет на новую строку

Для упрощения проблемы я создаю новый проект MEF, добавляю такой провайдер формата

[Export(typeof(ITextParagraphPropertiesFactoryService))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal class ElasticTabstopsProvider : ITextParagraphPropertiesFactoryService
{
    /// <summary>
    /// Creates an ElasticTabstopsFormatters for
    /// the provided configuration.
    /// </summary>
    public TextParagraphProperties Create(IFormattedLineSource formattedLineSource, TextFormattingRunProperties textProperties, 
        IMappingSpan line, IMappingPoint lineStart, int lineSegment)
    {
        return new TextFormattingParagraphProperties(textProperties, 1);
    }
}

И он меняет ширину всех вкладок в моем редакторе на 1. Отлично! Это то, чего я хочу. Но теперь, когда я нажимаю Enter (новая строка), новый курсор устанавливается в разделе Main, однако я ожидаю, что ширина вкладки будет равна 1.

введите здесь описание изображения

После того, как я начинаю печатать, он переходит в ожидаемую позицию.

введите здесь описание изображения

Вопрос в том, как я могу установить размер вкладки пустой строки для новой строки? Я пытаюсь переопределить ISmartIndentProvider, но, похоже, игнорирую это значение.

Отладчик останавливается на точке останова в методе

int? GetDesiredIndentation(ITextSnapshotLine currentLine)

из ISmartIndent, но отступ остается неизменным независимо от того, какое значение я возвращаю...


person Arsen Mkrtchyan    schedule 30.09.2013    source источник


Ответы (1)


Есть как минимум две причины, по которым ваш отступ ISmartIndentProvider игнорируется:

Во-первых, в текущих языковых службах C# и VB есть много мест, где мы явно устанавливаем позицию каретки в ответ на определенные нажатия клавиш. Ввод — один из них. Вполне возможно, что в вашем сценарии мы явно задаем позицию. Если не считать отключения интеллектуальных отступов в меню «Инструменты» > «Параметры», вы ничего не можете сделать, чтобы переопределить это. Поскольку вы сказали, что получаете отладчик в своем ISmartIndentProvider, вероятно, проблема здесь.

Во-вторых, если вы пытаетесь определить ISmartIndentProvider для типа контента «текст», ваш не будет вызываться, если есть поставщик для конкретного языка. Уже есть еще один провайдер для «текста» (который вызывает старые языковые службы с прокладками), который в любом случае может победить вашего.

Честно говоря, если вы пытаетесь сделать что-то необычное, где вам не нужен автоматический отступ, вам действительно следует просто отключить его, чтобы убедиться, что он не мешает вам.

person Jason Malinowski    schedule 01.10.2013
comment
Спасибо, Джейсон, за ответ, чем я не вижу причины ISmartIndetProvider, он не работает даже в самом простом случае, но, тем не менее, не могли бы вы дать краткую подсказку, как изменить отступ табуляции на блокировку и обратно на смарт из кода ? - person Arsen Mkrtchyan; 01.10.2013
comment
Интерфейс существует, чтобы позволить языковым службам указывать, как они хотят, чтобы их отступы работали. Он не предназначен для того, чтобы расширения могли переопределять поведение языковых служб. API для изменения отступа для определенного языка: IVsTextManager.SetUserPreferences. Возможно, вы захотите покопаться в Интернете для использования, API немного странные. - person Jason Malinowski; 01.10.2013
comment
Я вижу, Джейсон, я проверю, отключил ли умный отступ, но я думаю, что это не мой случай, мне нужен отступ, но мне нужно установить его в правильное положение... есть ли какие-либо службы, чтобы установить текущую позицию самостоятельно? - person Arsen Mkrtchyan; 01.10.2013
comment
Вы всегда можете явно установить позицию каретки через API-интерфейсы редактора, но вам придется бороться с существующими языковыми службами. Если вы не отключите автоматический отступ, вы будете бороться с ним - изменение логики в том, как вы это делаете, абсолютно не поддерживается. - person Jason Malinowski; 01.10.2013
comment
Спасибо, Джейсон, это действительно здорово получить ответ от команды VS в SO на такой необычный вопрос, честно говоря, я не ожидал, что получу ответ..:) - person Arsen Mkrtchyan; 09.10.2013
comment
О, многие из нас смотрят Stack Overflow, чтобы получить ответы на вопросы, в которых у нас есть кое-какие знания. И, честно говоря, поскольку расширяемость Visual Studio не совсем хорошо документирована в мире, иногда единственный способ получить нужную информацию — через такие форумы как этот. - person Jason Malinowski; 09.10.2013