11

我想让 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 自动完成最后一步?

4

3 回答 3

6

你的问题让我想到如果这个功能存在该有多酷。幸运的是,在 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
于 2009-01-03T00:03:24.773 回答
3

我不认为这是可能的。但是,您可以配置哪些 HTML 标记将自动关闭:

工具 -> 选项 -> 文本编辑器 -> HTML -> 格式 -> “标签特定选项”按钮 -> 客户端 HTML 标签 -> em -> 结束标签 -> 无结束标签

还请考虑自动移动结束标记并非微不足道(单词边界应该是什么?)并且它只涵盖一个非常特殊的用例(例如应该突出显示一个单词)。

于 2009-01-02T16:09:57.630 回答
2

支持@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
于 2009-01-05T18:45:21.043 回答