it-swarm.cn

如何在Visual Studio 2008中自动删除尾随空格?

是否可以将Visual Studio 2008配置为在保存文件时自动删除每行末尾的空格字符?似乎没有内置选项,所以有没有可用于执行此操作的扩展?

119
ChrisN

CodeMaid是一个非常流行的Visual Studio扩展,可以自动执行此操作以及其他有用的清理。

我将其设置为在保存时清理文件,我认为这是默认设置。

64
arserbin3

使用正则表达式查找/替换

在查找和替换对话框中,展开 查找选项 ,选中 使用 ,选择 正则表达式

查找内容 :“:Zs#$

用。。。来代替 : ””

点击 全部替换

在其他编辑器中(一个 正常 正则表达式解析器)“:Zs#$”将是“\s*$”。

71
Greg Ogle

您可以创建一个在保存后执行的宏来为您执行此操作。

将以下内容添加到您的宏的EnvironmentEvents模块中。

Private saved As Boolean = False
Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
                                         Handles DocumentEvents.DocumentSaved
    If Not saved Then
        Try
            DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                                 "\t", _
                                 vsFindOptions.vsFindOptionsRegularExpression, _
                                 "  ", _
                                 vsFindTarget.vsFindTargetCurrentDocument, , , _
                                 vsFindResultsLocation.vsFindResultsNone)

            ' Remove all the trailing whitespaces.
            DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                                 ":Zs+$", _
                                 vsFindOptions.vsFindOptionsRegularExpression, _
                                 String.Empty, _
                                 vsFindTarget.vsFindTargetCurrentDocument, , , _
                                 vsFindResultsLocation.vsFindResultsNone)

            saved = True
            document.Save()
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
        End Try
    Else
        saved = False
    End If
End Sub

我已经使用了一段时间,没有任何问题。我没有创建宏,但是从ace_guidelines.vsmacros中修改它,可以通过快速谷歌搜索找到它。

30
Dyaus

保存之前,您可以使用自动格式快捷方式 CTRL+K+D

16
Vyrotek

您可以使用以下三个操作轻松完成此操作:

  • Ctrl + A (选择所有文字)

  • 编辑 - >高级 - >删除水平空格

  • 编辑 - >高级 - >格式选择

等几秒钟完成。

它的 Ctrl + Z'万一出了问题。

9
iPixel

从已经给出的所有答案中取出元素,这是我最终得到的代码。 (我主要编写C++代码,但根据需要很容易检查不同的文件扩展名。)

感谢所有贡献的人!

Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
    Handles DocumentEvents.DocumentSaved
    Dim fileName As String
    Dim result As vsFindResult

    Try
        fileName = document.Name.ToLower()

        If fileName.EndsWith(".cs") _
        Or fileName.EndsWith(".cpp") _
        Or fileName.EndsWith(".c") _
        Or fileName.EndsWith(".h") Then
            ' Remove trailing whitespace
            result = DTE.Find.FindReplace( _
                vsFindAction.vsFindActionReplaceAll, _
                "{:b}+$", _
                vsFindOptions.vsFindOptionsRegularExpression, _
                String.Empty, _
                vsFindTarget.vsFindTargetFiles, _
                document.FullName, _
                "", _
                vsFindResultsLocation.vsFindResultsNone)

            If result = vsFindResult.vsFindResultReplaced Then
                ' Triggers DocumentEvents_DocumentSaved event again
                document.Save()
            End If
        End If
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
    End Try
End Sub
7
ChrisN
3
Jorge Ferreira

我正在使用 _ vwd _ 2010 Express,其中不支持宏。所以我只是复制/粘贴到 Notepad ++ 左上菜单Edit> Blank Operations> Trim Trailing Space还有其他相关操作可用。然后复制/粘贴回Visual Studio。

也可以使用 NetBeans 而不是Notepad ++,它在“Source”菜单下有“Remove trailing spaces”。

2
Evgenii

