在编辑器中有一个“tabify”命令:
编辑 > 高级 > Tabify选定行
(而且Power Tools 2010也提供了每个文件的此功能),但是是否有办法对解决方案中的所有代码文件执行此操作?
ReSharper中有一个“清理代码”命令,但我在那里找到的唯一半适合的选项是运行格式化程序以应用于所有文件,这比我想要的要多(我不想运行完整的格式化,只想进行制表符调整)。
在编辑器中有一个“tabify”命令:
编辑 > 高级 > Tabify选定行
(而且Power Tools 2010也提供了每个文件的此功能),但是是否有办法对解决方案中的所有代码文件执行此操作?
ReSharper中有一个“清理代码”命令,但我在那里找到的唯一半适合的选项是运行格式化程序以应用于所有文件,这比我想要的要多(我不想运行完整的格式化,只想进行制表符调整)。
如果你已经添加了Microsoft Productivity Power tools扩展程序(如果还没有,我建议你这样做),它会增加一个选项来将文件标签化。这不适用于解决方案中的所有文件,而是在每个文件上编辑时针对每个文件提示。虽然不完全符合你的要求,但是有所帮助。
此外,你可以尝试将IDE编辑器设置为使用制表符,然后进行菜单-编辑-高级格式化文档(CTRL+E,D)。这将用制表符替换一组制表符长度的空格,并且这应该可以通过宏脚本应用于解决方案中的所有文件。
这里是一个Visual Studio宏的示例代码,可以自动格式化打开解决方案中所有*.cs、*.h、*.cpp和*.hpp文件,其中包括将空格转换为制表符(具体取决于您在“工具”>“选项”>“文本编辑器”>特定语言或“所有语言”>标签中的Tab设置):
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Public Module ConvertTabsToSpaces
Public Sub FormatSolution()
Dim sol As Solution = DTE.Solution
For i As Integer = 1 To sol.Projects.Count
FormatProject(sol.Projects.Item(i))
Next
End Sub
Private Sub FormatProject(ByVal proj As Project)
If Not proj.ProjectItems Is Nothing Then
For i As Integer = 1 To proj.ProjectItems.Count
FormatProjectItem(proj.ProjectItems.Item(i))
Next
End If
End Sub
Private Sub FormatProjectItem(ByVal projectItem As ProjectItem)
If projectItem.Kind = Constants.vsProjectItemKindPhysicalFile Then
If projectItem.Name.LastIndexOf(".cs") = projectItem.Name.Length - 3 Then
Dim window As Window = projectItem.Open(Constants.vsViewKindCode)
window.Activate()
projectItem.Document.DTE.ExecuteCommand("Edit.FormatDocument")
window.Close(vsSaveChanges.vsSaveChangesYes)
ElseIf ((projectItem.Name.LastIndexOf(".cpp") = projectItem.Name.Length - 4) OrElse (projectItem.Name.LastIndexOf(".hpp") = projectItem.Name.Length - 4) OrElse (projectItem.Name.LastIndexOf(".h") = projectItem.Name.Length - 2)) Then
Dim window As Window = projectItem.Open(Constants.vsViewKindCode)
window.Activate()
projectItem.Document.DTE.ExecuteCommand("Edit.SelectAll")
projectItem.Document.DTE.ExecuteCommand("Edit.FormatSelection")
window.Close(vsSaveChanges.vsSaveChangesYes)
End If
End If
'Be sure to format all of the ProjectItems.
If Not projectItem.ProjectItems Is Nothing Then
For i As Integer = 1 To projectItem.ProjectItems.Count
FormatProjectItem(projectItem.ProjectItems.Item(i))
Next
End If
'Format the SubProject if it exists.
If Not projectItem.SubProject Is Nothing Then
FormatProject(projectItem.SubProject)
End If
End Sub
End Module
操作步骤(适用于Visual Studio 2005,新版本类似):
编辑
我更新了代码,使用Siegmund Frenzel的代码来支持*.h、*.cpp和*.hpp文件,请参见以下链接:
https://dev59.com/v1HTa4cB1Zd3GeqPPCrN#14766393
Regex.Replace (sInput, "4_spaces", "\t");
,它将以 Power Tools 相同的方式制表符化源代码。请将代码中的 "4_spaces" 更改为实际空格,因为 StackOverflow 会删除多个空格。 - brokenisfixed有一个使用dotnet
CLI的新方法:
dotnet tool install -g dotnet-format
SolutionFile.sln
替换为您的解决方案文件的路径:dotnet format SolutionFile.sln
.editorconfig
的indent_style
将用于确定代码是否使用制表符或空格。
对于vs2010,您可以使用以下查找和替换(此示例用于将制表符替换为4个空格)。
在查找框中输入:^{ *}
(^{
空格*}
制表符)
在替换框中输入 \1
(\1
空格空格空格空格)
选中条件框并设置为正则表达式。 较新版本的vs使用不同的正则表达式语法,但应该可以做到相同效果。
更新 对于vb文件,执行一次即可成功,但对于resx文件需要多次执行,因此,根据文件类型的不同,您可能需要执行多次操作...
从Visual Studio 2013开始,宏已被移除(新版本的宏使用JavaScript而不是VBScript),因此要使Rami A.的答案在Visual Studio 2019中工作:
.cs
、.aspx
和.ascx
,因此如果需要C++/其他文件扩展名,请更改这些内容。Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Imports Microsoft.VisualStudio.Shell
Imports VisualCommanderExt
Public Class ConvertTabsToSpaces
Implements ICommand
Sub Run(DTE As DTE2, package As Package) Implements ICommand.Run
Dim sol As Solution = dte.Solution
For i As Integer = 1 To sol.Projects.Count
FormatProject(sol.Projects.Item(i))
Next
End Sub
Private Sub FormatProject(ByVal proj As Project)
If Not proj.ProjectItems Is Nothing Then
For i As Integer = 1 To proj.ProjectItems.Count
FormatProjectItem(proj.ProjectItems.Item(i))
Next
End If
End Sub
Private Sub FormatProjectItem(ByVal projectItem As ProjectItem)
If projectItem.Kind = Constants.vsProjectItemKindPhysicalFile Then
If (projectItem.Name.LastIndexOf(".cs") = projectItem.Name.Length - 3 OrElse (projectItem.Name.LastIndexOf(".aspx") = projectItem.Name.Length - 5 OrElse (projectItem.Name.LastIndexOf(".ascx") = projectItem.Name.Length - 5))) Then
Dim window As Window = projectItem.Open(Constants.vsViewKindCode)
window.Activate()
Try
projectItem.Document.DTE.ExecuteCommand("Edit.RemoveAndSort")
Catch
' Do nothing
End Try
Try
projectItem.Document.DTE.ExecuteCommand("Edit.SelectAll")
projectItem.Document.DTE.ExecuteCommand("Edit.FormatSelection")
Catch
' Do nothing
End Try
window.Close(vsSaveChanges.vsSaveChangesYes)
End If
End If
'Be sure to format all of the ProjectItems
If Not projectItem.ProjectItems Is Nothing Then
For i As Integer = 1 To projectItem.ProjectItems.Count
FormatProjectItem(projectItem.ProjectItems.Item(i))
Next
End If
'Format the SubProject if it exists
If Not projectItem.SubProject Is Nothing Then
FormatProject(projectItem.SubProject)
End If
End Sub
End Class