使用EnvDTE自动格式整个工程

今天看一C#开源工程的源代码觉得很不习惯,因为作者是使用C++ coding style组织代码的,  VS只有自动格式单个文件代码的功能(Edit -> Advanced -> Format Document), 没有自动格式整个工程的选项, 没办法,只能自己动手写个宏了。

 

首先打开Marcos Explorer ( Tools -> Marcors -> Macro Explorer), 然后在Marcos Explorer中选中MyMacros -> Module1,双击打开Module1,添加如下代码到Public Module Module1和End Module之间并保存,回到Marcos Explorer,我们看到AutoFormatSolution己经在Module1了,右键Run就可以了。

 

程序比较简单,就是在每个Project的ProjectItem上递归调用AutoFormatProjectItem (因为ProjectItem可能是一个Folder),我简单说下DTE.ExecuteCommand("Edit.FormatDocument"), 这个命令可以通过如下几种方法获得,相对来说1最单,但有时我们没法通过宏录制得到我们感兴趣的东西,只能通过2,3去硬找...

  1. 打开宏录制,然后手动执行一次FormatDocument,关闭宏录制,在Macros Explorer中的RecordingModule中你就可以看到相应的信息

  2. 打开Command Window (View -> Other Windows -> Command Window), 然后进行尝试,最后找出你需要的Command,Command一般跟你要执行的操作是有一一对应关系。比如我们要在Edit菜单下执行Format Document,那么你可以先打Edit.,然后在弹出的CompletionList中找你需要的命令

  3. 在Tools -> Options -> Environment -> Keyboard窗口中进行查询,查询的方法基本和2相似。

 

复制代码
代码
Dim solution As Solution = DTE.Solution

    
Sub AutoFormatSolution()
        
For i As Integer = 1 To solution.Projects.Count
            AutoFormatProject(solution.Projects.Item(i))
        
Next
    
End Sub

    
Private Sub AutoFormatProject(ByVal proj As Project)
        
For i As Integer = 1 To proj.ProjectItems.Count
            AutoFormatProjectItem(proj.ProjectItems.Item(i))
        
Next
    
End Sub
    
Private Sub AutoFormatProjectItem(ByVal projectItem As ProjectItem)
        
If projectItem.Kind = Constants.vsProjectItemKindPhysicalFile Then
            
If projectItem.Name.EndsWith(".cs"Then
                
Dim window As Window = projectItem.Open(Constants.vsViewKindCode)
                window.Activate()
                projectItem.Document.DTE.ExecuteCommand(
"Edit.FormatDocument")
                window.Close(vsSaveChanges.vsSaveChangesYes)
            
End If
        
End If
        
'If the projectItem is a fold, apply AutoFormatProjectItem in it recusivly
        If Not projectItem.ProjectItems Is Nothing Then
            
For i As Integer = 1 To projectItem.ProjectItems.Count
                AutoFormatProjectItem(projectItem.ProjectItems.Item(i))
            
Next
        
End If
    
End Sub
复制代码

 

 

posted @   芭蕉  阅读(1583)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示