I'm still playing around with that MakeRegion macro that Philip first posted. Today I added a regular expression to parse the first line of code and extract only the member name instead of the entire line.
For instructions on how to install, see The Blog That Started It All.
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Imports System.Text.RegularExpressions
Public Module Regions
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
Dim DefaultResponse = GetDesc(DTE.ActiveDocument.Selection.TopPoint.CreateEditPoint())
Dim re As Regex = New Regex("\s(\w+)\s*(?:\(|\:|$)")
DefaultResponse = re.Match(DefaultResponse).Groups(1).Value
'IV 2004-12-13: rName = InputBox("Region Name:")
rName = InputBox("Type the name you want to give to the region, which will appear in the Visual Studio Code Editor.", "Make Region", _
DefaultResponse)
rName = rName.Trim()
If rName.Length = 0 Then
Exit Sub
End If
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}", _
vbCrLf & pad, rName))
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("///")) Or (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
End Module