2013-03-17 19 views
28

Con le versioni precedenti di Visual Studio, ho utilizzato Kevin Pilch-Bisson's script per formattare tutti i file C# nella mia soluzione.Come formattare tutti i file in Visual Studio 2012?

VS2012 supporto macro interrotto, in modo che non funzioni più.

Come posso facilmente formattare tutti i miei documenti in VS2012?

+4

Ho postato questa domanda per documentare la soluzione che ho trovato. Ma forse ci sono altre buone idee là fuori? –

+0

puoi contrassegnare la tua risposta come corretta? –

risposta

27

Aperte Strumenti -> Biblioteca Package Manager -> Package Manager Console, ed eseguire il comando di seguito. Alla fine, tutti i documenti saranno aperti nell'IDE. (Le macchine a bassa RAM avranno problemi con soluzioni di grandi dimensioni.) I file modificati saranno modificati nell'IDE e non salvati sul disco. Puoi salvare tutto, quindi chiudere tutto se sei pronto.

VS2012 rimosso il linguaggio macro simile a VB che esisteva nella versione precedente di Visual Studio. Tuttavia, l'interfaccia DTE sottostante è ancora lì, e si può raggiungere tramite PowerShell, nella console Package Manager

La strana GUID passato al ProjectItem.Open è Constants.vsViewKindCode.

Normalmente lo suddivido su più righe, ma la console di Package Manager non supporta la continuazione della linea.

Potete trovare l'ultima versione su https://gist.github.com/JayBazuzi/9e0de544cdfe0c7a4358

function f($projectItems) { $projectItems | ? { $_.Name.EndsWith(".cs") } | % { $win = $_.Open('{7651A701-06E5-11D1-8EBD-00A0C90F26EA}') ; $win.Activate() ; $DTE.ExecuteCommand('Edit.FormatDocument') } ; if ($projectItems) { $projectItems | % { f($_.projectItems) } } } 

$dte.Solution.Projects | % { f($_.ProjectItems) } 
+0

Sfortunatamente, questo non sembra funzionare quando i progetti sono all'interno delle cartelle della soluzione ... Non sono abbastanza familiare con Powershell per suggerire un miglioramento, purtroppo. Hai qualche suggerimento? – Anthony

+0

Grande cattura! Sì, sarà necessario iterare ricorsivamente se '$ _' ha qualsiasi' ProjectItems'. Potresti scrivere una funzione ricorsiva o forse usare una chiusura. Se nessun altro arriva prima, lo guarderò più tardi. –

+0

@Anthony: l'ho aggiornato per recurse. Fatemi sapere cosa ne pensate. –

1

Si potrebbe utilizzare ReSharper's Code Cleanup. Sembra che questo possa funzionare su un'intera soluzione contemporaneamente.

2

È possibile utilizzare CodeMaid, un plug-in gratuito per VS2012. Ciò ti consente di pulire, riorganizzare il tuo codice. Lo uso sempre prima di controllare il codice con StyleCop

+1

Mentre CodeMaid potrebbe essere un ottimo strumento, di default fa molto più della domanda, applicando molta più pulizia rispetto alla formattazione del codice integrata di Visual Studio. Questo può o non può essere desiderato. – explunit

10

Ecco un aggiornamento dello script esistente che funziona su soluzioni molto grandi.

Apre ogni file, lo formatta, quindi salva e chiude il file anziché lasciarlo aperto. Salta anche ".designer". file, poiché questi dovrebbero generalmente essere lasciati da soli.

Questo funziona in Visual Studio 2012 e 2013. È possibile copiarlo e incollarlo direttamente nella console di Gestione pacchetti.

essere avvertiti: incollare questo codice nella vostra console sarà immediatamente aperto e formattare ogni file C# nella vostra intera soluzione, salvare ogni file modificato senza chiedere. Potrebbe essere una buona idea per primo ramo ...

