Как автоматически удалить конечные пробелы в Visual Studio 2008?
можно ли настроить Visual Studio 2008 для автоматического удаления пробелов в конце каждой строки при сохранении файла? Кажется, что нет встроенной опции, поэтому есть ли какие-либо расширения, доступные для этого?
16 ответов
CodeMaid является очень популярным расширением Visual Studio и делает это автоматически вместе с другими полезными очистками.
- загрузить:https://github.com/codecadwallader/codemaid/releases/tag/v0.4.3
- Современная Загрузка:https://marketplace.visualstudio.com/items?itemName=SteveCadwallader.CodeMaid
- документация:http://www.codemaid.net/documentation/#cleaning
Я это для очистки файла при сохранении, который я считаю по умолчанию.
найти / заменить с помощью регулярных выражений
в диалоговом окне найти и заменить разверните Найти Варианты, Регистрация использовать выберите регулярные выражения
Найти:":Zs#$
"
заменить на: ""
клик Заменить Все
в других редакторах (a нормальный анализатор регулярных выражений)":Zs#$
" будет "\s*$
".
вы можете создать макрос, который выполняется после сохранения, чтобы сделать это для вас.
добавьте следующее В модуль 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.
вы можете сделать это легко с этих трех действий:
Ctrl + A (выделить весь текст)
Изменить - > Дополнительно - > Удалить Горизонтальные Пробелы
Редактировать - > Дополнительно - > Выбор Формата
подождите несколько секунд и готово.
Это Ctrl + Z'в состоянии, если что-то пошло не так.
принимая элементы из всех уже данных ответов, вот код, который я закончил. (Я в основном пишу код на 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
вы можете использовать макрос как описано в удаление пробелов и перезапись комментариев, используя regex searches
Я использую VWD 2010 Express, где макросы не поддерживаются, к сожалению. Поэтому я просто копирую / вставляю в Блокнот++ верхнее левое меню Edit
>Blank Operations
>Trim Trailing Space
доступны и другие связанные операции. Затем скопируйте / вставьте обратно в Visual Studio.
можно использовать NetBeans вместо Notepad++, который имеет " удалить конечные пробелы "в меню" Источник".
Если это не проект для одного человека, не делайте этого. Это должно быть тривиально, чтобы отличить ваши локальные файлы от вашего репозитория исходного кода, и очистка пробелов изменит строки, которые вам не нужно менять. Я полностью понимаю; я люблю, чтобы мои пробелы все единообразные – но это то, что вы должны отказаться ради более чистого сотрудничества.
думаю, что Джефф Мьюир версия может быть немного улучшена, если она только обрезает файлы исходного кода (в моем случае C#, но легко добавить больше расширений). Также я добавил проверку, чтобы убедиться, что окно документа видно, потому что некоторые ситуации без этой проверки показывают мне странные ошибки (LINQ to SQL files '*.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
Я лично люблю Пробельный Визуализатор расширение Visual Studio, которое имеет поддержку через Visual Studio 2012.
Я думаю, что у меня есть версия этого макроса, которая не будет сбой 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
Я использую ArtisticStyle (C++) для этого, а также переформатировать мой код. Однако я должен был добавить это как внешний инструмент, и вам нужно запустить его самостоятельно, чтобы вам это не понравилось.
тем не менее, я считаю отличным, что я могу переформатировать код более пользовательским способом (например, параметры многострочной функции), чтобы я мог заплатить цену за его запуск вручную. Инструмент является бесплатным.
основываясь на ответе Дьяуса и регулярном выражении от отчет о подключении, вот макрос, который обрабатывает сохранить все, не заменяет вкладки пробелами и не требует статической переменной. Его возможный недостаток? Это кажется немного медленным, возможно из-за нескольких вызовов 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?$)
(Не забудьте избежать обратных косых черт, если необходимый.) Я приехал сюда после нескольких тщетных попыток исправить проблемы с конвертация RAW of {:b}+$
не соответствует возврату каретки.
Это действительно хороший пример того, как удалить конечные пробелы. Есть несколько вещей, которые я бы изменил на основе того, что я обнаружил с помощью этого макроса. Прежде всего, макрос автоматически преобразует вкладки в пробелы. Это не всегда желательно и может привести к ухудшению ситуации для людей, которые любят вкладки (обычно на базе 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
Я добавил отладочные сообщения, чтобы помочь увидеть, что происходит. Это дало понять, что несколько файлов сохранения не работает. Если вы хотите играть с ними, раскомментируйте эти строки.
ключевое отличие заключается в использовании документа.Активировать () для принудительного вывода документа на передний план активного текущего документа. Если результат равен 4, это означает, что текст был заменен. Ноль означает ничего не произошло. Вы увидите два сохранения для каждого файла. Первый заменит, а второй ничего не делает. Потенциально могут возникнуть проблемы, если сохранить не удается записать файл, но, надеюсь, это событие не будет вызвано, если это произойдет.
до исходного сценария я не знал, как сценарии работали в Visual Studio. Немного удивительно, что он использует Visual Basic в качестве основного интерфейса, но он отлично работает для того, что ему нужно сделать.
простое дополнение-удалить возврат каретки во время сохранения.
' 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.