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ć?
16 answers
CodeMaid jest bardzo popularnym rozszerzeniem Visual Studio i robi to automatycznie wraz z innymi przydatnymi czyszczeniami.
- Pobierz: https://github.com/codecadwallader/codemaid/releases/tag/v0.4.3
- Modern Download: https://marketplace.visualstudio.com/items?itemName=SteveCadwallader.CodeMaid
- Dokumentacja: http://www.codemaid.net/documentation/#cleaning
Ustawiłem go na czyszczenie pliku w save, co moim zdaniem jest domyślne.
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*$
".
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.Przed zapisaniem możesz użyć skrótu Auto-formatującego CTRL+K+D .
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.
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
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
Możesz użyć makra takiego jak opisane w Usuwanie białych znaków i przepisywanie komentarzy za pomocą wyszukiwań regularnych
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".
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ę.
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
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.
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
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.
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.
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ć.
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.
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