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