11

Visual Studio で、オートコンプリートされた終了タグを 1 語 (またはそれ以上) 右に移動させたいと考えています。たとえば、次の 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 -> 終了タグ -> 終了タグなし

また、終了タグを自動的に移動することは簡単ではなく (Word の境界はどうすればよいでしょうか?)、非常に特殊な使用例 (たとえば、1 つの Word のみを強調表示する必要があります) のみをカバーすることも考慮してください。

于 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 に答える