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