如何自动删除Visual Studio 2008中的尾随空白?

是否可以configurationVisual Studio 2008以保存文件时自动删除每行末尾的空格字符? 似乎没有内置选项,那么有没有可用的扩展来做到这一点?

CodeMaid是一个非常stream行的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

我把它设置为清理保存的文件,我相信这是默认的。

使用正则expression式查找/replace

在查找和replace对话框中,展开查找选项 ,选中使用 ,select正则expression式

找什么 :“ :Zs#$

replace为 :“”

单击全部replace

在其他编辑器( 正常的正则expression式parsing器)“ :Zs#$ ”将是“ \s*$ ”。

您可以创build一个保存后执行的macros来为您执行此操作。

将以下内容添加到您的macros的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 

我已经使用了一段时间没有任何问题。 我没有创buildmacros,但从ace_guidelines.vsmacros中可以通过快速的谷歌searchfind它。

在保存之前,您可以使用自动格式快捷键CTRL + K + D。

您可以通过以下三个操作轻松完成此操作:

  • Ctrl + A (全选文本)

  • 编辑 – >高级 – >删除水平空白

  • 编辑 – >高级 – >格式select

等待几秒钟完成。

这是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 

你可以像使用regexsearch去除空白和重写注释中所描述的那样使用macros

除非这是一个人的项目,否则不要这样做。 将本地文件与源代码存储库区分开来是很简单的,清除空白将会改变你不需要改变的行。 我完全明白 我喜欢让所有的空白都统一 – 但是为了更清晰的协作,这是你应该放弃的。

我认为如果仅仅修剪源代码文件(在我的情况下是C#,但是很容易添加更多的扩展),那么Jeff Muir版本可能会有所改进。 此外,我添加了一个检查,以确保文档窗口是可见的,因为没有检查的情况下显示我奇怪的错误(例如LINQ to SQL文件* .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 

不幸的是,我正在使用不支持macros的VWD 2010 Express。 所以我只是复制/粘贴到记事本++左上方菜单Edit > Blank Operations > Trim Trailing Space还有其他相关的操作。 然后复制/粘贴回Visual Studio。

也可以使用NetBeans而不是Notepad ++,它在“Source”菜单下有“Remove trailing spaces”。

我想我有这个macros的版本,不会在重构时崩溃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 ++)来做到这一点,并重新格式化我的代码。 不过,我不得不把这个作为一个外部工具join,你需要自己触发它,所以你可能不喜欢它。

不过,我觉得非常好,我可以用更自定义的方式(例如,多行函数参数)重新格式化代码,我可以支付手动运行代码的代价。 该工具是免费的。

基于Dyaus的回答和来自连接报告的正则expression式,下面是一个处理全部保存的macros,不会用空格replace制表符,也不需要静态variables。 其可能的缺点? 这似乎有点慢,也许是由于多次调用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加载项中使用这个,我最终使用的正则expression式是[ \t]+(?=\r?$) (如果有必要,不要忘记转义反斜杠)。 我经过几次徒劳无功的尝试,以{:b}+$ 原始转换无法匹配回车符来解决问题。

我个人喜欢通过Visual Studio 2012支持的拖尾空白Visualizer Visual Studio扩展。

这是如何删除尾随空白的一个很好的例子。 有几件事我会根据我发现的这个macros来改变。 首先,macros自动将制表符转换为空格。 这并不总是可取的,并可能导致爱标签的人(通常是基于Linux的)变得更糟糕。 标签问题不是真的和额外的空白问题一样。 其次,macros只假定只有一个文件正在被保存。 如果一次保存多个文件,将无法正确删除空格。 原因很简单。 目前的文件被认为是你可以看到的文件。 第三,检查结果没有错误。 这些结果可以为下一步做什么提供更好的情报。 例如,如果没有find并replace空白,则不需要再次保存该文件。 一般来说,我不喜欢全球的国旗被保存或不需要。 它倾向于根据未知的状态来请求麻烦。 我怀疑这个标志只是为了防止无限循环而添加的。

  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 

我添加了debugging消息框来帮助看看发生了什么。 这很清楚,多个文件保存不起作用。 如果你想玩他们,取消注释这些线。

关键的区别是使用document.Activate()强制文档进入前台活动的当前文档。 如果结果是4,那就意味着文本被replace了。 零意味着什么都没发生 你会看到每个文件的两个保存。 第一个将取代,第二个将无能为力。 如果保存不能写入文件,可能会有麻烦,但希望如果发生这个事件不会被调用。

在原始脚本之前,我并不知道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前缀表示一个Unicode模式。 这将自动完成为Linux系统准备源文件的过程。