2009-05-31 11 views
35

Estoy interesado en formatear todos los archivos en un proyecto de Visual Studio (ver. 2005) a la vez.Formateo - de una vez - todos los archivos en un proyecto de Visual Studio

Actualmente, hay una forma de formatear un solo documento haciendo algo como Editar-> Avanzado-> Documento de formato. Sin embargo, no veo un solo comando para formatear todos los archivos de un proyecto a la vez.

¿Alguna idea de cómo hacer eso?

+1

[Resharper] (http://www.jetbrains.com/resharper/) proporciona la limpieza y el formateo del código y eso es solo una fracción de su funcionalidad ... – Skyler

+1

Solo como referencia futura, tenga en cuenta que las macros se han eliminado de [VS 2011] (http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/d8410838-085b-4647-8c42-e31b669c9f11). – Tilak

+2

Phil Haack dice: http://haacked.com/archive/2011/05/22/an-obsessive-compulsive-guide-to-source-code-formatting.aspx – MZaragoza

Respuesta

24

Tim Abell escribió una macro para hacer esto en su blog:

Aquí es una secuencia de comandos de macro útil para el estudio visual Toqué juntos hoy. Ejecuta "editar, formatear documento" en cada documento de los tipos de archivo enumerados.

Debe tenerlo en cuenta ya que es interactivo y algunas veces muestra un mensaje y espera una respuesta.

, usted puede obtener el archivo vb en http://github.com/timabell/vs-formatter-macro Más información en http://wiki.github.com/timabell/vs-formatter-macro

El código original está disponible en la entrada del blog. Tenga en cuenta que esto es anterior a la versión disponible en github anterior.

+2

página wiki para la anterior https://github.com/timabell/vs-formatter-macro/wiki –

+1

Parece que la compatibilidad con macros se eliminó de las versiones recientes de Visual Studio. – usr

0

No conozco ningún comando que haga esto para todos los archivos de un proyecto, pero cuando tiene un archivo de código abierto en Visual Studio, puede usar el comando Editar-> Avanzado-> Formatear documento (o pulsar CTRL + K seguido de CTRL + D en el teclado). Esto arreglará el formato en el archivo de código actual.

Probablemente no sea demasiado complicado crear una macro que haga esto para el proyecto completo.

+1

Esto no responde a la pregunta: el OP sabe que puede hacer un solo archivo. – mjs

+0

@mjs Eso es correcto. Eso fue editado en el texto de la pregunta después de que se publicó mi respuesta. –

13

Tenga en cuenta que la solución siguiente no funciona por sí solo a partir de Visual Studio 2015. También debe aplicar la respuesta de Marcus Mangelsdorf. Entonces, este script funciona en Visual Studio 2015 y 2017.


Phil Haack esbozó un buen procedimiento - adding a reusable script to indent the project.

Abra su perfil NuGet para la edición

  1. Abra el Administrador de paquetes;
  2. Escriba $profile para ver la ubicación de su perfil NuGet;
  3. Escriba mkdir –force (split-path $profile) para crear la carpeta del perfil si no existe;
  4. Edite el perfil con el comando notepad $profile.

Añadir el método reutilizable al perfil NuGet

Phil utiliza el método de davidfowl Format-Document que encontró en 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 } 
} 

Vuelva a abrir Visual Studio para utilizar el comando

Al volver a abrir Visual Studio, el comando está disponible.

Simplemente ejecútelo desde NuGet Package Manager Console: Format-Document Esto reformateará todos los archivos del proyecto seleccionado.
Para aplicar a toda la solución, use el comando Get-Project -All | Format-Document, que enumera los proyectos y luego para cada uno de ellos llama al comando de reformateo.

Como el autor lo puso:

Con esto en su lugar, ahora puede satisfacer su TOC y ejecutar el comando Format-documento para limpiar toda la solución. Simplemente lo ejecuté contra <Project> y ahora puedo convertirme en el nazi de espacio en blanco que siempre he querido ser.

10/10, se ejecutará de nuevo.

+0

Acabo de ejecutar esto y solo atravesé mi carpeta App_Code ... – Kristopher

+0

@Kristopher para mí funcionó bien, atravesó todos los archivos C# de los múltiples proyectos de mi solución, pero es WPF y no ASP.NET. ¿Qué otras carpetas esperabas que atravesara? Tal vez haya un problema con el guión con el que no me encontré. – ANeves

+0

Utilicé ReSharper beta para hacer esto, así que no te preocupes, pero básicamente parece haber perdido todo lo demás en el directorio de la solución ... – Kristopher

10

Paso adicional necesario para Visual Studio 2015

Phil Haack's solution posted by ANeves es perfecto, pero por alguna razón $item.FileCodeModel.Language siempre devuelve un valor nulo en Visual Studio 2015 haciendo que el Format-Document omitir todos los archivos y efectivamente no hacen nada.

A (hackily) evitar esta limitación puede reemplazar la función 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 } 
    } 
} 

con la siguiente variante que utiliza la extensión del archivo en lugar del GUID Idioma:

# 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

He cambiado el código de la siguiente manera: 'switch ($ ext) { '.cs' {'C#'} '.vb' {'VB'} predeterminado {$ nulo} }' para evitar el formateo de ninguno archivos VB o C#. – HHenn

+0

Funciona en 2017 así como –

13

La extensión Format All Files funcionó para mí. ¡Nada que hacer, solo instale y haga clic!

+1

Cualquiera que lea esto y solo quiere los tipos de archivos seleccionados. Lea la página de extensión y dice cómo hacerlo. – GregP

Cuestiones relacionadas