Click here to Skip to main content
15,868,141 members
Articles / Programming Languages / VBScript

A nice macro that automates the task of making regions in C# code

Rate me:
Please Sign up or sign in to vote.
4.86/5 (25 votes)
3 Jan 2005CPOL3 min read 122.7K   456   52   33
At ComponentScience where I work, 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.

Contents

Introduction

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.

Macro Code

VB
Sub MakeRegion()
  Regions.MakeRegion()
End Sub

Public Class Regions
  ' MakeRegion inserts #region and #endregion tags
  ' around selected text in the VS editor.
  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

    'ELR: ADDED THIS, to move the startpoint to the start of the line
    'so that the Pad function works correctly
    If Not startpoint.AtStartOfLine Then
      startpoint.StartOfLine()
    End If

    'IV 2004-12-13: rName = InputBox("Region Name:")
    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

      'ELR: ADDED Test for Languages
      If DTE.ActiveDocument.Language = "CSharp" Then
        ' C Sharp Code
        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
        ' VB Code
        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

  ' IV: Get the description from the 1st line of code in the region
  ' i.e. ignore c# comment tags (///) or take 1st line of the comments (//)
  ' Requires adjustments for VB and other langs
  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

How to use

Installation

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.

Hot Key Assignment

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!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect Hewlett-Packard
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralStill the best. Pin
stano4-Oct-08 17:24
stano4-Oct-08 17:24 
QuestionWhy not just use Resharper? Pin
Sean Goodpasture17-Oct-06 5:00
Sean Goodpasture17-Oct-06 5:00 
AnswerRe: Why not just use Resharper? Pin
Phillip H. Blanton17-Oct-06 5:25
Phillip H. Blanton17-Oct-06 5:25 
GeneralRe: Why not just use Resharper? Pin
Sean Goodpasture17-Oct-06 5:48
Sean Goodpasture17-Oct-06 5:48 
GeneralRe: Why not just use Resharper? Pin
Phillip H. Blanton7-Oct-08 11:02
Phillip H. Blanton7-Oct-08 11:02 
Generalmodify for the Try Catch.. Pin
mattmaxx15-Mar-06 5:50
mattmaxx15-Mar-06 5:50 
GeneralAnother macro for region creations Pin
Dan Handevik13-Mar-05 8:01
Dan Handevik13-Mar-05 8:01 
Generalsmall request Pin
NicoRi20-Jan-05 7:27
NicoRi20-Jan-05 7:27 
GeneralRe: small request Pin
Phillip H. Blanton11-Dec-05 6:25
Phillip H. Blanton11-Dec-05 6:25 
GeneralSmall addition Pin
Igor Velikorossov16-Jan-05 19:15
Igor Velikorossov16-Jan-05 19:15 
GeneralNeed to updtae Pin
Arun Manglick4-Jan-05 19:08
Arun Manglick4-Jan-05 19:08 
GeneralUpdate Need Pin
Arun Manglick4-Jan-05 19:07
Arun Manglick4-Jan-05 19:07 
GeneralUpdate Needed!!! Pin
Phillip H. Blanton13-Dec-04 12:37
Phillip H. Blanton13-Dec-04 12:37 
QuestionLatest macro?? Pin
Misty_Blue13-Dec-04 6:30
Misty_Blue13-Dec-04 6:30 
AnswerRe: Latest macro?? Pin
Igor Velikorossov13-Dec-04 11:42
Igor Velikorossov13-Dec-04 11:42 
GeneralRe: Latest macro?? Pin
Phillip H. Blanton13-Dec-04 12:31
Phillip H. Blanton13-Dec-04 12:31 
GeneralLittle variation Pin
Igor Velikorossov12-Dec-04 11:39
Igor Velikorossov12-Dec-04 11:39 
GeneralRe: Little variation Pin
Sven Rieke12-Dec-04 23:28
Sven Rieke12-Dec-04 23:28 
GeneralStill a problem Pin
simonech12-Dec-04 3:28
simonech12-Dec-04 3:28 
GeneralRe: Still a problem Pin
simonech12-Dec-04 3:33
simonech12-Dec-04 3:33 
GeneralRe: Still a problem Pin
Phillip H. Blanton13-Dec-04 11:58
Phillip H. Blanton13-Dec-04 11:58 
GeneralLittle bug Pin
mrchief_20009-Dec-04 8:42
mrchief_20009-Dec-04 8:42 
GeneralRe: Little bug Pin
isler-j10-Dec-04 3:30
isler-j10-Dec-04 3:30 
GeneralLatest Macro Code Pin
Phillip H. Blanton8-Dec-04 7:39
Phillip H. Blanton8-Dec-04 7:39 
GeneralRe: Latest Macro Code Pin
Phillip H. Blanton8-Dec-04 7:41
Phillip H. Blanton8-Dec-04 7:41 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.