开发者工具 · 文本比较
在逐行文本差异中“忽略空白”真正忽略了什么
· 工作原理
文本差异 开发人员工作流程 空白
分解比较可以规范化的空白类型,从前导缩进到内部运行,并警告空白具有含义且不应被忽略的地方。
每一行都改变了,但没有真正改变——打开一个文件,文件从制表符重新缩进到空格,显示为差异之墙
格式化程序将四个空格缩进更改为两个空格,行差异将整个文件绘制为更改后的样子。更改可能是视觉噪音,因此对空白不敏感的视图可以帮助审阅者找到实际的编辑。但“没有空格的相同文本”与“相同程序”不同。在批准配置或源文件之前,将普通视图和规范化视图进行比较。
四种空白差异——分隔前导缩进、尾随空格、内部运行和空行,因为每一种都是由不同的工具或习惯引起的
空白更改发生在多个地方。前导缩进通常来自格式;复制/粘贴的尾随空格;行内重复的空格或制表符可能会分隔单词或列;空行可以划分块。 ToolAcre 的忽略空白选项会修剪每一行并将每个内部空白行折叠为一个空格以进行比较。它不会简单地删除所有空白或将不同的行数视为相同:两个空白行仍然是两个比较单元,除非另一个操作将其删除。
比较之前标准化是如何发生的 - 解释了该选项将每一行转换为规范形式以进行匹配,而您的原始文本就是您所阅读的内容
行键是在匹配之前根据原始文本计算的:trim() 删除前导/尾随空格,正则表达式用一个空格替换内部运行。 diff 算法比较键,但将原始文本保留在显示的行中。在构建 LCS 表之前,公共前缀和后缀会被丢弃,因此大型文档中的小编辑不一定需要将每一行与其他行进行比较。存在 2,000 个不同行的上限,因为动态规划表的两侧长度都会增加。
工作示例:重新缩进的 Python 函数和 YAML 文件 - 显示清理 Python 视图的选项,然后隐藏实际上改变文档结构的 YAML 缩进更改
想象一个 Python 函数,其整个函数体从四个空格变为两个空格,同时保持相同的嵌套级别。忽略缩进可以隐藏格式噪音。在 YAML 中,将键从 services.web 下面移动到 services 下面会更改其父映射,即使在修剪空白后每行的字符都是相同的。在两个片段上运行该选项:Python 视图可能会变得更容易查看,而 YAML 更改可能会消失,尽管更改了数据树。切勿单独使用空白不敏感输出来批准缩进敏感格式。
当空格是数据时 — 列出空格具有含义的格式:YAML、Makefile、Markdown 代码块、固定宽度导出和字符串文字
空格是 YAML 缩进、Makefile 配方、Markdown 代码块和固定宽度导出中的数据。在字符串文字中,替换多个空格可以更改用户可见的文本或正在签名或散列的值。即使具有通常灵活格式的代码也具有空格很重要的上下文:Python 块和 shell here-documents 就是明显的例子。该选项无法推断这些上下文,因为它看到的是简单的线条,而不是语言语法。仅当您了解所比较的文件时才选择它。
结合空格和大小写选项 - 描述启用两者如何缩小与相同顺序的相同字母的比较范围以及隐藏的内容
将“忽略空白”与“忽略大小写”相结合可将匹配范围缩小到其余字母和标点符号一致的行,而无需考虑大小写或间距。这可能会使格式繁重的文档变得安静,但它也可以隐藏更改后的区分大小写的标识符、标头键或文件系统路径。仅当您打开第二个选项时,ToolAcre 才会小写比较键;它仍然显示原始行文本。一次切换一个选项,这样您就可以看到每个选项删除了哪些更改。
这不包括什么——该选项比较标准化后的行;它不会重排段落、检测移动的块或比较丰富文档中的格式
该功能不会重排段落、检测移动的块、比较 HTML 渲染或确定两个程序 AST 是否等效。 ToolAcre 的 diff 是基于行的 LCS 动态规划,具有公共前缀/后缀修剪,而不是一些一般 diff 教程中描述的 Myers 算法。在大型粘贴文件上,它将停止而不是分配无界矩阵。使用语言感知解析器或版本控制审查来进行结构声明。
要点:切换它,不要默认它 - 建议运行两个比较并显示 ToolAcre 的文本比较如何让您为同一对文本打开和关闭空白选项
Toggle 将忽略空格作为视图,而不是默认事实。文本比较会保留您在浏览器中粘贴的所有内容,让您可以比较相同修订版的两个视图,而无需上传合同或配置文件。如果更改在规范化视图中消失,请先询问基础格式是否赋予空白含义,然后再确定它是无害的。