我知道VS Code折叠问题是老生常谈了,但是在我浏览过的所有讨论中,我都没有找到这个问题:
我们有一个C#团队,有些人喜欢使用区域(regions),而另一些人则不喜欢,我们似乎没有太多中间地带可以共同协作。
是否有适用于VS的插件或附加组件可以“隐藏”这些区域?这样那些想要使用它们的人将像往常一样看到它们,而安装了该插件并查看.cs文件的人将看不到区域,好像它们不存在一样。
我可以看出,在移动代码时,这可能会导致某些方法被放进或放出错误的区域,但这可能是团队愿意接受的妥协...
我知道VS Code折叠问题是老生常谈了,但是在我浏览过的所有讨论中,我都没有找到这个问题:
我们有一个C#团队,有些人喜欢使用区域(regions),而另一些人则不喜欢,我们似乎没有太多中间地带可以共同协作。
是否有适用于VS的插件或附加组件可以“隐藏”这些区域?这样那些想要使用它们的人将像往常一样看到它们,而安装了该插件并查看.cs文件的人将看不到区域,好像它们不存在一样。
我可以看出,在移动代码时,这可能会导致某些方法被放进或放出错误的区域,但这可能是团队愿意接受的妥协...
我讨厌代码区域(我的团队喜欢使用它们),但惊讶地发现没有人编写过一个使其更好用的扩展工具。最后我自己写了一个,叫做I Hate #Regions:
让 #regions 变得更好用(免费):
http://visualstudiogallery.msdn.microsoft.com/0ca60d35-1e02-43b7-bf59-ac7deb9afbca
处理这些块的快捷键如下:
Ctrl+M, Ctrl+M 折叠或展开当前所在的代码块。 Ctrl+M, Ctrl+O 折叠文件中所有的代码块。 Ctrl+M, Ctrl+L 展开文件中所有的代码块。 Ctrl+M, Ctrl+P 停止大纲模式。(Ctrl+M,Ctrl+O 恢复)
请参见《代码折叠的问题》
就我个人而言,我会编写一个VS宏(工具 > 宏),在打开文件时展开所有区域。
这可能有些不太正规,且可能会带来一些副作用,但是:
工具-->选项-->环境-->字体和颜色-->预处理器关键字 将前景色和背景色更改为白色(或者您的默认背景色)。
您将看不到其他预处理器关键字。
对于使用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。我会在找到它们后发布。
我觉得任何讨厌区域的人都很有趣。我非常喜欢区域,甚至编写了一个名为Regionizer的程序,这是位于http://regionizer.codeplex.com的开源项目。
我曾经有过一些上司和团队成员不喜欢它们,但我的工具按字母顺序组织所有代码,因此方法在Methods区域中按字母顺序排序,属性在Properties区域中排序,事件在Events区域中排序。
尝试找到没有这个工具(或区域)的代码是我所谓的意大利面条式代码。
我一直在寻找一种轻松收缩和展开所有区域的方法,并被MS告知区域是.suo文件的一部分(与项目或解决方案同名),并且没有简单的方法来处理区域对象本身。
我已经在DTE中搜索了所有内容,但没有找到折叠所有或展开所有区域的方法,我将尝试使用宏代码并查看其是否起作用。
不久会发布更新。