2011-01-13 11 views
1

Ich versuche ein neues Makro zu erstellen, das den aktuell ausgewählten Text übernimmt und geschweifte Klammern um ihn legt (nachdem ich einen Zeilenumbruch gemacht habe), während ich natürlich nach Bedarf einrücken kann."New Scope" -Makro für Visual Studio

zum Beispiel also, wenn der Benutzer des x = 0; Code wählt und führt das Makro in dem folgenden Code:

if (x != 0) x = 0; 

Es sollte in drehen:

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

(Snippets nicht helfen hier, weil dies auch für nicht unterstützten Quellcode funktionieren muss.)

Könnte mir jemand helfen herauszufinden, wie man die Einrückung und die Zeilenumbrüche richtig macht? Dies ist, was ich habe:

Public Sub NewScope() 
    Dim textDoc As TextDocument = _ 
       CType(DTE.ActiveDocument.Object("TextDocument"), TextDocument) 
    textDoc.??? 
End Sub 

aber wie finde ich die aktuelle Einrückung und einen Zeilenumbruch?

+0

... wirklich? Ich kann nicht glauben, dass ich ein Tumbleweed-Abzeichen dafür bekommen habe, lol ... es scheint ziemlich einfach zu sein. Hoffe, das Kopfgeld hilft. :) – Mehrdad

+0

Ich weiß, dass dies Ihre Frage nicht beantwortet, aber mit Resharper, falls jemand sich wundern wird - dies geschieht durch Strg + E + U, 7 (Surround With {}) –

Antwort

2
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 
+0

Ah, danke, es tut genau das, was ich wollte. Eine andere Frage (obwohl diese nicht so wichtig ist): Gibt es einen Weg, dies zu tun * ohne * den Puffer rückgängig zu machen? – Mehrdad

+0

Das, denke ich, ist –

+1

Ich vermute, dass Sie den Puffer nicht ungeschehen lassen wollen, sondern die Effekte Ihres Makros in einem Schritt rückgängig machen wollen (anstatt für jede Textaktion Strg + Z zu drücken) Makro ausgeführt). Öffnen Sie in diesem Fall ein [UndoContext] (http://msdn.microsoft.com/en-us/library/envdte.undocontext%28v=VS.90%29.aspx), wenn Ihr Makro startet und Schließen Sie es, bevor es beendet wird, dann können Sie Ihr Makro rückgängig machen, indem Sie Strg + Z nur einmal drücken. –

0

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

Natürlich ist die Menge an \ t, bevor die {und} und Die Auswahl hängt von der aktuellen Einrückung ab.

Da zwischen ausgewählten Text- und Dokumentdaten ein Unterschied besteht, ist es schwierig herauszufinden, wo sich der Cursor innerhalb der Dokumentdaten befindet (zumindest in Outlook).

Der einzige Weg, wie ich dies in Outlook herausgefunden habe, ist, die Auswahl tatsächlich rückwärts zu bewegen, bis ich Text, den ich brauchte, hatte, aber das führte zu unerwünschten Effekten.

Versuchen Sie, die Auswahl zu starten, und verwenden Sie diese Position im Dokumenttext, indem Sie diese Zeile betrachten und die Anzahl der Registerkarten ermitteln.

Ich würde denken, dass es in VStudio keine Formatierungszeichen geben würde.

+0

Die Frage wörtlich gesagt, "* wie Ich finde den aktuellen Einzug und mache eine neue Zeile * "? Entschuldigung, aber Ihre Antwort sagt mir nicht wirklich, wie ich den aktuellen Einzug herausfinden und einen Zeilenumbruch um den gleichen Betrag einrücken lassen soll. :( – Mehrdad