Contents
At ComponentScience, we heartily embrace the use of regions to logically separate our code into meaningful blocks. After doing it manually for a couple of years, I decided to write myself a little macro to make my life easier. After a little research, I found a couple of examples of how to manipulate Visual Studio's code editor. The result is the following macro that I use to regionify my code.
I have also included instructions on how to install it into Visual Studio and assign it to a hotkey. I use Alt+R because it wasn't used in the Visual Studio text editor, and it made sense to me.
You are welcome to use it all you want, give it to your friends and even claim to have written it yourself if you want.
Note: I only use this macro in C# files. If you want to use it in VB, then you need to uncomment the VB sections and comment out the C# sections. If anybody has any tips on how to modify the script to detect the language being used, let me know and I will modify the script accordingly. I'm sure there is an easy way, I just haven't researched it because I don't care. The VB parts do work in VB code though. I tested it that much.
Update: After posting this article on CodeProject, I got some feedback from readers about how to test for the language being used, make the padding better, and handle tabs as well as spaces. I have updated the macro accordingly.
Even more update!: The users on CodeProject have done a wonderful job of tweaking the macro! We now have a really nice regioning macro. I am very happy with the feedback I have gotten from the CodeProject community. Special thanks (in no particular order) goes to RussKie, simonech, Hrusikesh, ERobishaw, isler-j, and SvenRieke. These guys embody the spirit of cooperative development.
Sub MakeRegion()
Regions.MakeRegion()
End Sub
Public Class Regions
Shared Sub MakeRegion()
Dim rName As String = ""
Dim pad As String = ""
Dim junk As String
Dim count, i As Integer
Dim startpoint, endpoint, tmppoint As EditPoint
With DTE.ActiveDocument.Selection
startpoint = .TopPoint.CreateEditPoint()
endpoint = .BottomPoint.CreateEditPoint
End With
If startpoint.EqualTo(endpoint) Then
Exit Sub
End If
If Not startpoint.AtStartOfLine Then
startpoint.StartOfLine()
End If
rName = InputBox("Region Name:", "Pick a name", _
GetDesc(DTE.ActiveDocument.Selection.TopPoint.CreateEditPoint()))
DTE.UndoContext.Open("Insert A Region")
Try
junk = startpoint.GetText(startpoint.LineLength)
pad = String.Empty
For count = 0 To junk.Length - 1
If junk.Substring(count, 1).Equals(" ") Or _
junk.Substring(count, 1).Equals(vbTab) Then
pad += junk.Substring(count, 1)
Else
Exit For
End If
Next
If DTE.ActiveDocument.Language = "CSharp" Then
startpoint.Insert(String.Format("{0}#region {1}{2}", _
pad, rName, vbCrLf))
If endpoint.LineLength = 0 Then
endpoint.Insert(String.Format("{0}#endregion // {1}{2}", _
pad, rName, vbCrLf))
Else
endpoint.Insert(String.Format("{0}#endregion // {1}{2}", _
vbCrLf & pad, rName, vbCrLf))
End If
Else
startpoint.Insert(String.Format("{0}#Region ""{1}""{2}", _
pad, rName, vbCrLf))
If endpoint.LineLength = 0 Then
endpoint.Insert(String.Format("{0}#End Region '{1}{2}", _
pad, rName, vbCrLf))
Else
endpoint.Insert(String.Format("{0}#End Region ' {1}{2}", _
vbCrLf & pad, rName, vbCrLf))
End If
End If
Finally
DTE.UndoContext.Close()
End Try
End Sub
Private Shared Function GetDesc(ByVal startpoint As EditPoint) As String
Dim line As String = ""
Dim tmppoint As EditPoint
line = startpoint.GetText(startpoint.LineLength)
If (line.Length > 0) Then
line = line.TrimStart(" ", vbTab)
If DTE.ActiveDocument.Language = "CSharp" Then
If (line.StartsWith("///")) Then
tmppoint = startpoint
tmppoint.LineDown()
line = GetDesc(tmppoint)
ElseIf (line.StartsWith("//")) Then
line = line.TrimStart("//", " ")
End If
line = line.Replace("{", String.Empty)
End If
line = line.TrimEnd(" ", vbTab)
End If
Return line
End Function
End Class
To install the macro, open up Visual Studio and follow these directions...
- Open up the Macro Explorer by pressing Alt+F8.
- Right-click on your MyMacros icon and select "New Module".
- Give the new module a meaningful name and save it.
- Right-click on the new module and select "New Macro".
- Replace "
Sub Macro1()
" through "End Sub
" with the code above.
- Save the macro file.
To assign the new MakeRegion macro to Alt+R:
- In Visual Studio, Click "Tools | Options" from the menu.
- Open the "Environment" page and select "Keyboard".
- Click [Save As…] and save the default keyboard mapping with a meaningful name. (You can't modify the default keyboard mapping.)
- In the "Show Commands Containing:" field, type "MakeRegion".
- Select the new MakeRegion macro from the list.
- In the "Use new shortcut in:" field, select "Text Editor".
- In the "Press shortcut key(s):" field, press "Alt+R".
- Click the [Assign] button.
- Click the [OK] button.
You're done! Now, open up the text editor, select some text, and press [Alt+R]. It will take a few seconds to show up the first time it is run. When the dialog pops up, type the name of the region and press Enter.
Happy Regioning!