Вот макрос, который может вам помочь.Он удалит отступы, если обнаружит, что вы в данный момент создаете 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
Поскольку он работает все время, вам необходимо убедиться, что вы устанавливаете макрос внутри вашего EnvironmentEvents
элемента проекта внутри MyMacros.Вы можете получить доступ к этому модулю только в Macro Explorer (Инструменты-> Macros-> Macro Explorer).
Одно примечание, в настоящее время он не поддерживает "упакованные" пространства имен, такие как
namespace A { namespace B {
...
}
}
РЕДАКТИРОВАТЬ
Для поддержки "упакованных" пространств имен, таких как пример выше, и / или поддержки комментариев после пространства имен, таких как namespace A { /* Example */
, вы можете попробовать использовать следующую строкувместо этого:
If System.Text.RegularExpressions.Regex.IsMatch(lines, "^[\s]*(namespace.+)?[\s\{]+$") Then
У меня еще не было возможности его протестировать, но, похоже, он работает.