VS.NET Macro To Group and Sort Your Using Statements
Also see: The NCAA and the Hoosiers
I try to follow a coding standard for organizing my using statements. System.* goes at the top and then other namespaces grouped together like this:
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Web; using System.Web.Script.Services; using System.Web.Services; using System.Web.Services.Protocols; using Microsoft; using Microsoft.CSharp; using MyCompany; using MyCompany.Web;
.csharpcode,.csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode.rem { color: #008000; }
.csharpcode.kwrd { color: #0000ff; }
.csharpcode.str { color: #006080; }
.csharpcode.op { color: #0000c0; }
.csharpcode.preproc { color: #cc6633; }
.csharpcode.asp { background-color: #ffff00; }
.csharpcode.html { color: #800000; }
.csharpcode.attr { color: #ff0000; }
.csharpcode.alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode.lnum { color: #606060; }
I finally got tired enough of keeping this all sorted out that I made a VS.NET macro to do it for me. This macro will take the current selection, parse it for using statements, group and sort them like the above example.
Also see: Mix 08 Sessions Published
Also see: VS.NET Macro To Group and Sort Your Using Statements
Here’s the macro code:
Dim _usingPattern As Regex = New Regex( _
"\s*(?<using>using\s*(?<group>\w+)[^;]*);", _
RegexOptions.IgnoreCase _
Or RegexOptions.Multiline _
Or RegexOptions.ExplicitCapture _
Or RegexOptions.CultureInvariant _
Or RegexOptions.Compiled _
)
Public Sub SortUsing()
If Not DTE.ActiveDocument Is Nothing Then
Dim sel As TextSelection = DTE.ActiveDocument.Selection
If sel.Text.Contains(vbCrLf) Then
If sel.ActivePoint Is sel.BottomPoint Then sel.SwapAnchor()
sel.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn, True)
sel.SwapAnchor()
sel.EndOfLine(True)
Dim groups As New SortedList(Of String, List(Of String))()
For Each match As Match In _usingPattern.Matches(sel.Text)
Dim u As String = match.Groups("using").Value
Dim g As String = match.Groups("group").Value
' System usings sort at the top
If g = "System" Then g = "_" + g
Dim list As List(Of String)
If Not groups.TryGetValue(g, list) Then
list = New List(Of String)()
groups.Add(g, list)
End If
list.Add(u)
Next
Dim builder As New StringBuilder()
For Each group As KeyValuePair(Of String, List(Of String)) In groups
If builder.Length > 0 Then builder.AppendLine()
group.Value.Sort()
For Each line As String In group.Value
builder.Append(line)
builder.AppendLine(";")
Next
Next
sel.DeleteLeft()
sel.Insert(builder.ToString())
End If
End If
End Sub
.csharpcode,.csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode.rem { color: #008000; }
.csharpcode.kwrd { color: #0000ff; }
.csharpcode.str { color: #006080; }
.csharpcode.op { color: #0000c0; }
.csharpcode.preproc { color: #cc6633; }
.csharpcode.asp { background-color: #ffff00; }
.csharpcode.html { color: #800000; }
.csharpcode.attr { color: #ff0000; }
.csharpcode.alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode.lnum { color: #606060; }
Also see: Silverlight 2 DataGrid walk-through posted
Also see: C# 3.0 Lambdas and Type Inference
http://weblogs.asp.net/dfindley/archive/2007/02/07/vs-net-macro-to-group-and-sort-your-using-statements.aspx