Jak automatycznie usunąć końcowe białe znaki w Visual Studio 2008?

Czy możliwe jest skonfigurowanie programu Visual Studio 2008 tak, aby automatycznie usuwał białe znaki na końcu każdej linii podczas zapisywania pliku? Wydaje się, że nie ma wbudowanej opcji, więc czy są dostępne jakieś rozszerzenia, które mogą to zrobić?

Author: ChrisN, 2008-09-17

16 answers

CodeMaid jest bardzo popularnym rozszerzeniem Visual Studio i robi to automatycznie wraz z innymi przydatnymi czyszczeniami.

Ustawiłem go na czyszczenie pliku w save, co moim zdaniem jest domyślne.

 64
Author: arserbin3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-11 18:32:50

Znajdź / Zastąp za pomocą wyrażeń regularnych

W oknie dialogowym znajdź i zamień rozwiń Znajdź Opcje, zaznacz Użyj, Wybierz wyrażenia regularne

Znajdź Co: ":Zs#$"

Zastąp przez: ""

Kliknij Zastąp Wszystkie

W innych edytorach (a normal Regular Expression parser) ":Zs#$" będzie "\s*$".

 69
Author: Greg Ogle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 13:33:57

Możesz utworzyć makro, które wykonuje się po zapisie, aby to zrobić za Ciebie.

Dodaj następujące elementy do modułu EnvironmentEvents dla swoich makr.

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
Używam tego od jakiegoś czasu bez żadnych problemów. Nie stworzyłem makra, ale zmodyfikowałem go z tego w ace_guidelines.vsmacros, które można znaleźć za pomocą szybkiego wyszukiwania google.
 31
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-30 17:40:33

Przed zapisaniem możesz użyć skrótu Auto-formatującego CTRL+K+D .

 16
Author: Vyrotek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-12 14:01:11

Możesz to zrobić łatwo za pomocą tych trzech działań:

  • Ctrl + A (Zaznacz cały tekst)

  • Edit -> Advanced - > Delete Horizontal Whitespace

  • Edycja - > Zaawansowane - > Wybór Formatu

Poczekaj kilka sekund i gotowe.

To Ctrl + z 'able w razie gdyby coś poszło nie tak.

 9
Author: iPixel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 16:53:42

Biorąc pod uwagę wszystkie odpowiedzi, oto kod, z którym skończyłem. (Piszę głównie kod C++, ale łatwo jest sprawdzić różne rozszerzenia plików, w razie potrzeby.)

Dziękujemy wszystkim, którzy przyczynili się do tego!

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
Author: ChrisN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-16 13:05:59
 3
Author: Jorge Ferreira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 16:46:36

Używam VWD Express, gdzie makra nie są niestety obsługiwane. Więc po prostu skopiuj/wklej do Notepad++ górne lewe menu Edit > Blank Operations > Trim Trailing Space dostępne są również inne powiązane operacje. Następnie skopiuj/wklej z powrotem do Visual Studio.

Można również użyć NetBeans zamiast Notepad++, który ma "Usuń końcowe spacje "w menu" Źródło".

 2
Author: Evgenii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-17 14:18:26

Jeśli nie jest to projekt jednoosobowy, nie rób tego. To musi być trywialne, aby odróżnić swoje lokalne pliki od repozytorium kodu źródłowego, a wyczyszczenie białych znaków zmieniłoby linie, których nie trzeba zmieniać. Całkowicie rozumiem; uwielbiam, aby moje białe przestrzenie były jednolite – ale to jest coś, z czego powinieneś zrezygnować ze względu na czystszą współpracę.

 1
Author: Kevin Conner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 13:25:05

