如何在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中实现宏非常简单。下面是宏的代码。您可以使用VS中的自定义工具轻松将其绑定到CTRL + ALT + Right。
(注意:我只是把它扔得很快,因为它是星期五晚上)
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标记:
工具 - <!> gt;选项 - <!> gt;文字编辑器 - <!> gt; HTML - <!> gt;格式 - <!> gt; <!>;标记特定选项<!> quot;按钮 - <!> gt;客户端HTML标记 - <!> gt; em - <!> gt;结束标记 - <!> gt;没有结束标签
还请考虑自动移动结束标记并不简单(Word边界应该是什么?)并且它仅涵盖一个非常特殊的用例(例如,只应突出显示一个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
不隶属于 StackOverflow