有什么方法可以使Visual Studio停止缩进名称空间?


67

Visual Studio一直尝试使名称空间内的代码缩进。

例如:

namespace Foo
{
   void Bar();

   void Bar()
   {

   }

}

现在,如果我手动取消缩进,那么它将保持这种状态。但是不幸的是,如果我在前面添加一些内容void Bar();(例如评论),VS将继续尝试使其缩进。

太烦人了,基本上因为这个唯一的原因,我几乎从不使用C ++中的名称空间。我不明白为什么它会尝试缩进它们(整个文件缩进1个甚至5个制表符的意义什么?),或者如何使其停止。

有没有办法停止这种行为?配置选项,加载项,注册表设置,甚至直接修改devenv.exe的黑客。


您可以完全禁用自动缩进。或将其设置为缩进较小的数量(例如2个空格而不是1个制表符)
jalf 2010年

3
这(不可配置的缩进设置)是多年前我停止在Visual Studio中编辑文件的众多原因之一... :)
dash-tom-bang 2010年

2
如果有任何解决方案没有副作用,或者副作用尽可能小,我将奖励任何人。到目前为止,最好的答案是IMO,是bacar。如果没有提供更好的答案,我将把答案授予他。
Thomas Bonini 2010年

这就是为什么我使用Eclipse CDT的原因;)可以在Eclipse中使用VS编译器,因此值得一试。
doc

Answers:


13

这是一个可以帮助您的宏。如果检测到您当前正在创建,它将删除缩进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

我还没有机会进行大量测试,但是它似乎正在工作。


非常感谢您的回答。我现在纠正了一个错误,但除此之外,它仍然可以正常工作。赏金恩。
Thomas Bonini 2010年

可以很好地进行键入,但不能粘贴,例如Visual Assist的“创建实现”功能,而bacar的解决方案确实可以解决问题。虽然比较干净。
Adversus 2012年

1
这个问题看似愚蠢,但我确实找不到答案:我们应该在哪里粘贴此宏?
Aracthor 2015年

51

正如KindDragon指出的那样,Visual Studio 2013 Update 2具有停止缩进的选项。

您可以取消选中工具->选项->文本编辑器-> C / C ++->格式->缩进->缩进名称空间内容。


5
似乎又被打破了……至少在Update 4中。希望他们修复它。
AzP

2
确实坏了。虽然您可以使用clang格式,并且可以解决混乱情况。
约翰·莱德格伦

1
我刚刚尝试了VS2013 Update 5 CTP;它似乎又在工作。希望它对于正式的Update 5版本保持这种方式。
jdknight

2
这是最好的答案。就像我在VS 2015中预期的那样工作
。– Vivit

问题是C++,但是没有人知道C#in中是否有选项visual-studio-2019吗?我看了看,但Indent namespace contentsIndentation选项中找不到复选框。
讨厌

30

只是不要在第一行代码之前插入任何内容。您可以尝试以下方法来插入空行代码(在VS2005中似乎有效):

namespace foo
{; // !<---
void Test();
}

这似乎抑制了缩进,但是编译器可能会发出警告,并且代码检查者/维护者可能会感到惊讶!(通常情况下正确!)


10
我也喜欢 似乎即使扩展为空的宏也足以抑制缩进。因此,您可以#define SUPPRESS_INDENTATION像然后打开名称空间namespace foo { SUPPRESS_INDENTATION:)
Paul Groke 2010年

很好-意图更加清晰,希望编译器不太可能发出警告:)
bacar 2010年

虽然这是我最喜欢的解决方案,但我想提一下,该技巧在VS2013中不起作用。VS2013中有一个用户配置设置,可以防止这种情况的发生(有效时;请参见其他答案)。
jdknight

14

可能不是您想听的,但是很多人通过使用宏来解决此问题:

#定义BEGIN_NAMESPACE(x)命名空间x {
#define END_NAMESPACE}

听起来很愚蠢,但是您会惊讶地发现有多少系统头文件使用了这个头文件。(例如,glibc的stl命令就_GLIBCXX_BEGIN_NAMESPACE()可以了。)

我实际上更喜欢这种方式,因为当我看到a后面有不缩进的行时,我总是会畏缩{。不过那只是我。


9
我认为这更多是为了与旧编译器兼容,而不是因为Visual Studio =)
Thomas Bonini 2010年

6
@andreas我认为您可以在不编辑所有源文件的情况下轻松更改整个lib的命名空间
David Feurle 2010年

7

您还可以在名称空间内转发声明您的类型(或其他类型),然后在外部实现,如下所示:

namespace test {
    class MyClass;
}

class test::MyClass {
//...
};

6

Visual Studio 2017+

在此处输入图片说明 您可以在“工具”->“选项”下,然后在“文本编辑器”->“ C / C ++”->“格式”->“缩进”下获得“缩进名称空间内容”设置。它在菜单中很深,但是一旦发现就非常有用。


1
请不要只链接仅答案!
monamona

1
您可以包括屏幕截图。无论如何,这是VS2017 +的唯一正确答案。
托马什Zato -恢复莫妮卡

3

当存在嵌套的名称空间时,我了解问题。我以前将所有namespaces打包在一行中,以避免出现多个缩进。它将保留一个级别,但是还不如许多级别的坏。自从我使用VS以来已经有很长时间了,以至于我几乎不记得那些日子。

namespace outer { namespace middle { namespace inner {
    void Test();
    .....
}}}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.