隐藏 Visual Studio 中的区域

26

我知道VS Code折叠问题是老生常谈了,但是在我浏览过的所有讨论中,我都没有找到这个问题:

我们有一个C#团队,有些人喜欢使用区域(regions),而另一些人则不喜欢,我们似乎没有太多中间地带可以共同协作。

是否有适用于VS的插件或附加组件可以“隐藏”这些区域?这样那些想要使用它们的人将像往常一样看到它们,而安装了该插件并查看.cs文件的人将看不到区域,好像它们不存在一样。

我可以看出,在移动代码时,这可能会导致某些方法被放进或放出错误的区域,但这可能是团队愿意接受的妥协...


52
啊,代码区域。混淆代码之王,设计不良之宗主。哦,你的存在如此轻视我。但只有一瞬间可以把你推开,让代码敞开大门以供浏览或调试,然而与你相处,却是一种诡计。啊,代码区域。建筑之恶臭船长,机遇之傲慢冠军。你隐藏了所有细节和内部机制。你有属性,是吗?但一个或两个方法被很好地隐藏在其中,我该从哪里开始呢?滥用商人,虐待化身。你们是隐蔽代码的区域。啊,代码区域,请你们使用得更少,数量更少吧。啊,代码区域。 - Jeff Yates
3
如果它们的内容被清晰标记,它们就不错。就像保鲜袋一样。 - Lucas Jones
6
直到有人无视标签,将豌豆和胡萝卜混在一起。 - Jeff Yates
3
我考虑的更像是太平间里的袋子。 - Yuriy Faktorovich
3
说实话,地区是一种工具,你可以正确使用它,也可以滥用它。不要因为你的团队正在用它开罐头而讨厌这把锤子。 - Alex
显示剩余5条评论
7个回答

63

我讨厌代码区域(我的团队喜欢使用它们),但惊讶地发现没有人编写过一个使其更好用的扩展工具。最后我自己写了一个,叫做I Hate #Regions:

让 #regions 变得更好用(免费):

http://visualstudiogallery.msdn.microsoft.com/0ca60d35-1e02-43b7-bf59-ac7deb9afbca

  • 文件打开时自动展开代码区域
  • 可选地防止折叠代码区域(但仍然可以折叠其他代码)
  • 给 #region / #end region 行设置较小、较浅的背景颜色,使其不太起眼(也是一个选项)
  • 适用于 C# 和 VB

Region Tool Screenshot


1
@Binary Worrier:很遗憾,大部分代码使用了新的VS2010可扩展性API。我相信它可以在VS2008上完成,但这将是完全不同的代码,而且不是一个简单的移植 :( - NotDan
2
你能发布这个的源代码吗? - Jake Berger
1
请将其开源,以便在VS 2013中使用 :) - marcob
1
我也讨厌区域功能!感谢您的Visual Studio扩展。 - Colonel Panic
5
@NotDan,我知道这个问题有点老了,但你能否为VS 2017制作一个更新的扩展程序,或者让其他人创建一个拉取请求来实现这一点呢?我仍然讨厌区域折叠功能会隐藏我的代码。我想看到所有的代码,即使是丑陋的部分,这样它就不能躲藏在我的眼前了。 - Jeremy
显示剩余13条评论

16

处理这些块的快捷键如下:

Ctrl+M, Ctrl+M  折叠或展开当前所在的代码块。
Ctrl+M, Ctrl+O  折叠文件中所有的代码块。
Ctrl+M, Ctrl+L  展开文件中所有的代码块。
Ctrl+M, Ctrl+P  停止大纲模式。(Ctrl+M,Ctrl+O 恢复)

请参见《代码折叠的问题》


我也经常使用这些快捷键。 - Jake Berger

1

就我个人而言,我会编写一个VS宏(工具 > 宏),在打开文件时展开所有区域。


3
请问您能否在这里发布您的宏?我不知道如何编写它们,但区域已经让我疯了。 - User

0

