2009-05-31 2 views
35

Я заинтересован в форматировании всех файлов в проекте Visual Studio (версия 2005) сразу.Форматирование - сразу - все файлы в проекте Visual Studio

В настоящее время существует способ форматирования одного документа, выполнив что-то вроде Edit-> Advanced-> Format Document. Однако я не вижу единой команды для форматирования всех файлов проекта одновременно.

Любая идея, как это сделать?

+1

[Resharper] (http://www.jetbrains.com/resharper/) обеспечивает очистку и форматирование кода, и это всего лишь часть его функциональности ... – Skyler

+1

Для дальнейшего использования обратите внимание, что макросы были удалены из [VS 2011] (http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/d8410838-085b-4647-8c42-e31b669c9f11). – Tilak

+2

Phil Haack говорит: http://haacked.com/archive/2011/05/22/an-obsessive-compulsive-guide-to-source-code-formatting.aspx – MZaragoza

ответ

24

Tim Abell написал макрос, чтобы сделать это на его blog:

Вот удобный макрос скрипт для визуальной студии я постучался сегодня вместе. Он запускает «редактировать, форматировать документ» в каждом документе перечисленных типов файлов.

Вы должны следить за ним, так как он является интерактивным и иногда появляется сообщение и ждет ответа.

Вы можете получить файл Vb на http://github.com/timabell/vs-formatter-macro Больше информации на http://wiki.github.com/timabell/vs-formatter-macro

Исходный код доступен на запись в блоге. Обратите внимание, что это больше, чем версия, доступная в github выше.

+2

wiki-страница для вышеуказанного https://github.com/timabell/vs-formatter-macro/wiki –

+1

Кажется, поддержка макросов была удалена из последних версий Visual Studio. – usr

0

Я не знаю команды, которая будет делать это для всех файлов в проекте для вас, но когда у вас есть файл кода, открытый в Visual Studio, вы можете использовать команду Edit-> Advanced-> Format Document (или нажать CTRL + K, а затем CTRL + D на клавиатуре). Это исправит форматирование в текущем файле кода.

Возможно, это не слишком сложно создать макрос, который делает это для полного проекта.

+1

Это не отвечает на вопрос - ОП знает, что он может сделать один файл. – mjs

+0

@mjs Это правильно. Это было отредактировано в текст вопроса после того, как мой ответ был опубликован. –

13

Обратите внимание, что следующее решение не работает само по себе, начиная с Visual Studio 2015. Вам также необходимо применить ответ Маркуса Мангельсдорфа. Затем этот скрипт работает в Visual Studio 2015 и 2017.


Фил Хаак обозначил хорошую процедуру - adding a reusable script to indent the project.

Открыть профиль NuGet для издания

  1. Откройте Диспетчер пакетов;
  2. Тип $profile для просмотра местоположения вашего профиля NuGet;
  3. Тип mkdir –force (split-path $profile) для создания папки с профилем, если он не существует;
  4. Редактировать профиль командой notepad $profile.

Добавьте многоразовый метод к профилю NuGet

Phil используется метод davidfowl в Format-Document, который он нашел в 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 } 
} 

Возобновить Visual Studio, чтобы использовать команду

При повторном Visual Studio, команда доступна.

Просто запустите его из консоли диспетчера пакетов NuGet: Format-Document Это приведет к переформатированию всех файлов выбранного проекта.
Чтобы применить ко всему решению, используйте команду Get-Project -All | Format-Document, в которой перечислены проекты, а затем для каждого из них вызывается команда переформатирования.

Как автор выразился:

При этом на месте, теперь вы можете побаловать свой OCD и выполнить команду Формат-документа, чтобы очистить весь раствор. Я просто запустил его против <Project> и теперь может стать пропуском нацистов, которым я всегда хотел быть.

10/10, будет работать снова.

+0

Я только что запустил это, и он прошел только мою папку App_Code ... – Kristopher

+0

@ Kristopher для меня это сработало отлично, оно пересекло все файлы C# из нескольких проектов моего решения, но это WPF, а не ASP.NET. Какие другие папки вы ожидали, что он пройдет? Возможно, есть проблема со сценарием, с которым я не сталкивался. – ANeves

+0

Я использовал бета-версию ReSharper, чтобы это сделать, поэтому не стоит беспокоиться, но в основном она, похоже, пропустила все остальное в каталоге решений ... – Kristopher

10

Дополнительный шаг, необходимый для Visual Studio 2015

Phil Haack's solution posted by ANeves совершенен, но по какой-то причине $item.FileCodeModel.Language всегда возвращает нуль в Visual Studio 2015 делает Format-Document пропустить все файлы и эффективно ничего не делать.

К (hackily) обойти это ограничение, вы можете заменить 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 } 
    } 
} 

со следующим вариантом, который использует расширение файла вместо языка 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 } 
    }    
} 
+1

Я изменил код следующим образом: 'switch ($ ext) { '.cs' {'C#'} '.vb' {'VB'} default {$ null} }', чтобы предотвратить форматирование из файлов VB или C#. – HHenn

+0

Работает на 2017, а также –

13

Расширение Format All Files работало для меня. Нечего делать, просто установите и нажмите!

+1

Кто-нибудь читает этот, кто хочет только выбранные типы файлов. Прочтите страницу расширения, в которой говорится, как это сделать. – GregP

Смежные вопросы