有什么办法使Visual Studio停止缩进名称空间?
Visual Studio不断尝试缩进名称空间内的代码。
例如:
namespace Foo { void Bar(); void Bar() { } }
现在,如果我手动取消缩进,那么它仍然是这样的。 但不幸的是,如果我在void Bar();
之前添加一些东西void Bar();
– 如评论 – VS将继续试图缩进它。
这是如此令人讨厌,基本上是因为这个原因,我几乎从来没有使用C ++的命名空间。 我不明白为什么它试图缩进(缩进1或甚至5个选项卡整个文件有什么意义?),或如何使其停止。
有没有办法阻止这种行为? 一个configuration选项,一个加载项,一个registry设置,甚至可以直接修改devenv.exe的hack。
这是一个可以帮助你的macros。 如果它检测到您正在创build一个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
项目里面安装了这个macros。 您只能在macros浏览器(工具 – >macros – >macros浏览器)中访问此模块。
一个注意,它目前不支持“打包”的命名空间,如
namespace A { namespace B { ... } }
编辑
为了支持上面例子中的“压缩”命名空间和/或在命名空间之后支持注释,比如namespace A { /* Example */
,您可以尝试使用下面的代码行:
If System.Text.RegularExpressions.Regex.IsMatch(lines, "^[\s]*(namespace.+)?[\s\{]+$") Then
我还没有机会对它进行很多testing,但似乎正在工作。
正如KindDragon指出的,Visual Studio 2013 Update 2有一个选项来停止缩进。
您可以取消select工具 – >选项 – >文本编辑器 – > C / C ++ – >格式 – >缩进 – >缩进命名空间内容。
只是不要在第一行代码之前插入任何东西。 您可以尝试以下方法插入空行代码(它似乎在VS2005中工作):
namespace foo {; // !<--- void Test(); }
这似乎压制了缩进,但编译器可能会发出警告和代码审查/维护人员可能会感到惊讶! (正常情况下,正常情况下!)
可能不是你想听到的,但是很多人用macros来解决这个问题:
#define BEGIN_NAMESPACE(x)命名空间x { #define END_NAMESPACE}
听起来很愚蠢,但你会惊讶有多less系统标题使用这个。 (例如,glibc的stl实现有_GLIBCXX_BEGIN_NAMESPACE()
。)
我其实更喜欢这种方式,因为当我看到{
之后的缩进线时,我总是倾向于畏缩。 那只是我而已。
你也可以在命名空间内转发声明你的types(或其他),然后像这样实现:
namespace test { class MyClass; } class test::MyClass { //... };
我了解有嵌套命名空间时的问题。 我曾经把所有的namespace
放在一行中,以避免多重缩进。 它会离开一个层次,但这并不像许多层次那样糟糕。 自从我使用VS之后已经很久了,我几乎不记得那些日子了。
namespace outer { namespace middle { namespace inner { void Test(); ..... }}}