it-swarm-ru.tech

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

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

120
ChrisN

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

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

64
arserbin3

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

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

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

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

нажмите Заменить все

В других редакторах (a normal синтаксический анализатор регулярных выражений) ":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, который можно найти с помощью быстрого поиска в Google.

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, где, к сожалению, макросы не поддерживаются. Поэтому я просто копирую/вставляю в Блокнот ++ верхнее левое меню Edit> Blank Operations> Trim Trailing Space, также доступны другие связанные операции. Затем скопируйте/вставьте обратно в Visual Studio.

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

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 Visualizer расширение Visual Studio, которое имеет поддержку обратно через Visual Studio 2012.

1
pwhe23

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

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

0
Marcin Gil

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