Visual Studio 僅提供單一檔案格式化功能(Edit → Advanced → Format Document),缺乏「格式化整個專案/方案」的內建指令。針對開源專案程式碼風格不一(如 C++ 風格大括號換行)的困擾,利用 EnvDTE 自動化模型撰寫巨集,實現遞迴遍歷方案所有專案、專案項目,批次套用格式化。
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)
' 僅處理實體檔案 (.cs)
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 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
DTE.Solution → 取得方案物件Project.ProjectItems → 專案項目集合(含檔案、資料夾)ProjectItem.Kind = vsProjectItemKindPhysicalFile → 過濾實體檔案ProjectItem.Open(vsViewKindCode) → 在程式碼編輯器開啟檔案Window.Activate() → 切換焦點至該視窗(命令需作用於作用中視窗)DTE.ExecuteCommand("Edit.FormatDocument") → 執行內建格式化命令Window.Close(vsSaveChangesYes) → 儲存並關閉| 方法 | 操作步驟 | 適用情境 |
|---|---|---|
| 巨集錄製 | 工具 → 巨集 → 錄製新巨集 → 手動執行一次格式化 → 停止錄製 → 檢視 RecordingModule | 最簡單,適用已知功能位置 |
| 命令視窗 | 檢視 → 其他視窗 → 命令視窗 → 輸入 Edit. → IntelliSense 列出所有子命令 | 快速搜尋命令完整名稱 |
| 鍵盤選項 | 工具 → 選項 → 環境 → 鍵盤 → 搜尋框輸入關鍵字 | 確認命令與快捷鍵綁定關係 |
工具 → 巨集 → 巨集總管MyMacros → Module1,雙擊開啟編輯器AutoFormatSolution → 執行.vb、.js、.xml 等bin、obj、Generated 等非原始碼目錄Roslyn 程式碼修正或 dotnet format CLI 工具這個巨集雖簡單,卻解決了團隊協作中最基礎也最痛點的程式碼風格統一問題,是版本控制前的必備自動化步驟。