web-dev-qa-db-ja.com

書式設定-一度に-Visual Studioプロジェクトのすべてのファイル

Visual Studio(ver。2005)プロジェクトのすべてのファイルを一度にフォーマットすることに興味があります。

現在、Edit-> Advanced-> Format Documentのようにして、単一のドキュメントをフォーマットする方法があります。ただし、プロジェクトのすべてのファイルを一度にフォーマットする単一のコマンドが表示されません。

それを行う方法はありますか?

50
Dan

Tim Abellがこれを行うためのマクロを書いた blog

これが、今日一緒にノックしたビジュアルスタジオ用の便利なマクロスクリプトです。リストされたファイルタイプのすべてのドキュメントに対して「編集、フォーマットドキュメント」を実行します。

インタラクティブであり、メッセージをポップアップして回答を待つこともあるので、注意が必要です。

https://github.com/timabell/vs-formatter-macro でvbファイルを取得できます https://github.com/timabell/vs-formatter-マクロ/ウィキ

元のコードはブログ投稿で入手できます。これは上記のgithubで利用可能なバージョンより古いことに注意してください。

26
Dan Fuller

すべてのファイルをフォーマット 拡張子が私のために働いた。何もする必要はありません。インストールしてクリックするだけです!

26
Mikhail

Visual Studio 2015以降、次のソリューションはそれ自体では機能しないことに注意してください。MarcusMangelsdorfによる回答も適用する必要があります。次に、このスクリプトはVisual Studio 2015および2017で機能します。


Phil Haackは適切な手順の概要を説明しました 再利用可能なスクリプトを追加してプロジェクトをインデントする

NuGetプロファイルを編集用に開く

  1. パッケージマネージャーを開きます。
  2. NuGetプロファイルの場所を確認するには、_$profile_と入力します。
  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を堪能し、Format-Documentコマンドを実行してソリューション全体をクリーンアップできます。私は<Project>に対してそれを実行しました、そして今、私がずっとなりたかったナチの空白になることができます。

10/10、再び実行されます。

15
ANeves

Visual Studio 2015に必要な追加の手順

ANevesによって投稿されたPhil Haackのソリューション は完璧ですが、何らかの理由で$item.FileCodeModel.Languageは常にVisual Studio 2015でnullを返し、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 }
   }            
}
12