function FormatItems($projectItems) { 
    $projectItems | 
    % { 
     # Write-Host " Examining item: $($_.Name)"; 

     if ($_.Name -and $_.Name.ToLower().EndsWith(".cs") ` 
      -and (-not $_.Name.ToLower().Contains(".designer."))) { 

      $win = $_.Open('{7651A701-06E5-11D1-8EBD-00A0C90F26EA}'); 
      $win.Activate(); 

      $dte.ExecuteCommand('Edit.FormatDocument'); 

      if (!$_.Saved) { 
       Write-Host " Saving modified file: $($_.Name)"; 
       $dte.ExecuteCommand('File.SaveSelectedItems'); 
      } 

      $dte.ExecuteCommand('Window.CloseDocumentWindow'); 
     } 

     if ($_.ProjectItems -and ($_.ProjectItems.Count -gt 0)) { 
      # Write-Host " Opening sub-items of $($_.Name)"; 

      FormatItems($_.ProjectItems); 
     } 
    }; 
} 

$dte.Solution.Projects | % { 
    Write-Host "-- Project: $($_.Name)"; 

    FormatItems($_.ProjectItems) 
} 
; 
+0

Questo non sembra funzionare quando la radice della soluzione è composta da cartelle della soluzione anziché progetti. –

+0

Nella sua forma attuale questo non può essere copiato e incollato in VS 2017, dà errori. – bbodenmiller

-4

Goto -> Strumenti - >> Opzione - >> TextEditor - >> XAML - >> Formattazione - >> Distanza file - - >> Controlla la posizione di ogni attributo su una linea separata! Ecco cos'è

+1

Eh? Penso che tu abbia frainteso la mia domanda. –

0

Ecco un'altra variante delle precedenti due risposte che gli utenti potrebbero trovare utili ... sicuramente potrebbe essere ulteriormente migliorata e semplificata. Questo non solo formatta i file .cs ma anche .json, .cshtml, .js e .css.

function f($projectItems) { $projectItems | ? { $_.Name -ne $null -and $_.Name.EndsWith(".cs") } | % { $win = $_.Open('{7651A701-06E5-11D1-8EBD-00A0C90F26EA}') ; $win.Activate() ; $DTE.ExecuteCommand('Edit.FormatDocument') } ; if ($projectItems) { $projectItems | % { f($_.projectItems) } } } 

$dte.Solution.Projects | % { f($_.ProjectItems) } 

function f($projectItems) { $projectItems | ? { $_.Name -ne $null -and $_.Name.EndsWith(".json") } | % { $win = $_.Open('{7651A701-06E5-11D1-8EBD-00A0C90F26EA}') ; $win.Activate() ; $DTE.ExecuteCommand('Edit.FormatDocument') } ; if ($projectItems) { $projectItems | % { f($_.projectItems) } } } 

$dte.Solution.Projects | % { f($_.ProjectItems) } 

function f($projectItems) { $projectItems | ? { $_.Name -ne $null -and $_.Name.EndsWith(".cshtml") } | % { $win = $_.Open('{7651A701-06E5-11D1-8EBD-00A0C90F26EA}') ; $win.Activate() ; $DTE.ExecuteCommand('Edit.FormatDocument') } ; if ($projectItems) { $projectItems | % { f($_.projectItems) } } } 

$dte.Solution.Projects | % { f($_.ProjectItems) } 

function f($projectItems) { $projectItems | ? { $_.Name -ne $null -and $_.Name.EndsWith(".js") -and (-not $_.Properties.Item("FullPath").Value.Contains("common")) -and (-not $_.Properties.Item("FullPath").Value.Contains("Content")) -and (-not $_.Properties.Item("FullPath").Value.Contains("Scripts")) } | % { $win = $_.Open('{7651A701-06E5-11D1-8EBD-00A0C90F26EA}') ; $win.Activate() ; $DTE.ExecuteCommand('Edit.FormatDocument') } ; if ($projectItems) { $projectItems | % { f($_.projectItems) } } } 

$dte.Solution.Projects | % { f($_.ProjectItems) } 

function f($projectItems) { $projectItems | ? { $_.Name -ne $null -and $_.Name.EndsWith(".css") -and (-not $_.Properties.Item("FullPath").Value.Contains("common")) -and (-not $_.Properties.Item("FullPath").Value.Contains("Content")) -and (-not $_.Properties.Item("FullPath").Value.Contains("Scripts")) } | % { $win = $_.Open('{7651A701-06E5-11D1-8EBD-00A0C90F26EA}') ; $win.Activate() ; $DTE.ExecuteCommand('Edit.FormatDocument') } ; if ($projectItems) { $projectItems | % { f($_.projectItems) } } } 

$dte.Solution.Projects | % { f($_.ProjectItems) } 
Problemi correlati