Как переместить автозаполненный закрывающий тег в Visual Studio

Я хочу, чтобы Visual Studio переместил автозаполненный закрывающий тег слово (или больше) вправо. Например, учитывая следующий HTML:

<p>I need to emphasize some text.</p>

Если я набираю <em> перед словом "подчеркивать", Visual Studio автоматически завершает работу:

<p>I need to <em></em>emphasize some text.</p>

Затем мне нужно переместить закрывающий </em>, чтобы получить то, что я хочу:

<p>I need to <em>emphasize</em> some text.</p>

Есть ли способ сделать Visual Studio сделать этот последний шаг автоматически?

Ответ 1

Ваш вопрос заставил меня подумать, насколько здорово было бы, если бы эта функциональность существовала. К счастью, это было довольно просто реализовать как макрос в VS. Ниже приведен код макроса. Вы можете легко привязать это к CTRL + ALT + Right, используя инструмент настройки в VS.

( Примечание: я просто быстро бросил это вместе с тем, что он в пятницу вечером)

Sub MoveClosingTag()
    Dim ts As EnvDTE.TextSelection = CType(DTE.ActiveDocument.Selection(), EnvDTE.TextSelection)
    Dim start As EditPoint = ts.ActivePoint.CreateEditPoint()
    Dim tag As String

    ts.WordRight(True)
    If ts.Text = "</" Then
        Do Until ts.ActivePoint.AtEndOfLine
            ts.CharRight(True)
            If ts.Text.EndsWith(">") Then Exit Do
        Loop
        tag = ts.Text
        If tag.EndsWith(">") Then
            ts.Delete()
            ts.WordRight(False)
            ts.Insert(tag, EnvDTE.vsInsertFlags.vsInsertFlagsCollapseToStart)
        Else
            ts.MoveToPoint(start)
        End If
    Else
        ts.MoveToPoint(start)
    End If
End Sub

Ответ 2

Я не думаю, что это возможно. Однако вы можете настроить, какие теги HTML будут автоматически закрыты:

Инструменты → Параметры → Текстовый редактор → HTML → Формат → Кнопка "Специальные теги" → Клиентские HTML-теги → em → Закрывающий тег → Без закрытия тега

Также учтите, что автоматическое перемещение закрывающего тега не является тривиальным (что должно быть границей Word?), и оно будет охватывать только очень специальный прецедент (только одно слово должно быть, например, выделено).

Ответ 3

Подходит для @w4g3n3r для выполнения тяжелой работы. Я немного изменил макрос, чтобы лучше играть с пробелами.

Примечание. Я считаю, что CTRL+. прекрасно работает как клавиша быстрого доступа для этого; правый правый палец уже на кнопке . в используемом случае, который я изначально описал.

Sub MoveClosingTag()
    Dim ts As EnvDTE.TextSelection = CType(DTE.ActiveDocument.Selection(), EnvDTE.TextSelection)
    Dim start As EditPoint = ts.ActivePoint.CreateEditPoint()
    Dim tag As String

    ts.WordRight(True)
    If ts.Text = "</" Then
        Do Until ts.ActivePoint.AtEndOfLine
            ts.CharRight(True)
            If ts.Text.EndsWith(">") Then Exit Do
        Loop
        tag = ts.Text
        If tag.EndsWith(">") Then
            ts.Delete()
            Dim pos As Integer
            pos = ts.CurrentColumn
            ts.FindPattern(">", vsFindOptions.vsFindOptionsRegularExpression)
            If ts.CurrentColumn = pos Then
                ts.WordRight(False)
                ts.FindPattern(">", vsFindOptions.vsFindOptionsRegularExpression)
            End If
            ts.Insert(tag, EnvDTE.vsInsertFlags.vsInsertFlagsCollapseToStart)
        Else
            ts.MoveToPoint(start)
        End If
    Else
        ts.MoveToPoint(start)
    End If
End Sub