这是一个可以帮助您的宏。如果检测到您当前正在创建,它将删除缩进namespace
。它不是完美的,但到目前为止可以正常工作。
Public Sub aftekeypress(ByVal key As String, ByVal sel As TextSelection, ByVal completion As Boolean) _
Handles TextDocumentKeyPressEvents.AfterKeyPress
If (Not completion And key = vbCr) Then
'Only perform this if we are using smart indent
If DTE.Properties("TextEditor", "C/C++").Item("IndentStyle").Value = 2 Then
Dim textDocument As TextDocument = DTE.ActiveDocument.Object("TextDocument")
Dim startPoint As EditPoint = sel.ActivePoint.CreateEditPoint()
Dim matchPoint As EditPoint = sel.ActivePoint.CreateEditPoint()
Dim findOptions As Integer = vsFindOptions.vsFindOptionsMatchCase + vsFindOptions.vsFindOptionsMatchWholeWord + vsFindOptions.vsFindOptionsBackwards
If startPoint.FindPattern("namespace", findOptions, matchPoint) Then
Dim lines = matchPoint.GetLines(matchPoint.Line, sel.ActivePoint.Line)
' Make sure we are still in the namespace {} but nothing has been typed
If System.Text.RegularExpressions.Regex.IsMatch(lines, "^[\s]*(namespace[\s\w]+)?[\s\{]+$") Then
sel.Unindent()
End If
End If
End If
End If
End Sub
由于它一直在运行,因此需要确保在MyMacros的EnvironmentEvents
项目项中安装了该宏。您只能在Macro Explorer(工具-> Macros-> Macro Explorer)中访问此模块。
请注意,它目前不支持“打包”名称空间,例如
namespace A { namespace B {
...
}
}
编辑
为了支持上述示例的“打包”名称空间和/或支持诸如的名称空间之后的注释namespace A { /* Example */
,您可以尝试使用以下行:
If System.Text.RegularExpressions.Regex.IsMatch(lines, "^[\s]*(namespace.+)?[\s\{]+$") Then
我还没有机会进行大量测试,但是它似乎正在工作。