Je souhaite formater tous les fichiers d'un projet Visual Studio (ver. 2005) en une seule fois.
Actuellement, il existe un moyen de formater un seul document en faisant quelque chose comme Édition-> Avancé-> Formater le document. Cependant, je ne vois pas une seule commande pour formater tous les fichiers d'un projet à la fois.
Une idée de comment faire ça?
Tim Abell a écrit une macro pour le faire sur son blog :
Voici un script macro pratique pour Visual Studio que j'ai rencontré aujourd'hui. Il exécute "éditer, formater le document" sur chaque document des types de fichiers répertoriés.
Vous devez le surveiller car il est interactif et fait parfois apparaître un message et attend une réponse.
Vous pouvez obtenir le fichier vb sur https://github.com/timabell/vs-formatter-macro Plus d'informations sur https://github.com/timabell/vs-formatter- macro/wiki
Le code original est disponible sur le blog. Notez que c'est plus ancien que la version disponible sur github ci-dessus.
L'extension Format All Files a fonctionné pour moi. Rien à faire, il suffit d'installer et de cliquer!
Notez que la solution suivante ne fonctionne pas d'elle-même à partir de Visual Studio 2015. Vous devez également appliquer la réponse de Marcus Mangelsdorf. Ensuite, ce script fonctionne dans Visual Studio 2015 et 2017.
Phil Haack a décrit une bonne procédure - ajout d'un script réutilisable pour indenter le projet .
$profile
Pour voir l'emplacement de votre profil NuGet;mkdir –force (split-path $profile)
pour créer le dossier du profil s'il n'existe pas;notepad $profile
.Phil a utilisé la méthode Format-Document
De davidfowl qu'il a trouvée sur 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 }
}
Lorsque vous rouvrez Visual Studio, la commande est disponible.
Exécutez-le simplement à partir de la console NuGet Package Manager: Format-Document
Cela reformatera tous les fichiers du projet sélectionné.
Pour appliquer à l'ensemble de la solution, utilisez la commande Get-Project -All | Format-Document
, Qui répertorie les projets, puis pour chacun d'eux appelle la commande de reformatage.
Comme l'a dit l'auteur:
Avec cela en place, vous pouvez maintenant vous livrer à votre OCD et exécuter la commande Format-Document pour nettoyer l'intégralité de votre solution. Je viens de l'exécuter contre <Projet> et je peux maintenant devenir le nazi de l'espace que j'ai toujours voulu être.
10/10, fonctionnerait à nouveau.
La solution de Phil Haack publiée par ANeves est parfaite, mais pour une raison quelconque $item.FileCodeModel.Language
renvoie toujours null dans Visual Studio 2015 rendant le Format-Document
ignorer tous les fichiers et ne rien faire.
Pour ( hackily) contourner cette limitation, vous pouvez remplacer le Get-Language
fonction:
# 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 }
}
}
avec la variante suivante qui utilise l'extension du fichier au lieu du GUID de langue:
# 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 }
}
}