Click here to Skip to main content
Click here to Skip to main content

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

By , 3 Jan 2005
 

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

  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)

About the Author

Phillip H. Blanton
Web Developer
United States United States
Member
I am a co-founder and CTO of ComponentScience Incorporated (www.ComponentScience.net); where my time is spent designing and developing component libraries for the Microsoft .NET framework.
 
I first began programming DOS-based, multiuser point of sale systems in 1989 using C and Turbo Pascal. I dabbled in Windows programming with OWL, and took it up full-time with the release of Delphi 1.
 
Before co-founding ComponentScience, I was employed as a senior software engineer with TurboPower Software Company, where I helped to create award-winning UI component libraries for Borland Delphi and C++ Builder. Now I am a 100% dot net junkie.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionWhy not just use Resharper?memberSean Goodpasture17 Oct '06 - 5:00 
If you're a C# developer, you owe it to yourself to buy Resharper.
 
You want a region? Highlight the code and hit ctrl-alt-j and select Region from the list.
 
Resharper is a definite productivity aid for me, although I'm not entirely pleased with the VS.NET 2k5 implementation of it (and I really dislike VS.NET 2k5, mostly because it's so dang buggy and crashes frequently).
AnswerRe: Why not just use Resharper?memberPhillip H. Blanton17 Oct '06 - 5:25 
WTF | :WTF:
 
This macro is faster (less keystrokes) allows you to tweak it to do regions as you wish, and is free.
 
Plenty of reasons to use this macro rather than resharper.

 
Phillip H. Blanton
www.ComponentScience.net
Email: Phillip at that domain that you see one line above the line you are reading now.

GeneralRe: Why not just use Resharper?memberSean Goodpasture17 Oct '06 - 5:48 
Right, but have you used Resharper? I mean, sure this script is super customizable, but I've got better things to be doing than customizing a script. I just want to get my work done and then get out of the office Poke tongue | ;-P
 
It does *way* more than just regions... If you were a java developer and were used to Idea, then Resharper makes the .net transition that much easier.
 
From a macros perspective:
ctrl-n to open a class (from anywhere)
alt-insert to insert: Constructor, Read Property, Write Property, Read/Write Property, Implement Interface Member, Override Inherited Member, Generate Delegating members
ctrl-alt-j to Surround with: if, while, for, do..while, lock, #region, {}, try..catch, try..finally, cast.
ctrl-d: dupe the current line/highlighted text (no copy/paste)
ctrl-/: comment out a line/uncomment out a line
alt-insert: add namespace using lines as needed for unknown types (this is a lifesaver)
 
Not to mention all the code completion differences and the vb like compile behind telling you immediately that code won't compile. This is the #1 best feature of R# IMO (and it's somewhat broken in 2k5 which bugs me to no end).
 
I think it would take a lot of work to write custom scripts/macros for all this. Resharper (esp. for vs.net2k3) is well worth the money and productivity enhancements.
 
Another benefit to a COTS component is that your entire development team can be standardized so that you only have to give one training class on the tool and everyone then talk the same "language."
 
There are some built in macros for some of this stuff in vs.net 2k5, but they don't work nearly as nicely (like the one for adding properties) IMO.
 
I'm not knocking the macro you wrote, but was just wanting to make sure your readers knew that there was a COTS tool that would do similar things + a lot more (for a cost of course).
GeneralRe: Why not just use Resharper?memberPhillip H. Blanton7 Oct '08 - 11:02 
By the way, I use ReSharper now and still use my macro for regions.
 
Phillip H. Blanton

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

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130523.1 | Last Updated 3 Jan 2005
Article Copyright 2004 by Phillip H. Blanton
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid