1

私が持っていた場合:

/// <summary>
/// My summary
/// </summary>
/// <param name='args'></param>

メソッドの上に貼り付けたクリップボードでは、次のstatic void Main(string[] args)ようになります。

class Program
{
    /// <summary>
    /// This is my summary
    /// </summary>
    /// <param name='args'></param>
    static void Main(string[] args)
    { 
    }
}

注:クリップボードにあるテキストにはインデントがありませんでした(左側に4つの空白)。貼り付けたところ、VisualStudioはインデントが必要であることがわかりました。

マクロでも同じことをしたいと思います。変数()に挿入したいテキストがあるので、クリップボードを使用したくありませんmyText。私は次のようなものを持っています:

Sub TemporaryMacro()

    Dim myText As String = "/// <summary>" _
    & vbCrLf & "/// My summary" _
    & vbCrLf & "/// </summary>" _
    & vbCrLf & "/// <param name='args'></param>"

    DTE.ActiveDocument.Selection.Text = myText

End Sub

そのマクロを実行すると、次のようになります。

class Program
{

    /// <summary>
    ///  <summary>
    ///  /// My summary
    ///  /// </summary>
    ///  /// <paramref name=" name='args'></param>"/></summary>
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {

    }
}

注:別の結果が得られます。


私も試しました:

Public Module RecordingModule
    Sub TemporaryMacro()

        Dim myText As String = "/// <summary>" _
        & vbCrLf & "/// My summary" _
        & vbCrLf & "/// </summary>" _
        & vbCrLf & "/// <param name='args'></param>"

        DTE.ActiveDocument.Selection.Insert(myText)

    End Sub
End Module

その結果:

class Program
{

    /// <summary>
/// My summary
/// </summary>
/// <param name='args'></param>
    static void Main(string[] args)
    {

    }
}

myTextクリップボードに置いて貼り付けることができることはわかっています。しかし、それは意味がありません。myTextクリップボードに配置せずに貼り付けた場合と同じ動作を実現するにはどうすればよいですか?

4

2 に答える 2

4

これを試しましたか (既に試したコードにタブ/インデントを追加するだけです)?

Public Module RecordingModule
    Sub TemporaryMacro()

        Dim myText As String = "/// <summary>" _
        & vbCrLf & vbTab &  "/// My summary" _
        & vbCrLf & vbTab &  "/// </summary>" _
        & vbCrLf & vbTab &  "/// <param name='args'></param>"

        DTE.ActiveDocument.Selection.Insert(myText)

    End Sub
End Module

ただし、このインデントは、さらに s を追加しない限り、より深いネストではそのままでは機能しません& vbTab &


また、現在の選択範囲を使用する代わりに (つまり、ドキュメントにカーソルを配置する必要があります)、特定のテキスト行を基準にして本文にテキストを配置しようとしましたか (static void Main(string[] args)この場合)?

あなた自身の回答で、この特定の文字列が常に必要なわけではなく、代わりにカーソルの配置が使用されることに注意してください。これはオプションであることを指摘したかっただけです。以下のコードを変更searchTextすると、挿入したテキストを好きな場所に配置できます。これは、カーソル位置のテキストを探すように変更することもできます。

この(テストされていない)コードの行に沿ったもの:

Dim objTextDoc As TextDocument
Dim objEditPt As EditPoint
Dim objMovePt As EditPoint
Dim docText As String
Dim docNewText As String

Dim myText As String = "/// <summary>" _
    & vbCrLf & vbTab &  "/// My summary" _
    & vbCrLf & vbTab &  "/// </summary>" _
    & vbCrLf & vbTab &  "/// <param name='args'></param>"

Dim searchText As String = "static void Main(string[] args)"

objTextDoc = DTE.ActiveDocument.Object("TextDocument")
objEditPt = objTextDoc.StartPoint.CreateEditPoint
objMovePt = objTextDoc.StartPoint.CreateEditPoint

' Get all text of active document
docText = objEditPt.GetText(objTextDoc.EndPoint)

objEditPt.StartOfDocument()
objMovePt.EndOfDocument()

' Set string as the new intended body of the text, inserting myText just above the Main line
docNewText = docText.Substring(0, InStr(docText, searchText) - 1) & myText & docText.Substring(docText.Length() - InStr(docText, searchText) + searchText.Length())

objEditPt.ReplaceText(objMovePt, docNewText, vsEPReplaceTextOptions.vsEPReplaceTextAutoformat)

(確認されてvsEPReplaceTextOptions.vsEPReplaceTextAutoformatいませんが)コードも自動インデントされると思います。

(詳細情報/アイデアについては、こちらを参照してください)

于 2012-08-14T13:28:07.027 に答える
0

最後に解決策を見つけました:

Dim myText As String = "/// <summary>" _
     & vbCrLf & "/// My summary" _
     & vbCrLf & "/// </summary>" _
     & vbCrLf & "/// <param name='args'></param>"

DTE.ActiveDocument.Selection.Insert(myText)

' how many characters where inserted?
' Trying myText.Length gives incorrect results because visual studio counts \r\n as one character so we 
' use the regex \r\n|. to try to find first \r\n as one match and any other character as another match
Dim insertLength As Integer = System.Text.RegularExpressions.Regex.Matches(myText, "(?>\r\n|.)").Count

' select the text that was just inserted
DTE.ActiveDocument.Selection.CharLeft(True, insertLength)

' here comes the magic!
DTE.ActiveDocument.Selection.SmartFormat()

編集

この回答が反対票を留保した理由を尋ねるために、この編集を行っています。質問のタイトルを参照すると、次のように尋ねられます。Visual studio macro to insert text like when pastingテキストを貼り付けると、カーソルの位置が重要になります。検索する必要はありませんstatic void Main(string[] args)。また、他の回答に賛成票を投じたので、助けに感謝します。もっと早く答えを知っていたら、この質問を報奨金に変えていたでしょう。

最後に、他の解決策は正しく機能しません...ページの上部にコメントがあるときにそのマクロを実行しても機能しません。それは私が賛成票を投じた理由です!

于 2012-08-14T14:16:29.177 に答える