2009-05-31 16 views
35

Interesuje mnie formatowanie wszystkich plików w projekcie Visual Studio (wersja 2005) na raz.Formatowanie - naraz - wszystkie pliki w projekcie Visual Studio

Obecnie istnieje sposób na sformatowanie pojedynczego dokumentu poprzez wykonanie czynności takich jak: Edycja-> Zaawansowane-> Format dokumentu. Jednak nie widzę pojedynczego polecenia do jednoczesnego sformatowania wszystkich plików projektu.

Każdy pomysł, jak to zrobić?

+1

[Resharper] (http://www.jetbrains.com/resharper/) zapewnia czyszczenie kodu i formatowanie, a to tylko ułamek jego funkcji ... – Skyler

+1

Tylko na przyszłość, należy zauważyć, że makra zostały usunięte od [VS 2011] (http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/d8410838-085b-4647-8c42-e31b669c9f11). – Tilak

+2

Phil Haack mówi: http://haacked.com/archive/2011/05/22/an-obsessive-compulsive-guide-to-source-code-format.aspx – MZaragoza

Odpowiedz

24

Tim Abell napisał makro to zrobić na jego blog:

Oto przydatny skrypt makro dla visual studio Zapukałem razem dzisiaj. Uruchamia "edytuj, formatuj dokument" na każdym dokumencie z wymienionych typów plików.

Musisz mieć to na uwadze, ponieważ jest interaktywny, a czasami pojawia się komunikat i czeka na odpowiedź.

Możesz pobrać plik vb w http://github.com/timabell/vs-formatter-macro Więcej informacji na http://wiki.github.com/timabell/vs-formatter-macro

Oryginalny Kod jest dostępny na blogu. Zauważ, że jest starsza niż wersja dostępna w github powyżej.

+2

Strona wiki dla powyższego https://github.com/timabell/vs-formatter-macro/wiki –

+1

Wygląda na to, że obsługa makr została usunięta z ostatnich wersji Visual Studio. – usr

0

Nie znam żadnego polecenia, które zrobi to dla wszystkich plików w projekcie dla ciebie, ale gdy masz plik kodu otwarty w Visual Studio, możesz użyć polecenia Edycja-> Zaawansowane-> Format dokumentu (lub nacisnąć CTRL + K, a następnie CTRL + D na klawiaturze). Naprawi to formatowanie w bieżącym pliku kodu.

To prawdopodobnie nie jest zbyt skomplikowane, aby utworzyć makro, które robi to dla całego projektu.

+1

To nie odpowiada na pytanie - OP wie, że może zrobić pojedynczy plik. – mjs

+0

@mjs To prawda. Zostało to zmienione w tekście pytania po opublikowaniu mojej odpowiedzi. –

13

Należy zauważyć, że poniższe rozwiązanie nie działa samoistnie, począwszy od Visual Studio 2015. Musisz również zastosować odpowiedź Marcusa Mangelsdorfa. Następnie skrypt ten działa w Visual Studio 2015 i 2017.


Phil Haack nakreślono dobrą procedurę - adding a reusable script to indent the project.

Otwórz swój profil Nuget do edycji

  1. Otwórz Menedżer pakietów;
  2. Wpisz $profile, aby zobaczyć lokalizację twojego profilu NuGet;
  3. Wpisz mkdir –force (split-path $profile), aby utworzyć folder profilu, jeśli nie istnieje;
  4. Edytuj profil za pomocą komendy notepad $profile.

Dodaj metodę wielokrotnego użytku do profilu Nuget

Phil używane davidfowl za Format-Document metodę którą znalazł w https://gist.github.com/davidfowl/984358:

# Function to format all documents based on https://gist.github.com/984353 
function Format-Document { 
    param(
     [parameter(ValueFromPipelineByPropertyName = $true)] 
     [string[]]$ProjectName 
    ) 
    Process { 
     $ProjectName | %{ 
         Recurse-Project -ProjectName $_ -Action { param($item) 
         if($item.Type -eq 'Folder' -or !$item.Language) { 
          return 
         } 

         $window = $item.ProjectItem.Open('{7651A701-06E5-11D1-8EBD-00A0C90F26EA}') 
         if ($window) { 
          Write-Host "Processing `"$($item.ProjectItem.Name)`"" 
          [System.Threading.Thread]::Sleep(100) 
          $window.Activate() 
          $Item.ProjectItem.Document.DTE.ExecuteCommand('Edit.FormatDocument') 
          $Item.ProjectItem.Document.DTE.ExecuteCommand('Edit.RemoveAndSort') 
          $window.Close(1) 
         } 
        } 
     } 
    } 
} 

function Recurse-Project { 
    param(
     [parameter(ValueFromPipelineByPropertyName = $true)] 
     [string[]]$ProjectName, 
     [parameter(Mandatory = $true)]$Action 
    ) 
    Process { 
     # Convert project item guid into friendly name 
     function Get-Type($kind) { 
      switch($kind) { 
       '{6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}' { 'File' } 
       '{6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}' { 'Folder' } 
       default { $kind } 
      } 
     } 

     # Convert language guid to friendly name 
     function Get-Language($item) { 
      if(!$item.FileCodeModel) { 
       return $null 
      } 

      $kind = $item.FileCodeModel.Language 
      switch($kind) { 
       '{B5E9BD34-6D3E-4B5D-925E-8A43B79820B4}' { 'C#' } 
       '{B5E9BD33-6D3E-4B5D-925E-8A43B79820B4}' { 'VB' } 
       default { $kind } 
      } 
     } 

     # Walk over all project items running the action on each 
     function Recurse-ProjectItems($projectItems, $action) { 
      $projectItems | %{ 
       $obj = New-Object PSObject -Property @{ 
        ProjectItem = $_ 
        Type = Get-Type $_.Kind 
        Language = Get-Language $_ 
       } 

       & $action $obj 

       if($_.ProjectItems) { 
        Recurse-ProjectItems $_.ProjectItems $action 
       } 
      } 
     } 

     if($ProjectName) { 
      $p = Get-Project $ProjectName 
     } 
     else { 
      $p = Get-Project 
     } 

     $p | %{ Recurse-ProjectItems $_.ProjectItems $Action } 
    } 
} 

# Statement completion for project names 
Register-TabExpansion 'Recurse-Project' @{ 
    ProjectName = { Get-Project -All | Select -ExpandProperty Name } 
} 

Reopen Visual Studio użyć polecenia

Po ponownym otwarciu Visual Studio, polecenie jest dostępne.

Po prostu uruchom z konsoli zarządzania pakietami NuGet: Format-Document Spowoduje to ponowne sformatowanie wszystkich plików wybranego projektu.
Aby zastosować do całego rozwiązania, użyj polecenia Get-Project -All | Format-Document, które zawiera listę projektów, a następnie dla każdego z nich wywołuje polecenie ponownego formatowania.

jako autor umieścić go:

Mając to na miejscu, można teraz oddawać swoje OCD i uruchom polecenie Format-dokument, aby oczyścić całe rozwiązanie. Po prostu uruchomiłem go przeciwko <Projektowi>, a teraz mogę stać się białym znakiem, którym zawsze chciałem być.

10/10, uruchomię się ponownie.

+0

Po prostu uruchomiłem to i przeszło tylko mój folder App_Code ... – Kristopher

+0

@Kristopher dla mnie działało bez zarzutu, przechodził wszystkie pliki C# z wielu projektów mojego rozwiązania, ale jest to WPF, a nie ASP.NET. Jakich innych folderów spodziewałeś się przejść? Może jest problem ze skryptem, na który nie wpadłem. – ANeves

+0

Użyłem ReSharper beta, aby to zrobić, więc nie martw się, ale zasadniczo wydaje się, że straciłem wszystko inne w katalogu rozwiązań ... – Kristopher

10

dodatkowy krok potrzebny do Visual Studio 2015

Phil Haack's solution posted by ANeves jest doskonały, ale z jakiegoś powodu $item.FileCodeModel.Language zawsze zwraca null w Visual Studio 2015 czyniąc Format-Document pominąć wszystkie pliki i skutecznie zrobić nic.

Do (hackily) obejścia tego ograniczenia można zastąpić Get-Language funkcję:

# Convert language guid to friendly name 
function Get-Language($item) { 
    if(!$item.FileCodeModel) { 
     return $null 
    } 

    $kind = $item.FileCodeModel.Language 
    switch($kind) { 
     '{B5E9BD34-6D3E-4B5D-925E-8A43B79820B4}' { 'C#' } 
     '{B5E9BD33-6D3E-4B5D-925E-8A43B79820B4}' { 'VB' } 
     default { $kind } 
    } 
} 

z następującym wariancie, który używa rozszerzenia pliku, zamiast GUID Język:

# Convert file extension to friendly language name 
function Get-Language($item) { 
    if(!$item.FileCodeModel) { 
     return $null 
    } 

    $filename = $item.Name 
    $ext = $filename.substring($filename.lastindexof('.'), 
           ($filename.length - $filename.lastindexof('.'))) 
    switch($ext) { 
     '.cs' { 'C#' } 
     '.vb' { 'VB' } 
     # If you want to prevent re-formatting files that are not VB or C# source files 
     # (e.g. XML files in your project etc.), replace the following line with 
     # "default { $null }" (thanks to HHenn for this suggestion!) 
     default { $ext } 
    }    
} 
+1

Zmieniłem kod w następujący sposób: 'switch ($ ext) { '.cs' {'C#'} '.vb' {'VB'} default {$ null} }' aby zapobiec formatowaniu żadnych plików VB lub C#. – HHenn

+0

Działa również w 2017 roku. –

13

Rozszerzenie Format All Files zadziałało dla mnie. Nic nie musisz robić, po prostu zainstaluj i kliknij!

+1

Każdy, kto czyta to, kto chce tylko wybrane typy plików. Przeczytaj stronę rozszerzenia i jest tam napisane, jak to zrobić. – GregP

Powiązane problemy