老实说,我不知道有任何类似的插件。但是,使用VSTO,你可以很容易地自己编写一个。


0

这可能有些不太正规,且可能会带来一些副作用,但是:

工具-->选项-->环境-->字体和颜色-->预处理器关键字 将前景色和背景色更改为白色(或者您的默认背景色)。

您将看不到其他预处理器关键字。


3
如果该地区已经崩溃,这并没有帮助——事实上,它可能会使情况更糟。 - Jeff Yates

0

对于使用VS 2008的用户,您可以通过宏编程来停止大纲视图并重新启动它。我在http://weblogs.asp.net/rweigelt/archive/2003/07/06/9741.aspx找到了这段代码。

Imports EnvDTE

' Expands all regions in the current document    
Sub ExpandAllRegions()        
    DTE.ExecuteCommand("Edit.StopOutlining")        
    DTE.ExecuteCommand("Edit.StartAutomaticOutlining")    
End Sub

以上适用于C# IDE;由于某种原因,VB的IDE在明确告知时不会删除带有区域的大纲。希望这可以帮到你!

-- 追加编辑:

这是一个在Visual Studio 2008中适用于Visual Basic .NET的方法。它有点粗暴,但思路是注释掉所有的#region标记,展开大纲。下一步是取消注释,将它们返回到原始状态(不严格正确...可能在代码的其他部分中存在流氓使用#region)。此代码也不会将查找和替换对话框返回到其原始状态。除了这些警告之外,这是执行此任务的宏模块:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics

Public Module MacroMod01
    Sub ExpandAllRegions()
    ' comment out all #region occurances
        DTE.ExecuteCommand("Edit.Replace")
        DTE.Find.Action = vsFindAction.vsFindActionReplaceAll
        DTE.Find.FindWhat = "#region"
        DTE.Find.ReplaceWith = "'#region"
        DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
        DTE.Find.MatchCase = False
        DTE.Find.MatchWholeWord = False
        DTE.Find.MatchInHiddenText = True
        DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral
        DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResultsNone
        DTE.Find.Action = vsFindAction.vsFindActionReplaceAll
        DTE.Find.Execute()

    ' uncomment all #region occurances
        DTE.ExecuteCommand("Edit.Replace")
        DTE.Find.Action = vsFindAction.vsFindActionReplaceAll
        DTE.Find.FindWhat = "'#region"
        DTE.Find.ReplaceWith = "#region"
        DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
        DTE.Find.MatchCase = False
        DTE.Find.MatchWholeWord = False
        DTE.Find.MatchInHiddenText = True
        DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral
        DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResultsNone
        DTE.Find.Action = vsFindAction.vsFindActionReplaceAll
        DTE.Find.Execute()

    'close the find 'n replace dialog
        DTE.Windows.Item("{CF2DDC32-8CAD-11D2-9302-005345000000}").Close()  

    End Sub

End Module

在VS2008中,可能有其他几种方法可以实现VB。我会在找到它们后发布。


-5

我觉得任何讨厌区域的人都很有趣。我非常喜欢区域,甚至编写了一个名为Regionizer的程序,这是位于http://regionizer.codeplex.com的开源项目。

我曾经有过一些上司和团队成员不喜欢它们,但我的工具按字母顺序组织所有代码,因此方法在Methods区域中按字母顺序排序,属性在Properties区域中排序,事件在Events区域中排序。

尝试找到没有这个工具(或区域)的代码是我所谓的意大利面条式代码。

我一直在寻找一种轻松收缩和展开所有区域的方法,并被MS告知区域是.suo文件的一部分(与项目或解决方案同名),并且没有简单的方法来处理区域对象本身。

我已经在DTE中搜索了所有内容,但没有找到折叠所有或展开所有区域的方法,我将尝试使用宏代码并查看其是否起作用。

不久会发布更新。


2
不确定那是愚人节的评论还是真的...有更好的工具可用: http://www.red-gate.com/products/dotnet-development/smartassembly/ - Stéphane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接