“Tabify”Visual Studio解决方案中的所有文件?

时间:2010-06-14 07:23:29

标签: visual-studio visual-studio-2010 tabs

中有一个“tabify”命令
  

编辑>高级>选中选定的行

(并且Power Tools 2010也基于每个文件提供此功能)但是有没有办法为解决方案中的所有代码文件执行此操作?

ReSharper有一个清理命令,但我找到的唯一一半合适的选项是在所有文件上运行格式化,这比我想要的更多(我不想运行完整的格式化,只是列表化)。

6 个答案:

答案 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,但对于较新版本类似):

  1. 启动Visual Studio
  2. 工具>宏>宏IDE ...
  3. 右键单击MyMacros>添加>添加新项目......
  4. 选择模块
  5. 在名称字段
  6. 中输入不带引号的“ConvertSpacesToTabs”
  7. 点击添加
  8. 用上面的代码替换新模块的内容
  9. 点击保存
  10. 关闭宏IDE
  11. 工具>宏>宏资源管理器
  12. 展开MyMacros> ConvertSpacesToTabs
  13. 双击FormatSolution
  14. 等待宏完成
  15. 修改
    我使用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的新方法:

  1. 通过运行以下命令来安装dotnet format
    dotnet tool install -g dotnet-format
  2. 运行它,并使用以下命令行将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中工作:

  1. 下载并安装Visual Commander extension
  2. 扩展程序> VCmd>编辑宏
  3. 命名
  4. 粘贴以下代码。我必须对其进行一些更改才能使代码与Visual Commander一起使用。我还将它制表的文件扩展名更改为.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
  1. 保存
  2. 运行
  3. 要保存以备将来使用:扩展> VCmd>将宏另存为命令>命名>保存