有没有办法让Visual Studio停止缩进命名空间?

时间:2010-09-16 14:50:27

标签: c++ visual-studio namespaces indentation

Visual Studio一直试图缩进命名空间内的代码。

例如:

namespace Foo
{
   void Bar();

   void Bar()
   {

   }

}

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

这太烦人了,基本上因为这个原因我几乎从不在C ++中使用命名空间。我无法理解为什么它会尝试缩进它们(缩小1个甚至5个标签整个文件的重点是什么?),或者如何让它停止。

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

7 个答案:

答案 0 :(得分:43)

正如KindDragon所指出的,Visual Studio 2013 Update 2有一个停止缩进的选项。

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

答案 1 :(得分:30)

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

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

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

答案 2 :(得分: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 project item内部安装宏。您只能在Macro Explorer中访问此模块(Tools-&gt; Macros-&gt; Macro Explorer)。

注意,它目前不支持“压缩”命名空间,例如

namespace A { namespace B {
...
}
}

修改

要支持“压缩”命名空间(例如上面的示例)和/或支持命名空间后的注释(例如namespace A { /* Example */),您可以尝试使用以下行:

 If System.Text.RegularExpressions.Regex.IsMatch(lines, "^[\s]*(namespace.+)?[\s\{]+$") Then

我还没有机会对它进行过多次测试,但似乎有效。

答案 3 :(得分:12)

可能不是你想听到的,但很多人通过使用宏来解决这个问题:

#define BEGIN_NAMESPACE(x) namespace x {
#define END_NAMESPACE }

听起来很愚蠢,但是你会惊讶地发现有多少系统标头使用它。 (例如,glibc的stl实现对此有_GLIBCXX_BEGIN_NAMESPACE()。)

我实际上更喜欢这种方式,因为当我看到{之后的非缩进行时,我总是倾向于畏缩。那只是我。

答案 4 :(得分:7)

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

namespace test {
    class MyClass;
}

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

答案 5 :(得分:3)

我知道存在嵌套命名空间时的问题。我曾经将所有namespace打包在一行中以避免多次缩进。它将留下一个级别,但这并不像许多级别那么糟糕。自从我使用VS已经很久了,我几乎不记得那些日子。

namespace outer { namespace middle { namespace inner {
    void Test();
    .....
}}}

答案 6 :(得分:0)

Visual Studio 2017

Namespace Indention Menu VS2017

您可以在工具 - &gt;选项,然后是文本编辑器 - &gt; C / C ++ - &gt;格式化 - &gt;缩进下,进入此“缩进命名空间内容”设置。菜单很深,但一旦找到就非常有帮助。