Как переместить автозаполненный закрывающий тег в 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