Visual studio &引用;Tabify";Visual Studio解决方案中的所有文件?

Visual studio &引用;Tabify";Visual Studio解决方案中的所有文件?,visual-studio,visual-studio-2010,tabs,Visual Studio,Visual Studio 2010,Tabs,中有一个“tabify”命令 编辑>高级>选项卡化选定行 (而且Power Tools 2010还以每个文件为基础提供此功能)但是有没有办法为解决方案中的所有代码文件提供此功能 ReSharper有一个清理命令,但我发现唯一半合适的选项是在所有文件上运行格式化,这比我想要的要多(我不想运行一个完整的格式化,只是Tabify)。据我所知,“Tabify”的作用是——它只用一个选项卡替换了“”(4个空格),它不会更改格式或任何其他内容 虽然我建议使用文档格式,但是“禁忌化”可以通过自定义应用程序轻松

中有一个“tabify”命令

编辑>高级>选项卡化选定行

(而且Power Tools 2010还以每个文件为基础提供此功能)但是有没有办法为解决方案中的所有代码文件提供此功能

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

据我所知,“Tabify”的作用是——它只用一个选项卡替换了“”(4个空格),它不会更改格式或任何其他内容

虽然我建议使用文档格式,但是“禁忌化”可以通过自定义应用程序轻松完成,该应用程序将在您想要的所有文件上模拟相同的操作


希望这有帮助

如果您添加了扩展名(如果您没有扩展名,我会推荐),那么它会添加一个选项来对文件进行tabify。这并不适用于解决方案中的所有文件,但在按文件编辑每个文件时会提示输入。不完全是你想要的,而是一个帮助


您还可以尝试将IDE编辑器设置设置为使用选项卡,然后使用菜单“编辑高级格式文档”(CTRL+E,D)。这将用一个制表符替换多组制表符长度的空格,该制表符应可通过宏为解决方案中的所有文件编写脚本。

请求包含指向可执行此任务的IDE宏的链接:

以下是Visual Studio宏的示例代码,该宏在开放式解决方案中自动格式化所有*.cs、*.h、*.cpp和*.hpp文件,包括将空间转换为选项卡(取决于工具>选项>文本编辑器>特定语言或“所有语言”>选项卡中的选项卡设置):

说明(Visual Studio 2005,但与较新版本类似):

  • 启动Visual Studio
  • 工具>宏>宏IDE
  • 右键单击我的宏>添加>添加新项
  • 选择模块
  • 在名称字段中输入不带引号的“ConvertSpacesToTabs”
  • 单击添加
  • 用上述代码替换新模块的内容
  • 单击保存
  • 关闭宏IDE
  • 工具>宏>宏资源管理器
  • 展开MyMacros>ConvertSpacesToTabs
  • 双击FormatSolution
  • 等待宏完成
  • 编辑
    我使用Siegmund Frenzel的代码更新了代码,以支持*.h、*.cpp和*.hpp文件,如下所示:

    对于vs2010,您可以使用以下查找和替换(此示例适用于制表符到4个空格)

    在查找框中,输入:
    ^{*}
    ^{
    空格
    *}
    选项卡)

    在替换框中,输入
    \1
    \1
    空格)

    选中条件框并设置为正则表达式。 较新版本的vs使用不同的正则表达式语法,但相同的语法应该是可行的

    更新
    这通过对vb文件执行一次来实现,但对resx文件需要多次执行,因此您可能需要根据文件类型执行多次…

    宏已从Visual Studio 2013中删除(并且使用JavaScript而不是VBScript),因此要在Visual Studio 2019中工作:

  • 下载并安装
  • 扩展>VCmd>编辑宏
  • 说出它的名字
  • 粘贴以下代码。我不得不对其进行一些更改,以使代码与VisualCommander一起工作。我还将其选项卡化的文件扩展名更改为
    .cs
    .aspx
    .ascx
    ,因此,如果需要C++/其他文件扩展名,请更改这些扩展名
  • 拯救
  • 保存以备将来使用:扩展>VCmd>将宏另存为命令>命名>保存

  • 有一种使用
    dotnet
    CLI的新方法:

  • 通过运行以下命令进行安装:
    dotnet工具安装-g dotnet格式
  • 运行它,用以下命令行将
    SolutionFile.sln
    替换为解决方案文件的路径:
    dotnet格式解决方案文件.sln

  • .editorconfig
    缩进样式将用于确定代码是否使用制表符或空格。

    嘿,关于这个问题有什么消息吗?有一个基于正则表达式的很好的解决方案:这个答案的可能重复对我帮助很大:您可以在解决方案的所有源代码上运行以下代码
    Regex.Replace(sInput,“4_spaces”,“\t”)它将以与Power Tools相同的方式对源代码进行选项卡化。将代码中的“4_空格”更改为实际空格,因为StackOverflow会删除多个空格。需要检查它,但可能会出现诸如自定义缩进之类的边缘情况,这可能需要特殊处理,全局搜索和替换可能无法正常工作。但是谢谢你的提示。克里斯·埃尔格尔链接+1。他的宏实现了OP的要求。Chris Eargle链接现在没有任何结果。@William,我在该页面的存档中添加了一个链接。谢谢。@Andrewornold,我已经更新了答案,包括源代码和说明。用户没有要求将空格转换为制表符,而不是将制表符转换为空格(“tabify”而不是“Unabify”)?请详细说明如何在VS2013中使用Microsoft Productivity Power Tools进行tabify?谢谢。当它检测到为tabbify或spaceify文件提供的混合选项卡和空格时,它会在编辑窗口顶部提供一个“提示栏”。如果你在保存的时候加载广告时,内存就支持这一点,我认为没有其他方法可以强制对文件执行此操作。如果你只是想修复标签/空间,这个扩展就可以做到:是的。我找到了提示栏。但是,似乎没有办法将整个解决方案的文件设置为选项卡。无论如何,再次感谢。我不明白为什么电动工具一直要求我使用tabify,同一个文件。。。
    
    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
    
    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