Я хочу, чтобы 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 автоматически выполнять этот последний шаг?






Я не думаю, что это возможно. Однако вы можете настроить, какие HTML-теги будут закрыты автоматически:
Инструменты -> Параметры -> Текстовый редактор -> HTML -> Формат -> кнопка «Параметры тега» -> Клиентские HTML-теги -> em -> Закрывающий тег -> Нет закрывающего тега
Также учтите, что автоматическое перемещение закрывающего тега не является тривиальным (какой должна быть граница Word?), И оно будет охватывать только очень особый вариант использования (например, должно быть выделено только одно слово).
На самом деле я бы предпочел что-то вроде CTRL + стрелки вправо, которая перемещала бы закрывающий тег на одно слово вправо. Таким образом, вы можете делать это столько раз, сколько нужно ...
@ Хью: Да, это тоже было бы круто. Я действительно пробовал это, чтобы увидеть, сработает ли это.
Ваш вопрос заставил меня задуматься, как было бы здорово, если бы эта функция существовала. К счастью, это было довольно просто реализовать как макрос в 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
Благодарим @ 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
Интересно, но я обнаружил, что это не удается, когда встречается а). У меня был). <br/> в качестве конца строки, и когда я перемещаю тег <p> вправо, он оказывается внутри элемента br, например: <br </p> />
Было бы неплохо, если бы была функция типа рефакторинга HTML, чтобы вы могли выбрать то, что хотите, внутри тегов, а затем выбрать «обернуть» желаемым тегом.