除非这是一个人的项目,否则不要这样做。将本地文件与源代码存储库区分开来是非常简单的,清除空格会改变您不需要更改的行。我完全理解;我喜欢让我的空白都统一 - 但为了更清洁的合作,你应该放弃这一点。

1
Kevin Conner

我认为 Jeff Muir 版本如果只修剪源代码文件(在我的情况下是C#,但很容易添加更多扩展)可能会有所改进。另外,我添加了一个检查以确保文档窗口可见,因为某些没有检查的情况会显示奇怪的错误(例如,LINQ to SQL文件'* .dbml')。

Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) Handles DocumentEvents.DocumentSaved
    Dim result As vsFindResult
    Try
        If (document.ActiveWindow Is Nothing) Then
            Return
        End If
        If (document.Name.ToLower().EndsWith(".cs")) Then
            document.Activate()
            result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, ":Zs+$", vsFindOptions.vsFindOptionsRegularExpression, String.Empty, vsFindTarget.vsFindTargetCurrentDocument, , , vsFindResultsLocation.vsFindResultsNone)
            If result = vsFindResult.vsFindResultReplaced Then
                document.Save()
            End If
        End If
    Catch ex As Exception
        MsgBox(ex.Message & Chr(13) & "Document: " & document.FullName, MsgBoxStyle.OkOnly, "Trim White Space exception")
    End Try
End Sub
1
David Abella

我个人喜欢Trailing Whitespace VisualizerVisual Studio扩展,它通过Visual Studio 2012提供支持。

1
pwhe23

我使用 ArtisticStyle (C++)来执行此操作并重新格式化我的代码。但是,我不得不将其添加为外部工具,您需要自己触发它,这样您可能不喜欢它。

但是,我觉得很好,我可以用更自定义的方式重新格式化代码(例如,多行函数参数),我可以付出手动运行它的代价。该工具是免费的。

0
Marcin Gil

基于Dyaus的答案和 连接报告中的正则表达式 ,这是一个处理全部保存的宏,不会用空格替换制表符,也不需要静态变量。它可能的缺点?它似乎有点慢,可能是由于多次调用FindReplace

Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
                                         Handles DocumentEvents.DocumentSaved
    Try
        ' Remove all the trailing whitespaces.
        If vsFindResult.vsFindResultReplaced = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                             "{:b}+$", _
                             vsFindOptions.vsFindOptionsRegularExpression, _
                             String.Empty, _
                             vsFindTarget.vsFindTargetFiles, _
                             document.FullName, , _
                             vsFindResultsLocation.vsFindResultsNone) Then
            document.Save()
        End If
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
    End Try
End Sub

对于其他试图在Visual Studio 2012加载项中使用它的人,我最终使用的正则表达式是[ \t]+(?=\r?$)(如果需要,不要忘记转义反斜杠)。我经过几次徒劳的尝试来到这里来解决问题与 原始转换{:b}+$无法匹配回车。

0
Michael Urman

我想我有一个版本的这个宏不会在重构上崩溃VS2010,并且在保存非文本文件时也不会挂起IDE。试试这个:

Private Sub DocumentEvents_DocumentSaved( _
    ByVal document As EnvDTE.Document) _
    Handles DocumentEvents.DocumentSaved
    ' See if we're saving a text file
    Dim textDocument As EnvDTE.TextDocument = _
        TryCast(document.Object(), EnvDTE.TextDocument)

    If textDocument IsNot Nothing Then
        ' Perform search/replace on the text document directly
        ' Convert tabs to spaces
        Dim convertedTabs = textDocument.ReplacePattern("\t", "    ", _
            vsFindOptions.vsFindOptionsRegularExpression)

        ' Remove trailing whitespace from each line
        Dim removedTrailingWS = textDocument.ReplacePattern(":Zs+$", "", _
            vsFindOptions.vsFindOptionsRegularExpression)

        ' Re-save the document if either replace was successful
        ' (NOTE: Should recurse only once; the searches will fail next time)
        If convertedTabs Or removedTrailingWS Then
            document.Save()
        End If
    End If
End Sub
0
Julian