Myślę, że Wersja Jeffa Muira mogłaby być nieco ulepszona, gdyby tylko przycinała pliki kodu źródłowego (w moim przypadku C#, ale łatwo jest dodać więcej rozszerzeń). Ponadto dodałem sprawdzenie, aby upewnić się, że okno dokumentu jest widoczny, ponieważ niektóre sytuacje bez tego sprawdzenia pokazują mi dziwne błędy (LINQ do plików SQL'*.dbml", na przykład).

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
Author: David Abella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 16:51:09

Ja osobiście uwielbiam Wizualizator odstępów końcowych rozszerzenie Visual Studio, które obsługuje Visual Studio 2012.

 1
Author: pwhe23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 19:28:51

Myślę, że mam wersję tego makra, która nie zawiesi VS2010 na refactor, a także nie zawiesi IDE podczas zapisywania plików nietekstowych. Spróbuj tego:

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
Author: Julian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-25 07:01:20

Używam ArtisticStyle (C++), aby to zrobić, a także sformatować mój kod. Musiałem jednak dodać to jako zewnętrzne narzędzie i musisz je uruchomić samodzielnie, aby ci się nie spodobało.

Uważam jednak za doskonałe, że mogę sformatować kod w bardziej niestandardowy sposób (na przykład parametry funkcji wielowierszowych), że mogę zapłacić cenę ręcznego uruchamiania. Narzędzie jest bezpłatne.

 0
Author: Marcin Gil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 16:48:05

Bazując na odpowiedzi Dyausa i wyrażeniu regularnym z raportu connect, Oto makro, które obsługuje save all, nie zastępuje tabulatorów spacjami i nie wymaga zmiennej statycznej. Jego ewentualny minus? Wydaje się to trochę powolne, być może ze względu na wielokrotne wywołania do 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

Dla każdego, kto próbuje użyć tego w dodatku Visual Studio 2012, Wyrażenie regularne, którego użyłem, to [ \t]+(?=\r?$) (nie zapomnij, jeśli to konieczne, uciec od ukośników wstecznych). Przybyłem tutaj. po kilku daremnych próbach rozwiązania problemów z nieprzetworzoną konwersją z {:b}+$ nie dopasowującą się do powrotu karetki.

 0
Author: Michael Urman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-15 13:14:02

To jest naprawdę dobry przykład jak usunąć końcowe spacje. Jest kilka rzeczy, które chciałbym zmienić w oparciu o to, co odkryłem za pomocą tego makra. Przede wszystkim makro automatycznie konwertuje karty na spacje. Nie zawsze jest to pożądane i może prowadzić do pogorszenia sytuacji osób, które kochają karty (zazwyczaj oparte na Linuksie). Problem z zakładką nie jest tak naprawdę taki sam jak dodatkowy problem z białymi znakami. Po drugie, makro zakłada, że jednocześnie zapisywany jest tylko jeden plik. Jeśli zapisujesz wiele plików na raz, nie usunie to poprawnie białych znaków. Powód jest prosty. Bieżący dokument jest uważany za dokument, który możesz zobaczyć. Po trzecie, nie sprawdza błędów w wynikach wyszukiwania. Wyniki te mogą dać lepszą wiedzę o tym, co robić dalej. Na przykład, jeśli białe znaki nie zostaną znalezione i zastąpione, nie ma potrzeby ponownego zapisywania pliku. Ogólnie rzecz biorąc, nie podobało mi się, że globalna flaga jest zapisywana lub nie. Ma tendencję do zadawania kłopotów w oparciu o nieznane Stany. Podejrzewam, że flaga została dodana tylko po to, aby zapobiec nieskończonej pętli.

    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

Dodałem pola wiadomości debugowania, aby pomóc zobaczyć, co się dzieje. To bardzo jasne, że wiele zapisywanie plików nie działa. Jeśli chcesz się nimi pobawić, odkomentuj te linie.

Kluczową różnicą jest użycie dokumentu.Activate (), aby wymusić przeniesienie dokumentu na pierwszy plan aktywny bieżący dokument. Jeśli wynikiem jest 4, oznacza to, że tekst został zastąpiony. Zero oznacza, że nic się nie stało. Zobaczysz dwa zapisy dla każdego pliku. Pierwszy zastąpi, a drugi nic nie zrobi. Potencjalnie mogą wystąpić problemy, jeśli zapis nie może zapisać pliku, ale miejmy nadzieję, że to zdarzenie nie zostanie wywołane, jeśli tak się stanie.

Zanim powstał oryginalny scenariusz, nie wiedziałem, jak działa skrypt w Visual Studio. Nieco zaskakujące jest to, że używa Visual Basic jako głównego interfejsu, ale działa dobrze do tego, co musi zrobić.

 -1
Author: Jeff Muir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-11 03:29:02

Prostym dodatkiem jest usunięcie zwrotów karetki podczas zapisywania.

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

Kluczem do tego działania jest zmiana \x000d \ x000a na \x000a. prefiks \x wskazuje wzorzec Unicode. Zautomatyzuje to proces przygotowania plików źródłowych dla Systemów Linux.

 -1
Author: Jeff Muir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-10 07:31:06