开发者

"New Scope" Macro for Visual Studio

I'm trying to create a new macro that takes the currently selected text and puts curly braces around it (after making a newline), while, of course, indenting as needed.

So, for example, if the user selects the code x = 0; and runs the macro in the following code:

if (x != 0) x = 0;

It should turn into:

if (x != 0) 
{
    x = 0;
}

(Snippets don't help here, because this also needs to work for non-supported source code.)

Could someone help me figure out how to do the indentation and the newlines correctly? This is what I have:

Public Sub NewScope()
    Dim textDoc As TextDocument = _
                CType(DTE.ActiveDocument.Object("TextDocument"), TextDocument)
    textDoc.???
End Su开发者_开发百科b

but how do I figure out the current indentation and make a newline?


Sub BracketAndIndent()
    Dim selection = CType(DTE.ActiveDocument.Selection, TextSelection)

    ' here's the text we want to insert
    Dim text As String = selection.Text

    ' bracket the selection;
    selection.Delete()

    ' remember where we start
    Dim start As Integer = selection.ActivePoint.AbsoluteCharOffset

    selection.NewLine()
    selection.Text = "{"
    selection.NewLine()
    selection.Insert(text)
    selection.NewLine()
    selection.Text = "}"

    ' this is the position after the bracket
    Dim endPos As Integer = selection.ActivePoint.AbsoluteCharOffset

    ' select the whole thing, including the brackets
    selection.CharLeft(True, endPos - start)

    ' reformat the selection according to the language's rules
    DTE.ExecuteCommand("Edit.FormatSelection")
End Sub


textDoc.Selection.Text = "\n{\n\t" + textDoc.Selection.Text + "\n}\n"

Of course the amount of \t before the { and } and Selection depend on the current indention.

Since there is a difference between selected Text and Document data, it's hard to find out where the cursor is within the document's data (at least in Outlook it is).

The only way I figured out how to do this in Outlook is to actually move the selection backwards until I got text that I needed, but that resulted in undesirable effects.

Try taking the selection start, and using that position in the document text, looking at that line and getting the amount of tabs.

I would think there wouldn't be formatting characters in VStudio.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