这是一个很好的例子,说明如何删除尾随空格。根据我使用此宏的发现,我会更改一些内容。首先,宏自动将制表符转换为空格。这并不总是可取的,并且可能导致喜欢标签的人(通常基于 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 作为主界面有点令人惊讶,但它可以很好地完成它需要做的事情。