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



visual studio format on save (4)

Je suis intéressé par le formatage simultané de tous les fichiers d’un projet Visual Studio (version 2005).

Actuellement, il existe un moyen de formater un seul document en faisant quelque chose comme Edition-> Avancé-> Formater le document . Cependant, je ne vois pas une seule commande pour formater tous les fichiers d'un projet en même temps.

Une idée comment faire ça?


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 présenté une bonne procédure: ajouter un script réutilisable pour mettre en retrait le projet .

Ouvrez votre profil NuGet pour l'édition

  1. Ouvrez le gestionnaire de paquets.
  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. Editez le profil avec la commande notepad $profile .

Ajouter la méthode réutilisable au profil NuGet

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

Il suffit de l’exécuter à partir de la console NuGet Package Manager: Format-Document Ceci reformatera tous les fichiers du projet sélectionné.
Pour appliquer à la solution complète, utilisez la commande Get-Project -All | Format-Document Get-Project -All | Format-Document , qui répertorie les projets et appelle pour chacun d'eux la commande de reformatage.

Comme le dit l'auteur:

Ceci mis en place, vous pouvez désormais utiliser votre OCD et exécuter la commande Format-Document pour nettoyer l'ensemble de votre solution. Je viens de le lancer contre <Projet> et je peux maintenant devenir le nazi des espaces que j'ai toujours voulu être.

10/10, serait exécuté à nouveau.


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


Tim Abell a écrit une macro pour le faire sur son timwise.blogspot.com/2009/01/… :

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

Vous devez garder un œil dessus car il est interactif et affiche parfois un message et attend une réponse.

Vous pouvez obtenir le fichier vb à l’ http://wiki.github.com/timabell/vs-formatter-macro http://github.com/timabell/vs-formatter-macro Plus d’informations à l’ http://wiki.github.com/timabell/vs-formatter-macro

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


É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 la valeur null dans Visual Studio 2015, $item.FileCodeModel.Language Format-Document ignorer tous les fichiers et à ne rien faire.

Pour contourner cette limitation, vous pouvez remplacer la fonction Get-Language :

# 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 à la place 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 }
   }            
}




formatting