Как автоматически удалить конечные пробелы в Visual Studio 2008? - PullRequest
119 голосов
/ 17 сентября 2008

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

Ответы [ 16 ]

1 голос
/ 17 сентября 2008

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

0 голосов
/ 25 апреля 2011

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

Основываясь на ответе Дьяуса и регулярном выражении из отчета о подключении , вот макрос, который обрабатывает сохранение всех, не заменяет табуляции пробелами и не требует статической переменной. Его возможный недостаток? Это кажется немного медленным, возможно, из-за нескольких звонков на 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 голосов
/ 10 марта 2010

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

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

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

0 голосов
/ 11 ноября 2009

Это действительно хороший пример того, как удалить конечные пробелы. Есть несколько вещей, которые я бы изменил в зависимости от того, что я обнаружил с помощью этого макроса. Прежде всего, макрос автоматически преобразует табуляцию в пробелы. Это не всегда желательно и может привести к ухудшению ситуации для людей, которые любят вкладки (как правило, на основе 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

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

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

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

0 голосов
/ 17 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...