Formatage-à la fois - tous les fichiers dans un projet Visual Studio

Je suis intéressé par le formatage de tous les fichiers dans un Visual Studio (ver. 2005) projet tout à la fois.

Actuellement, il existe un moyen de formater un seul document en faisant quelque chose comme Edit- > Advanced - > Format Document . Cependant, je ne vois pas une seule commande pour formater tous les fichiers d'un projet à la fois.

Une idée de comment faire ça?

37
demandé sur Deduplicator 2009-05-31 09:48:10

4 réponses

Tim Abell a écrit une macro pour le faire sur son blog :

Voici un script macro pratique pour visual studio que j'ai frappé ensemble aujourd'hui. Il exécute "edit, format document" sur chaque document des types de fichiers listés.

Vous devez garder un œil dessus car il est interactif et fait parfois apparaître un message et attendre une réponse.

Vous pouvez obtenir le fichier vb à http://github.com/timabell/vs-formatter-macro Plus d'infos au http://wiki.github.com/timabell/vs-formatter-macro

Le code original est disponible sur le blog. Notez que ceci est plus ancien que la version disponible sur github ci-dessus.

24
répondu Dan Fuller 2015-04-20 20:07:04

L'extension formater tous les fichiers a fonctionné pour moi. Rien à faire, il suffit d'installer et de cliquer!

17
répondu Mikhail 2017-07-03 07:26:56

Notez que la solution suivante ne fonctionne pas seule à partir de Visual Studio 2015. Vous devez également appliquer la réponse de Marcus Mangelsdorf. Ensuite, ce script fonctionne dans Visual Studio 2015 et 2017.


Phil Haack a décrit une bonne procédure - ajoutant un script réutilisable pour indenter le projet .

Ouvrez votre profil NuGet pour l'édition

  1. ouvrez le Gestionnaire de paquets;
  2. tapez $profile pour voir l'emplacement de votre NuGet profil;
  3. tapez mkdir –force (split-path $profile) pour créer le dossier du profil s'il n'existe pas;
  4. Modifier le profil avec la commande notepad $profile.

Ajoute la méthode réutilisable au profil NuGet

Phil a utilisé la méthode de davidfowl Format-Document qu'il a trouvée à 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 }
}

Rouvrez Visual Studio pour utiliser la commande

Lorsque vous rouvrez Visual Studio, la commande est disponible.

Exécutez-le simplement à partir du paquet NuGet Manager Console: {[4] } cela reformatera tous les fichiers du projet sélectionné.
Pour appliquer à l'ensemble de la solution, utilisez la commande Get-Project -All | Format-Document, qui répertorie les projets, puis pour chacun d'eux appelle la commande de reformatage.

Comme l'a dit l'auteur:

Avec cela en place, vous pouvez maintenant faire plaisir à votre TOC et exécuter la commande Format-Document pour nettoyer toute votre solution. Je l'ai juste couru contre et maintenant peut devenir le Nazi d'espace que j'ai toujours voulu être.

10/10, courrait à nouveau.

13
répondu ANeves 2017-08-29 19:56:32

Étape supplémentaire nécessaire pour Visual Studio 2015

La solution de Phil Haack Postée par ANeves est parfaite, mais pour une raison quelconque $item.FileCodeModel.Language renvoie toujours null dans Visual Studio 2015 ce qui rend le Format-Document ignorer tous les fichiers et ne rien faire efficacement.

Pour (hackily) contourner cette limitation, vous pouvez remplacer les Get-Language function:

# 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 }
    }
}

Avec la variante suivante qui utilise l'extension du fichier au lieu du GUID de langue:

# 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 }
   }            
}
10
répondu Marcus Mangelsdorf 2017-05-23 12:02:48