web-dev-qa-db-fra.com

Mise en forme - à la fois - de tous les fichiers d'un projet Visual Studio

Je souhaite formater tous les fichiers d'un projet Visual Studio (ver. 2005) en une seule fois.

Actuellement, il existe un moyen de formater un seul document en faisant quelque chose comme Édition-> Avancé-> Formater le 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?

50
Dan

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

Voici un script macro pratique pour Visual Studio que j'ai rencontré aujourd'hui. Il exécute "éditer, formater le document" sur chaque document des types de fichiers répertoriés.

Vous devez le surveiller car il est interactif et fait parfois apparaître un message et attend une réponse.

Vous pouvez obtenir le fichier vb sur https://github.com/timabell/vs-formatter-macro Plus d'informations sur https://github.com/timabell/vs-formatter- macro/wiki

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

26
Dan Fuller

L'extension Format All Files a fonctionné pour moi. Rien à faire, il suffit d'installer et de cliquer!

26
Mikhail

Notez que la solution suivante ne fonctionne pas d'elle-même à 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 - ajout d'un script réutilisable pour indenter le projet .

Ouvrez votre profil NuGet pour l'édition

  1. Ouvrez le gestionnaire de packages;
  2. Tapez $profile Pour voir l'emplacement de votre profil NuGet;
  3. Tapez mkdir –force (split-path $profile) pour créer le dossier du profil s'il n'existe pas;
  4. Modifiez le profil avec la commande notepad $profile.

Ajoutez la méthode réutilisable au profil NuGet

Phil a utilisé la méthode Format-Document De davidfowl qu'il a trouvée sur 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 de la console NuGet Package Manager: Format-Document 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 vous livrer à votre OCD et exécuter la commande Format-Document pour nettoyer l'intégralité de votre solution. Je viens de l'exécuter contre <Projet> et je peux maintenant devenir le nazi de l'espace que j'ai toujours voulu être.

10/10, fonctionnerait à nouveau.

15
ANeves

Étape supplémentaire requise pour Visual Studio 2015

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

Pour ( hackily) contourner cette limitation, vous pouvez remplacer le Get-Language fonction:

# 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 }
   }            
}
12
Marcus Mangelsdorf