如何在Visual Studio中移动自动完成结束标记

时间:2009-01-02 15:54:39

标签: html visual-studio autocomplete

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

工具 - &gt;选项 - &gt;文字编辑器 - &gt; HTML - &gt;格式 - &gt; “标签特定选项”按钮 - &gt;客户端HTML标记 - &gt; em - &gt;结束标记 - &gt;没有结束标签

另请注意,自动移动结束标记并不简单(Word边界应该是什么?),它只包含一个非常特殊的用例(例如,只应突出显示一个Word)。

答案 2 :(得分: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