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

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
120
задан ChrisN 24 September 2016 в 23:53
поделиться

10 ответов

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

1
ответ дан 24 November 2019 в 01:40
поделиться

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

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

0
ответ дан 24 November 2019 в 01:40
поделиться

Можно использовать макрос, любят описанный в пробел Удаления и перезапись комментариев, с помощью regex поиски

3
ответ дан 24 November 2019 в 01:40
поделиться

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

16
ответ дан 24 November 2019 в 01:40
поделиться

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

Добавьте следующее в Модуль 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
ответ дан 24 November 2019 в 01:40
поделиться

Найдите/Замените Регулярные выражения использования

В диалоговом окне Находки и Замены, расширьтесь , Находят Опции , проверяют Использование , выбирают Regular expressions

Find What: ":Zs#$"

Замена : ""

нажимают Replace All

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

71
ответ дан 24 November 2019 в 01:40
поделиться

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

-1
ответ дан 24 November 2019 в 01:40
поделиться

Я думаю, что версия 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
ответ дан 24 November 2019 в 01:40
поделиться

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

' 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.

-1
ответ дан 24 November 2019 в 01:40
поделиться

Основываясь на ответе Dyaus и регулярном выражении из connect report, вот макрос, который обрабатывает сохранение всех, не заменяет табуляции пробелами и не требует статической переменной. Его возможный недостаток? Он кажется немного медленным, возможно, из-за многократных вызовов 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
ответ дан 24 November 2019 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: