Как автоматически удалить конечные пробелы в Visual Studio 2008?

можно ли настроить Visual Studio 2008 для автоматического удаления пробелов в конце каждой строки при сохранении файла? Кажется, что нет встроенной опции, поэтому есть ли какие-либо расширения, доступные для этого?

16 ответов


CodeMaid является очень популярным расширением Visual Studio и делает это автоматически вместе с другими полезными очистками.

Я это для очистки файла при сохранении, который я считаю по умолчанию.


найти / заменить с помощью регулярных выражений

в диалоговом окне найти и заменить разверните Найти Варианты, Регистрация использовать выберите регулярные выражения

Найти:":Zs#$"

заменить на: ""

клик Заменить Все

в других редакторах (a нормальный анализатор регулярных выражений)":Zs#$" будет "\s*$".


вы можете создать макрос, который выполняется после сохранения, чтобы сделать это для вас.

добавьте следующее В модуль 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, который можно найти с помощью быстрого поиска google.


перед сохранением вы можете использовать авто-формат ярлык CTRL+K+D.


вы можете сделать это легко с этих трех действий:

  • Ctrl + A (выделить весь текст)

  • Изменить - > Дополнительно - > Удалить Горизонтальные Пробелы

  • Редактировать - > Дополнительно - > Выбор Формата

подождите несколько секунд и готово.

Это Ctrl + Z'в состоянии, если что-то пошло не так.


принимая элементы из всех уже данных ответов, вот код, который я закончил. (Я в основном пишу код на 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

вы можете использовать макрос как описано в удаление пробелов и перезапись комментариев, используя regex searches


Я использую VWD 2010 Express, где макросы не поддерживаются, к сожалению. Поэтому я просто копирую / вставляю в Блокнот++ верхнее левое меню Edit>Blank Operations>Trim Trailing Space доступны и другие связанные операции. Затем скопируйте / вставьте обратно в Visual Studio.

можно использовать NetBeans вместо Notepad++, который имеет " удалить конечные пробелы "в меню" Источник".


Если это не проект для одного человека, не делайте этого. Это должно быть тривиально, чтобы отличить ваши локальные файлы от вашего репозитория исходного кода, и очистка пробелов изменит строки, которые вам не нужно менять. Я полностью понимаю; я люблю, чтобы мои пробелы все единообразные – но это то, что вы должны отказаться ради более чистого сотрудничества.


думаю, что Джефф Мьюир версия может быть немного улучшена, если она только обрезает файлы исходного кода (в моем случае C#, но легко добавить больше расширений). Также я добавил проверку, чтобы убедиться, что окно документа видно, потому что некоторые ситуации без этой проверки показывают мне странные ошибки (LINQ to SQL files '*.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

Я лично люблю Пробельный Визуализатор расширение Visual Studio, которое имеет поддержку через Visual Studio 2012.


Я думаю, что у меня есть версия этого макроса, которая не будет сбой 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

Я использую ArtisticStyle (C++) для этого, а также переформатировать мой код. Однако я должен был добавить это как внешний инструмент, и вам нужно запустить его самостоятельно, чтобы вам это не понравилось.

тем не менее, я считаю отличным, что я могу переформатировать код более пользовательским способом (например, параметры многострочной функции), чтобы я мог заплатить цену за его запуск вручную. Инструмент является бесплатным.


основываясь на ответе Дьяуса и регулярном выражении от отчет о подключении, вот макрос, который обрабатывает сохранить все, не заменяет вкладки пробелами и не требует статической переменной. Его возможный недостаток? Это кажется немного медленным, возможно из-за нескольких вызовов 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?$) (Не забудьте избежать обратных косых черт, если необходимый.) Я приехал сюда после нескольких тщетных попыток исправить проблемы с конвертация RAW of {:b}+$ не соответствует возврату каретки.


Это действительно хороший пример того, как удалить конечные пробелы. Есть несколько вещей, которые я бы изменил на основе того, что я обнаружил с помощью этого макроса. Прежде всего, макрос автоматически преобразует вкладки в пробелы. Это не всегда желательно и может привести к ухудшению ситуации для людей, которые любят вкладки (обычно на базе Linux). Проблема с вкладкой на самом деле не такая же, как проблема с дополнительными пробелами. Во-вторых, макрос предполагает, что одновременно сохраняется только один файл. Если вы сохраните сразу несколько файлов, он не будет правильно удалять пробелы. Причина проста. Текущий документ считается документом, который вы можете видеть. В-третьих, он не проверяет ошибки в результатах поиска. Эти результаты могут дать больше информации о том, что делать дальше. Например, если пробел не найден и не заменен, нет необходимости сохранять файл снова. В общем, мне не понравилась необходимость глобального флага для сохранения или нет. Это, как правило, просят за проблемы на основе о неизвестных состояниях. Я подозреваю, что флаг был добавлен исключительно для предотвращения бесконечного цикла.

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

    Try
        document.Activate()

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

        'nameresult = document.Name & " " & Str$(result)

        'MsgBox(nameresult, , "Filename and result")

        If result = vsFindResult.vsFindResultReplaced Then
            'MsgBox("Document Saved", MsgBoxStyle.OkOnly, "Saved Macro")
            document.Save()
        Else
            'MsgBox("Document Not Saved", MsgBoxStyle.OkOnly, "Saved Macro")
        End If

    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
    End Try

End Sub

Я добавил отладочные сообщения, чтобы помочь увидеть, что происходит. Это дало понять, что несколько файлов сохранения не работает. Если вы хотите играть с ними, раскомментируйте эти строки.

ключевое отличие заключается в использовании документа.Активировать () для принудительного вывода документа на передний план активного текущего документа. Если результат равен 4, это означает, что текст был заменен. Ноль означает ничего не произошло. Вы увидите два сохранения для каждого файла. Первый заменит, а второй ничего не делает. Потенциально могут возникнуть проблемы, если сохранить не удается записать файл, но, надеюсь, это событие не будет вызвано, если это произойдет.

до исходного сценария я не знал, как сценарии работали в Visual Studio. Немного удивительно, что он использует Visual Basic в качестве основного интерфейса, но он отлично работает для того, что ему нужно сделать.


простое дополнение-удалить возврат каретки во время сохранения.

' Remove all the carriage returns.
result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                             "\x000d\x000a", _
                             vsFindOptions.vsFindOptionsRegularExpression, _
                             "\x000a", _
                             vsFindTarget.vsFindTargetCurrentDocument, , , _
                             vsFindResultsLocation.vsFindResultsNone)

ключом к этой работе является изменение \x000d\x000a на \x000a. Префикс \x указывает на шаблон Юникода. Это позволит автоматизировать процесс получения исходных файлов, готовых для систем Linux.