中有一个“tabify”命令
编辑>高级>选中选定的行
(并且Power Tools 2010也基于每个文件提供此功能)但是有没有办法为解决方案中的所有代码文件执行此操作?
ReSharper有一个清理命令,但我找到的唯一一半合适的选项是在所有文件上运行格式化,这比我想要的更多(我不想运行完整的格式化,只是列表化)。
答案 0 :(得分:16)
如果您添加了 Microsoft Productivity Power tools 扩展程序(如果您还没有我推荐),则会添加一个选项来标记文件。这不适用于解决方案中的所有文件,但在每个文件的基础上编辑每个文件时会提示它。不是你想要的,而是一个帮助。
您也可以尝试将IDE编辑器设置设置为使用选项卡,然后执行菜单编辑 - 高级格式文档(CTRL + E,D)。这将使用选项卡替换选项卡长度空间组,并且应该通过宏为解决方案中的所有文件设置脚本。
答案 1 :(得分:4)
请求包含可以执行此任务的IDE宏的链接:
http://blogs.msdn.com/b/kevinpilchbisson/archive/2004/05/17/133371.aspx
http://web.archive.org/web/20090217094033/http://chriseargle.com/post/Format-Solution.aspx
以下是Visual Studio宏的示例代码,它在打开的解决方案中自动格式化所有* .cs,*。h,* .cpp和* .hpp文件,其中包括将空格转换为标签(取决于您的标签设置)在工具>选项>文字编辑器>特定语言或“所有语言”>标签中):
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://stackoverflow.com/a/14766393/90287
答案 2 :(得分:3)
据我所知,“Tabify”的作用是什么 - 它只用一个标签替换“”(4个空格),它不会改变格式或其他任何内容。
虽然我建议使用文档格式,但可以通过自定义应用程序轻松完成“制表”,该应用程序可以模仿您想要的所有文件上的相同操作。
希望这有帮助!
答案 3 :(得分:1)
对于vs2010,您可以使用以下查找和替换(此示例适用于4个空格的标签页)。
在搜索框中输入:^{ *}
(^{
空格*}
标签)
在替换框中,输入\1
(\1
空间空间)
检查条件框并设置为正则表达式。 较新版本的vs使用不同的正则表达式语法,但同样应该是可行的。
更新 这适用于对vb文件执行一次,但需要多次传递resx文件,因此您可能必须执行多次,具体取决于文件类型...
答案 4 :(得分:1)
有一种使用dotnet
CLI的新方法:
dotnet tool install -g dotnet-format
SolutionFile.sln
替换为解决方案文件的路径:dotnet format SolutionFile.sln
indent_style
中的.editorconfig
将用于确定代码是否使用制表符或空格。
答案 5 :(得分:0)
从Visual Studio 2013起,宏已被删除(new version of Macros使用JavaScript而不是VBScript),以便使Rami A.'s answer在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