有什么办法使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(); ..... }}}