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

Visual Studio不断尝试缩进名称空间内的代码。

例如:

namespace Foo { void Bar(); void Bar() { } } 

现在,如果我手动取消缩进,那么它仍然是这样的。 但不幸的是,如果我在void Bar();之前添加一些东西void Bar(); – 如评论 – VS将继续试图缩进它。

这是如此令人讨厌,基本上是因为这个原因,我几乎从来没有使用C ++的命名空间。 我不明白为什么它试图缩进(缩进1或甚至5个选项卡整个文件有什么意义?),或如何使其停止。

有没有办法阻止这种行为? 一个configuration选项,一个加载项,一个registry设置,甚至可以直接修改devenv.exe的hack。

6 Solutions collect form web for “有什么办法使Visual Studio停止缩进名称空间?”

这是一个可以帮助你的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(); ..... }}} 
  • 如何使用Web站点项目types的C#6?
  • 我该如何补救“断点不会被击中。 没有符号已经加载这个文件。“警告?
  • 如何在IntelliSense中的function在Visual Studio中的意见?
  • 编译器错误C3493:'func'不能隐式捕获,因为没有指定默认捕获模式
  • IIS Express Windows身份validation
  • 我应该添加.vcxproj.filter文件到源代码pipe理?
  • Visual Studio的debugging/加载速度非常慢
  • 删除未使用的引用(!=“using”)
  • 从Visual Studiosearch中排除特定的文件
  • Visual Studio 2010制作和安装模板
  • 为Visual Studio 2010安装OpenCV-2.3