Formatação-de uma vez - todos os arquivos em um projeto de estúdio Visual

Estou interessado em formatar todos os ficheiros num estúdio Visual (ver. 2005) projecto de uma só vez.

actualmente, existe uma forma de formatar um único documento, fazendo algo como editar - >avançado - >formato Documento . No entanto, não vejo um único comando para formatar todos os arquivos de um projeto de uma só vez.

Faz ideia de como fazer isso?

Author: Deduplicator, 2009-05-31

4 answers

Tim Abell escreveu uma macro para fazer isso no seu blog.:
Aqui está um macro script prático para o visual studio que juntei hoje. Ele executa "editar, formatar o documento" em cada documento dos tipos de arquivos listados.

Você tem que manter um olho nele como ele é interativo e às vezes aparecer uma mensagem e esperar por uma resposta.

Podes obter o ficheiro vb em http://github.com/timabell/vs-formatter-macro Mais informações em http://wiki.github.com/timabell/vs-formatter-macro

O código original está disponível no post do blog. Note que esta é mais antiga do que a versão disponível no github acima.

 24
Author: Dan Fuller, 2015-04-20 20:07:04

A extensão formatou todos os ficheiros funcionou para mim. Nada a fazer, basta instalar e clicar!

 17
Author: Mikhail, 2017-07-03 07:26:56
Note que a seguinte solução não funciona por si só, começando pelo Visual Studio 2015. Você precisa aplicar a resposta de Marcus Mangelsdorf também. Então, este script funciona no Visual Studio 2015 e 2017.

Phil Haack delineou um bom procedimento - adicionando uma escrita reutilizável para indentar o projecto .

Abra o seu perfil NuGet para a edição

  1. abra o Gestor de pacotes;
  2. Tipo $profile para ver a localização do seu NuGet perfil;
  3. Tipo mkdir –force (split-path $profile) para criar a pasta do perfil se não existir;
  4. edite o perfil com o comando notepad $profile.

Adicione o método reutilizável ao perfil de NuGet

O Phil usou o método de davidfowl que encontrou em 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 }
}

Reabra o Visual Studio para usar o comando

Quando reabrires o Visual Studio, o comando está disponível.

Basta executá-lo a partir do pacote NuGet Consola do Gestor: Format-Document Isto irá formatar todos os ficheiros do projecto seleccionado.
Para se aplicar a toda a solução, use o comando Get-Project -All | Format-Document, que lista os projetos e, em seguida, para cada um deles chama o comando de reformatação.

Como disse o autor:

Com isto no lugar, pode agora satisfazer o seu TOC e executar o comando Format-Document para limpar toda a sua solução. E agora posso tornar-me no Nazi do espaço branco que sempre quis. ser.

10/10, voltaria a correr.
 13
Author: ANeves, 2017-08-29 19:56:32

Passo adicional necessário para o Visual Studio 2015

A solução de Phil Haack postada por ANeves é perfeita, mas por alguma razão $item.FileCodeModel.Language sempre retorna null em Visual Studio 2015 fazendo o Format-Document saltar todos os arquivos e efetivamente não fazer nada.

A ([15]}hackily ) contornar esta limitação pode substituir a função 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 }
    }
}

Com a seguinte variante que usa a extensão do ficheiro em vez da linguagem GUID:

# 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
Author: Marcus Mangelsdorf, 2017-05-23 12:02:48