Подтвердить что ты не робот

Форматирование - сразу - все файлы в проекте Visual Studio

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

В настоящее время существует способ форматирования одного документа, выполнив что-то вроде Правка- > Дополнительно- > Формат документа. Тем не менее, я не вижу единой команды для форматирования всех файлов проекта одновременно.

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

4b9b3361

Ответ 1

Тим Абелл написал макрос для этого в своем блоге:

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

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

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

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

Ответ 2

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

Ответ 3

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


Фил Хаак изложил хорошую процедуру - добавив многоразовый script для отступов проекта.

Откройте профиль NuGet для выпуска

  • Откройте диспетчер пакетов;
  • Введите $profile, чтобы увидеть местоположение вашего профиля NuGet;
  • Введите mkdir –force (split-path $profile), чтобы создать папку профиля, если она не существует;
  • Отредактируйте профиль командой notepad $profile.

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

Фил использовал метод 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 и запустить команду Format-Document для очистки всего вашего решения. Я просто запускал его против <Project> и теперь может стать пробелом нацистов, которым всегда хотелось быть.

10/10, снова запустится.

Ответ 4

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

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

Чтобы (взломать) обойти это ограничение, вы можете заменить функцию 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 }
   }            
}

Ответ 5

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

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