我有兴趣一次性格式化 Visual Studio(2005 版)项目中的所有文件。
目前,有一种方法可以通过执行诸如编辑->高级->格式化文档之类的操作来格式化单个文档。但是,我没有看到一个命令可以一次性格式化项目的所有文件。
知道该怎么做吗?
这是我今天拼凑出来的一个方便的 Visual Studio 宏脚本。 它对列出的文件类型的每个文档运行“编辑、格式化文档”。
您必须密切关注它,因为它是交互式的,有时会弹出一条消息并等待答复。您可以在
https://github.com/timabell/vs-formatter-macro 获取 vb 文件更多信息请访问
https://github.com/timabell/vs-formatter-macro/wiki
请注意,从 Visual Studio 2015 开始,以下解决方案本身无法正常工作。您还需要应用 Marcus Mangelsdorf 的答案。然后,该脚本可在 Visual Studio 2015 和 2017 中运行。
添加可重用脚本来缩进项目
。$profile
mkdir –force (split-path $profile)
创建配置文件的文件夹(如果不存在);notepad $profile
编辑配置文件。将可重用方法添加到 NuGet 配置文件
Format-Document
:
找到了
# 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 后,该命令可用。
Format-Document
这将重新格式化所选项目的所有文件。
要应用于整个解决方案,请使用命令Get-Project -All | Format-Document
,该命令列出项目,然后为每个项目调用重新格式化命令。
完成此操作后,您现在可以尽情享受强迫症并运行 Format-Document 命令来清理整个解决方案。我刚刚与
进行了对抗,现在可以成为我一直想成为的空白纳粹分子。
10/10,会再次运行。
Visual Studio 2015 需要额外的步骤
$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 }
}
}
有一种使用
dotnet