Visual Studio一直试图缩进命名空间内的代码。
例如:
namespace Foo
{
void Bar();
void Bar()
{
}
}
现在,如果我手动取消缩进,那么它会保持这种状态。但不幸的是,如果我在void Bar();
之前添加一些内容 - 例如评论 - VS会继续尝试缩进它。
这太烦人了,基本上因为这个原因我几乎从不在C ++中使用命名空间。我无法理解为什么它会尝试缩进它们(缩小1个甚至5个标签整个文件的重点是什么?),或者如何让它停止。
有没有办法阻止这种行为?配置选项,加载项,注册表设置,甚至是直接修改devenv.exe的hack。
答案 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;缩进下,进入此“缩进命名空间内容”设置。菜单很深,但一旦找到就非常有帮助。